From 60f681460f53bdbfc9899a63bb4fcfbd1f062e31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Johana=20Sup=C3=ADkov=C3=A1?= <johana.supikova@seznam.cz>
Date: Wed, 7 Jun 2023 10:45:44 +0200
Subject: [PATCH] initial changes

---
 .idea/.gitignore                              |    8 +
 License.txt => LICENSE                        |    0
 Readme.md                                     |   91 +-
 __init__.py                                   |    0
 cachet_shodan_credits                         |  133 -
 check_execute                                 |   85 -
 check_filechk                                 |  190 --
 check_logcourier                              |  590 ----
 check_mdstat                                  |  130 -
 check_nginx_status => check_nginx_status.py   |  329 +-
 check_nmap                                    |  567 ----
 check_psinfo                                  | 1516 ---------
 check_psinfo.md                               |   50 -
 check_redis                                   |  314 --
 check_script_procs.sh                         |  104 -
 check_selenium                                |  224 --
 check_selenium.README                         |   80 -
 check_shodan_credits                          |  175 -
 check_snort                                   |  542 ---
 check_snort.README                            |  522 ---
 contrib/psutil-0.2.1/CREDITS                  |   56 -
 contrib/psutil-0.2.1/HISTORY                  |  193 --
 contrib/psutil-0.2.1/LICENSE                  |   27 -
 contrib/psutil-0.2.1/MANIFEST.in              |    9 -
 contrib/psutil-0.2.1/PKG-INFO                 |   41 -
 contrib/psutil-0.2.1/README                   |  120 -
 contrib/psutil-0.2.1/docs/class_diagram.dia   | 1475 ---------
 contrib/psutil-0.2.1/docs/class_diagram.png   |  Bin 66252 -> 0 bytes
 contrib/psutil-0.2.1/docs/documentation.html  |  120 -
 contrib/psutil-0.2.1/docs/index.html          |   99 -
 contrib/psutil-0.2.1/docs/milestones.lnk.html |   12 -
 contrib/psutil-0.2.1/psutil/__init__.py       |  661 ----
 contrib/psutil-0.2.1/psutil/_common.py        |   61 -
 contrib/psutil-0.2.1/psutil/_compat.py        |  130 -
 contrib/psutil-0.2.1/psutil/_psbsd.py         |  204 --
 contrib/psutil-0.2.1/psutil/_pslinux.py       |  586 ----
 contrib/psutil-0.2.1/psutil/_psmswindows.py   |  270 --
 contrib/psutil-0.2.1/psutil/_psosx.py         |  208 --
 contrib/psutil-0.2.1/psutil/_psposix.py       |  293 --
 contrib/psutil-0.2.1/psutil/_psutil_bsd.c     |  764 -----
 contrib/psutil-0.2.1/psutil/_psutil_bsd.h     |   35 -
 contrib/psutil-0.2.1/psutil/_psutil_common.c  |   35 -
 contrib/psutil-0.2.1/psutil/_psutil_common.h  |    9 -
 contrib/psutil-0.2.1/psutil/_psutil_linux.c   |  166 -
 contrib/psutil-0.2.1/psutil/_psutil_linux.h   |   11 -
 .../psutil-0.2.1/psutil/_psutil_mswindows.c   | 1938 -----------
 .../psutil-0.2.1/psutil/_psutil_mswindows.h   |   49 -
 contrib/psutil-0.2.1/psutil/_psutil_osx.c     | 1070 ------
 contrib/psutil-0.2.1/psutil/_psutil_osx.h     |   33 -
 contrib/psutil-0.2.1/psutil/_psutil_posix.c   |  138 -
 contrib/psutil-0.2.1/psutil/_psutil_posix.h   |   11 -
 .../psutil/arch/bsd/process_info.c            |  266 --
 .../psutil/arch/bsd/process_info.h            |   17 -
 .../psutil/arch/mswindows/ntextapi.h          |  178 -
 .../psutil/arch/mswindows/process_handles.c   |  295 --
 .../psutil/arch/mswindows/process_handles.h   |    4 -
 .../psutil/arch/mswindows/process_info.c      |  522 ---
 .../psutil/arch/mswindows/process_info.h      |   25 -
 .../psutil/arch/mswindows/security.c          |  233 --
 .../psutil/arch/mswindows/security.h          |   16 -
 .../psutil/arch/osx/process_info.c            |  250 --
 .../psutil/arch/osx/process_info.h            |   17 -
 contrib/psutil-0.2.1/psutil/error.py          |   70 -
 contrib/psutil-0.2.1/setup.py                 |  129 -
 contrib/psutil-0.2.1/test/_bsd.py             |  145 -
 contrib/psutil-0.2.1/test/_linux.py           |   45 -
 contrib/psutil-0.2.1/test/_osx.py             |   64 -
 contrib/psutil-0.2.1/test/_posix.py           |  152 -
 contrib/psutil-0.2.1/test/_windows.py         |  162 -
 .../psutil-0.2.1/test/test_memory_leaks.py    |  191 --
 contrib/psutil-0.2.1/test/test_psutil.py      | 1326 --------
 contrib/psutil-0.6.1/CREDITS                  |  119 -
 contrib/psutil-0.6.1/HISTORY                  |  463 ---
 contrib/psutil-0.6.1/INSTALL                  |  110 -
 contrib/psutil-0.6.1/LICENSE                  |   27 -
 contrib/psutil-0.6.1/MANIFEST.in              |    9 -
 contrib/psutil-0.6.1/PKG-INFO                 |  252 --
 contrib/psutil-0.6.1/README                   |  208 --
 contrib/psutil-0.6.1/examples/disk_usage.py   |   48 -
 contrib/psutil-0.6.1/examples/free.py         |   33 -
 contrib/psutil-0.6.1/examples/iotop.py        |  161 -
 contrib/psutil-0.6.1/examples/killall.py      |   33 -
 contrib/psutil-0.6.1/examples/meminfo.py      |   33 -
 contrib/psutil-0.6.1/examples/netstat.py      |   52 -
 contrib/psutil-0.6.1/examples/nettop.py       |  144 -
 contrib/psutil-0.6.1/examples/pmap.py         |   37 -
 .../psutil-0.6.1/examples/process_detail.py   |  134 -
 contrib/psutil-0.6.1/examples/top.py          |  200 --
 contrib/psutil-0.6.1/examples/who.py          |   32 -
 contrib/psutil-0.6.1/psutil.egg-info/PKG-INFO |  252 --
 .../psutil-0.6.1/psutil.egg-info/SOURCES.txt  |   61 -
 .../psutil.egg-info/dependency_links.txt      |    1 -
 .../psutil.egg-info/top_level.txt             |    3 -
 contrib/psutil-0.6.1/psutil/__init__.py       | 1195 -------
 contrib/psutil-0.6.1/psutil/__init__.pyc      |  Bin 38539 -> 0 bytes
 contrib/psutil-0.6.1/psutil/_common.py        |  193 --
 contrib/psutil-0.6.1/psutil/_common.pyc       |  Bin 6810 -> 0 bytes
 contrib/psutil-0.6.1/psutil/_compat.py        |  270 --
 contrib/psutil-0.6.1/psutil/_compat.pyc       |  Bin 9098 -> 0 bytes
 contrib/psutil-0.6.1/psutil/_psbsd.py         |  328 --
 contrib/psutil-0.6.1/psutil/_pslinux.py       | 1011 ------
 contrib/psutil-0.6.1/psutil/_pslinux.pyc      |  Bin 29038 -> 0 bytes
 contrib/psutil-0.6.1/psutil/_psmswindows.py   |  423 ---
 contrib/psutil-0.6.1/psutil/_psosx.py         |  293 --
 contrib/psutil-0.6.1/psutil/_psposix.py       |  118 -
 contrib/psutil-0.6.1/psutil/_psposix.pyc      |  Bin 3393 -> 0 bytes
 contrib/psutil-0.6.1/psutil/_psutil_bsd.c     | 1777 ----------
 contrib/psutil-0.6.1/psutil/_psutil_bsd.h     |   52 -
 contrib/psutil-0.6.1/psutil/_psutil_common.c  |   39 -
 contrib/psutil-0.6.1/psutil/_psutil_common.h  |   13 -
 contrib/psutil-0.6.1/psutil/_psutil_linux.c   |  338 --
 contrib/psutil-0.6.1/psutil/_psutil_linux.h   |   19 -
 .../psutil-0.6.1/psutil/_psutil_mswindows.c   | 2904 -----------------
 .../psutil-0.6.1/psutil/_psutil_mswindows.h   |   69 -
 contrib/psutil-0.6.1/psutil/_psutil_osx.c     | 1792 ----------
 contrib/psutil-0.6.1/psutil/_psutil_osx.h     |   44 -
 contrib/psutil-0.6.1/psutil/_psutil_posix.c   |  134 -
 contrib/psutil-0.6.1/psutil/_psutil_posix.h   |   14 -
 .../psutil/arch/bsd/process_info.c            |  271 --
 .../psutil/arch/bsd/process_info.h            |   21 -
 .../psutil/arch/mswindows/ntextapi.h          |  232 --
 .../psutil/arch/mswindows/process_handles.c   |  322 --
 .../psutil/arch/mswindows/process_handles.h   |   12 -
 .../psutil/arch/mswindows/process_info.c      |  510 ---
 .../psutil/arch/mswindows/process_info.h      |   25 -
 .../psutil/arch/mswindows/security.c          |  240 --
 .../psutil/arch/mswindows/security.h          |   20 -
 .../psutil/arch/osx/process_info.c            |  295 --
 .../psutil/arch/osx/process_info.h            |   22 -
 contrib/psutil-0.6.1/psutil/error.py          |   73 -
 contrib/psutil-0.6.1/psutil/error.pyc         |  Bin 2621 -> 0 bytes
 contrib/psutil-0.6.1/setup.py                 |  159 -
 contrib/psutil-0.6.1/test/_bsd.py             |  200 --
 contrib/psutil-0.6.1/test/_linux.py           |  122 -
 contrib/psutil-0.6.1/test/_osx.py             |  154 -
 contrib/psutil-0.6.1/test/_posix.py           |  183 --
 contrib/psutil-0.6.1/test/_windows.py         |  368 ---
 .../psutil-0.6.1/test/test_memory_leaks.py    |  325 --
 contrib/psutil-0.6.1/test/test_psutil.py      | 1946 -----------
 contrib/selenium_python_client.tar.gz         |  Bin 20031 -> 0 bytes
 .../check_ningx_status-active_conns.png       |  Bin 357724 -> 0 bytes
 screenshots/check_ningx_status-rps.png        |  Bin 352462 -> 0 bytes
 setup.cfg                                     |    3 +
 143 files changed, 223 insertions(+), 37299 deletions(-)
 create mode 100644 .idea/.gitignore
 rename License.txt => LICENSE (100%)
 create mode 100644 __init__.py
 delete mode 100755 cachet_shodan_credits
 delete mode 100755 check_execute
 delete mode 100755 check_filechk
 delete mode 100755 check_logcourier
 delete mode 100755 check_mdstat
 rename check_nginx_status => check_nginx_status.py (65%)
 delete mode 100755 check_nmap
 delete mode 100755 check_psinfo
 delete mode 100644 check_psinfo.md
 delete mode 100755 check_redis
 delete mode 100755 check_script_procs.sh
 delete mode 100755 check_selenium
 delete mode 100644 check_selenium.README
 delete mode 100755 check_shodan_credits
 delete mode 100755 check_snort
 delete mode 100644 check_snort.README
 delete mode 100644 contrib/psutil-0.2.1/CREDITS
 delete mode 100644 contrib/psutil-0.2.1/HISTORY
 delete mode 100644 contrib/psutil-0.2.1/LICENSE
 delete mode 100644 contrib/psutil-0.2.1/MANIFEST.in
 delete mode 100644 contrib/psutil-0.2.1/PKG-INFO
 delete mode 100644 contrib/psutil-0.2.1/README
 delete mode 100644 contrib/psutil-0.2.1/docs/class_diagram.dia
 delete mode 100755 contrib/psutil-0.2.1/docs/class_diagram.png
 delete mode 100644 contrib/psutil-0.2.1/docs/documentation.html
 delete mode 100644 contrib/psutil-0.2.1/docs/index.html
 delete mode 100644 contrib/psutil-0.2.1/docs/milestones.lnk.html
 delete mode 100644 contrib/psutil-0.2.1/psutil/__init__.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_common.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_compat.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psbsd.py
 delete mode 100755 contrib/psutil-0.2.1/psutil/_pslinux.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psmswindows.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psosx.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psposix.py
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_bsd.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_bsd.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_common.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_common.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_linux.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_linux.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_mswindows.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_mswindows.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_osx.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_osx.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_posix.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/_psutil_posix.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/bsd/process_info.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/bsd/process_info.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/ntextapi.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/security.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/mswindows/security.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/osx/process_info.c
 delete mode 100644 contrib/psutil-0.2.1/psutil/arch/osx/process_info.h
 delete mode 100644 contrib/psutil-0.2.1/psutil/error.py
 delete mode 100644 contrib/psutil-0.2.1/setup.py
 delete mode 100644 contrib/psutil-0.2.1/test/_bsd.py
 delete mode 100644 contrib/psutil-0.2.1/test/_linux.py
 delete mode 100644 contrib/psutil-0.2.1/test/_osx.py
 delete mode 100755 contrib/psutil-0.2.1/test/_posix.py
 delete mode 100644 contrib/psutil-0.2.1/test/_windows.py
 delete mode 100644 contrib/psutil-0.2.1/test/test_memory_leaks.py
 delete mode 100644 contrib/psutil-0.2.1/test/test_psutil.py
 delete mode 100644 contrib/psutil-0.6.1/CREDITS
 delete mode 100644 contrib/psutil-0.6.1/HISTORY
 delete mode 100644 contrib/psutil-0.6.1/INSTALL
 delete mode 100644 contrib/psutil-0.6.1/LICENSE
 delete mode 100644 contrib/psutil-0.6.1/MANIFEST.in
 delete mode 100644 contrib/psutil-0.6.1/PKG-INFO
 delete mode 100644 contrib/psutil-0.6.1/README
 delete mode 100644 contrib/psutil-0.6.1/examples/disk_usage.py
 delete mode 100644 contrib/psutil-0.6.1/examples/free.py
 delete mode 100644 contrib/psutil-0.6.1/examples/iotop.py
 delete mode 100644 contrib/psutil-0.6.1/examples/killall.py
 delete mode 100644 contrib/psutil-0.6.1/examples/meminfo.py
 delete mode 100644 contrib/psutil-0.6.1/examples/netstat.py
 delete mode 100644 contrib/psutil-0.6.1/examples/nettop.py
 delete mode 100644 contrib/psutil-0.6.1/examples/pmap.py
 delete mode 100644 contrib/psutil-0.6.1/examples/process_detail.py
 delete mode 100644 contrib/psutil-0.6.1/examples/top.py
 delete mode 100644 contrib/psutil-0.6.1/examples/who.py
 delete mode 100644 contrib/psutil-0.6.1/psutil.egg-info/PKG-INFO
 delete mode 100644 contrib/psutil-0.6.1/psutil.egg-info/SOURCES.txt
 delete mode 100644 contrib/psutil-0.6.1/psutil.egg-info/dependency_links.txt
 delete mode 100644 contrib/psutil-0.6.1/psutil.egg-info/top_level.txt
 delete mode 100644 contrib/psutil-0.6.1/psutil/__init__.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/__init__.pyc
 delete mode 100644 contrib/psutil-0.6.1/psutil/_common.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_common.pyc
 delete mode 100644 contrib/psutil-0.6.1/psutil/_compat.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_compat.pyc
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psbsd.py
 delete mode 100755 contrib/psutil-0.6.1/psutil/_pslinux.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_pslinux.pyc
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psmswindows.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psosx.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psposix.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psposix.pyc
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_bsd.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_bsd.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_common.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_common.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_linux.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_linux.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_mswindows.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_mswindows.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_osx.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_osx.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_posix.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/_psutil_posix.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/bsd/process_info.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/bsd/process_info.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/ntextapi.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/security.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/mswindows/security.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/osx/process_info.c
 delete mode 100644 contrib/psutil-0.6.1/psutil/arch/osx/process_info.h
 delete mode 100644 contrib/psutil-0.6.1/psutil/error.py
 delete mode 100644 contrib/psutil-0.6.1/psutil/error.pyc
 delete mode 100644 contrib/psutil-0.6.1/setup.py
 delete mode 100644 contrib/psutil-0.6.1/test/_bsd.py
 delete mode 100644 contrib/psutil-0.6.1/test/_linux.py
 delete mode 100644 contrib/psutil-0.6.1/test/_osx.py
 delete mode 100755 contrib/psutil-0.6.1/test/_posix.py
 delete mode 100644 contrib/psutil-0.6.1/test/_windows.py
 delete mode 100644 contrib/psutil-0.6.1/test/test_memory_leaks.py
 delete mode 100644 contrib/psutil-0.6.1/test/test_psutil.py
 delete mode 100644 contrib/selenium_python_client.tar.gz
 delete mode 100644 screenshots/check_ningx_status-active_conns.png
 delete mode 100644 screenshots/check_ningx_status-rps.png
 create mode 100644 setup.cfg

diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/License.txt b/LICENSE
similarity index 100%
rename from License.txt
rename to LICENSE
diff --git a/Readme.md b/Readme.md
index c6dc0aa..a47ff42 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,88 +1,27 @@
-# Dogtown-Nagios-Plugins 
+# Dogtown-Nagios-Plugins
 
 (c) copyright 2008-2018 dogtown@mare-system.de
 
-
-these plugins are developed and tested using FreeBSD, Debian, SLES
-and RedHat but should work on any modern Unix.
-
-for help see $check_plugin.Readme, if available, or 
-execute $check_plugin -h 
-
+Original [plugins](https://bitbucket.org/maresystem/dogtown-nagios-plugins/src) were forked
+and the check_nginx_status plugin is modified by Perun team to be compatible with Python version 3.
 
 # Included Plugins
 
-- check_logcourier - checks the state of log-courier, an alternate logshipper for logstash
-- check_psinfo - get all kinds of processinfo like cpu/mem/running procs - info, net_conns etc
 - check_nginx_status - extract and monitor values from nginx_status_page
-- check_mdstat - check status on linux softraid, also alerts on autmated rebuilds
-- check_selenium - extract runtime/status-values from selenium-tests
-- check_redis - checks and monitors values on a redis_server
-- check_shodan_credits - checks how many credits available on a certain account
-- cachet_shodan_credits - sends status-report to cachet-metric
-
-
-
-
-## obsolete / not maintained anymore
-
-- check_snort - extract and monitor values from snort-databases
-- check_filecheck - yet another file/dircheck-plugin
-- check_nmap - monitor nmap - runs against hosts/networks (if yout think this plugin/functionality
-  is usefull you might want to check [Dr. Portscan](https://git.lrz.de/?p=DrPortScan.git)
-
-
-# Installation
-
-- download / extract the repo
- - [Bitbucket ](https://bitbucket.org/maresystem/dogtown-nagios-plugins/src)
- - [download tar.gz](https://bitbucket.org/maresystem/dogtown-nagios-plugins/get/master.tar.gz) 
- - [download zip](https://bitbucket.org/maresystem/dogtown-nagios-plugins/get/master.zip)
-
-~~~
-
-    git clone https://bitbucket.org/maresystem/dogtown-nagios-plugins.git
-    
-    wget -O dogtown-nagios-plugins.tar.gz https://bitbucket.org/maresystem/dogtown-nagios-plugins/get/master.tar.gz
-    
-    
-~~~
-
-- copy plugins to your local nagios-plugins-dir
-- find infos / help in check_plugin.Readme or execute 
-
-~~~ check_plugin -h ~~~
-
-- config-examples might be found in the header of each plugin
-- test / run them through nrpe or locally
-
-# Requirements 
-
-these plugins are either bash-based shellscripts or python-scripts
-and should work on python 2.5-2.x (but havent been tested
-on python 3.x) and are well-tested on linux (mainly debian, sles and 
-redhat)
-
-for some plugins like check_psinfo / check_selenium you might need to 
-install some more modules; you'll find those in contrib/. 
-any other required python-lib should be installed using your preferred 
-package-manager.
-
 
+# License:
 
-# License: 
+- see LICENSE:
 
-- see License.txt
-    
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU General Public License
+  along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/cachet_shodan_credits b/cachet_shodan_credits
deleted file mode 100755
index db306b1..0000000
--- a/cachet_shodan_credits
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env python
-# (c) copyright 2018 dogtown@mare-system.de
-# 
-# License: GPL v2 
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins
-#
-#
-# requirements:
-#    - python-requests, python-simplejson
-#
-#
-
-
-
-version = "0.0.5.r2 - alpha - 2018-05-20"
-
-
-import getopt, sys, time, os, string
-import requests 
-import simplejson as json 
-
-
-import re
-
-
-def check_shodan_help():
-  print """
-
-# usage: $0 -k YOUR_SHODAN_API_KEY -c YOUR_CACHET_KEY -m YOUR_CACHET_METRIC -u YOU_CACHET_URL
-    
-  
-  """
-
-
-try:
-  opts, args = getopt.getopt(sys.argv[1:], "D:k:w:c:m:u:h", 
-      ["help", "script", "debug" ])
-except getopt.GetoptError, err:
-  # print help information and exit:
-  print str(err) # will print something like "option -a not recognized"
-  check_shodan_help()
-  sys.exit(2)
-
-k = c = m = u = 0
-
-
-
-for o, a in opts:
-  #print "o :: " + o + "   <-->  a: " + a
-  if o in ("-h", "--help"):
-    check_shodan_help()
-    sys.exit()
-
-  elif o in ("-k", "--key"):
-    k = a
-
-  elif o in ("-c", "--critical"):
-    c = a
-
-  elif o in ("-m", "--metric"):
-    m = a
-
-  elif o in ("-u", "--cachet_url"):
-    u = a
-      
-          
-  else:
-    check_shodan_help()
-    sys.exit(2)        
-
-if k == 0 or c == 0 or m == 0 or u == 0:
-  print("""
-
-ERROR you need to give all values (k,c,m,u)
-
-  
-  """)
-  check_shodan_help()
-  sys.exit(2)
-  
-  
-  
-
-url = "https://api.shodan.io/api-info?key=%s" % k
-shodan_answer = requests.get(url)
-
-
-if shodan_answer.status_code != 200:
-  print "ERROR. cannot load shodan-status"
-  print "status-code: %s" % shodan_answer.status_code
-  print "text: %s"  % shodan_answer.text 
-  sys.exit(2)
-  
-sj = json.loads(shodan_answer.text)
-creditz = sj["query_credits"] 
-
-url = "%s/api/v1/metrics/%s/points" % (u, m)
-headers = {
-  "X-Cachet-Token": c ,
-  "Content-Type": "application/json;"
-
-
-}
-
-data = {
-  "value": creditz
-}
-
-r = requests.post(url, headers = headers, json = data)
-if r.status_code != 200:
-  print("CachetOutput Error (status: %s)" % r.status_code)
-  print (r.text)
-  sys.exit(2)
-  
-else:
-  # log here
-  pass 
-  
-  
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/check_execute b/check_execute
deleted file mode 100755
index d1f2ef9..0000000
--- a/check_execute
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python
-#
-# nagios_plugin to check for an external script to run, based on
-#               return_values
-# (c) copyright 2013-2015 mare-system.de
-# c: dogtown--[_at_]--mare-system--(dot)--de
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins/src
-#
-# v0.0.8 - 2015-01-13
-#
-##############################################################################
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# 
-# for more info see License.txt
-#
-##############################################################################
-#
-
-import os, sys, time
-import subprocess as sub
-
-EXIT_STATUS=3
-EXIT_TEXT="UNKNOWN"
-PERF_DATA=""
-cmd="..."
-
-def usage():
-  
-  print """
-
-USAGE: 
-  %s [script]
-  %s ["script --with --some --args -x"]
-  
-  """ % (sys.argv[0], sys.argv[0])
-
-def return_exit():
-  print "Check_Exec: %s" % (EXIT_TEXT)
-  sys.exit(EXIT_STATUS)
-
-if len(sys.argv) < 2:
-  usage()
-  sys.exit(2)
-
-# nice one:  http://stackoverflow.com/questions/11269575/how-to-hide-output-of-subprocess-in-python-2-7
-FNULL = open(os.devnull, 'w')
-
-cmd = [" ".join(sys.argv[1:]), " > /dev/null"]
-#cmd = "%s > /dev/null" % sys.argv[1]
-cmd_txt = sys.argv[1]
-  
-  
-try:
-  state = sub.check_call(cmd, stdout=FNULL, stderr=sub.STDOUT)
-except:
-  EXIT_STATUS = 2
-  EXIT_TEXT = "ERROR: Unknown Error or File not Found while executing: %s" % cmd_txt
-  return_exit()
-
-if state == 0:
-  EXIT_STATUS = 0
-  EXIT_TEXT = "OK Successfully Executed: %s" % cmd_txt
-  return_exit()
-
-else:
-  EXIT_STATUS = 1
-  EXIT_TEXT = "WARNING Some Problems occured while executing: %s / Return_State: %s" % (cmd_txt, state)
-  return_exit()
-
-return_exit()
-  
diff --git a/check_filechk b/check_filechk
deleted file mode 100755
index 268b44c..0000000
--- a/check_filechk
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/bin/sh
-#
-# nagios_plugin to check for an (non)exiting file
-#
-# gpl'ed / (c) copyright 2009 mare-system.de
-# c: dogtown--[_at_]--mare-system--(dot)--de
-# v0.4.1 - 2011-05-13
-#
-# v0.4.x -> filesize/fileage-checks + perfdata
-# v0.2.x -> basic functions, perfdata
-#
-
-
-EXIT_STATUS="3"
-EXIT_TEXT="UNKNOWN"
-PERF_DATA="none"
-
-t_warn="0"
-t_crit="0"
-s_warn="0"
-s_crit="0"
-
-
-helpme() {
-
-    echo "
-
-This plugin tests, if a given file exists or
-not (switch -n)
-
-Usage: check_filechk [options] -f /path/to/file 
-
-OPTIONS
-    -n  OK if file does not exists (skip other checks)
-
-    -w  [time] time in seconds -> file older that -w
-    -c  [time] time in seconds -> file older that -c
-
-    -W  [kB]  size in kB -> file larger that -W
-    -C  [kB]  size in kB -> file larger that -C
-
-    you can either check for non_existance [n], 
-    file_age [w/c] or file_size [W/C]
-    
-
-    "
-
-
-}
-
-
-exit_nao() {
-    PLUGIN_OUTPUT="FILECHK $EXIT_TEXT | $PERF_DATA"
-    echo $PLUGIN_OUTPUT 
-    exit $EXIT_STATUS
-
-    
-}
-
-check="normal"
-
-while getopts f:w:c:W:C:nh opt
-do
-
-    case $opt in
-        f)
-        FILE=$OPTARG
-        ;;
-        n) 
-        negate="yes"
-        ;;
-        c) 
-        t_crit="$OPTARG"
-        check="time"
-        ;;
-        w) 
-        t_warn="$OPTARG"
-        check="time"
-        ;;
-        C) 
-        s_crit="$OPTARG"
-        check="size"
-        ;;
-        W) 
-        s_warn="$OPTARG"
-        check="size"
-        ;;
-        *)
-        helpme
-        exit
-        ;;
-    esac
-    
-done
-
-if [ ! "$1" ]; then
-
-    helpme
-    exit 3
-    
-
-fi
-
-
-if [ "$negate" = "yes" ]; then
-    if [ ! -f "$FILE" ]; then
-        EXIT_STATUS="0"
-        EXIT_TEXT="OK - file not found $FILE "
-        PERF_DATA="file_NOT_ok $FILE"
-    else
-        EXIT_STATUS="2"
-        EXIT_TEXT="CRITICAL - file found $FILE "
-        DU=`du -k $FILE | cut -f1`
-        PERF_DATA="filesize=$DU k"
-    
-    
-    fi
-    
-    exit_nao
-
-else
-    if [ -f "$FILE" ]; then
-        EXIT_STATUS="0"
-        EXIT_TEXT="OK - file found $FILE "
-        DU=`du -k $FILE  | cut -f1`
-        PERF_DATA="filesize=$DU k"
-    else
-        EXIT_STATUS="2"
-        EXIT_TEXT="CRITICAL - file NOT found $FILE "
-        PERF_DATA="file_NOT_ok $FILE"
-        exit_nao
-        
-    
-    fi
-
-
-fi
-
-if [ "$check" = "time" ]; then
-    nowtime=`date +%s`
-    ctime=`stat -c %Z $FILE`
-    t_diff=$((nowtime - ctime))
-    if [ $t_diff -gt $t_crit ]; then
-        EXIT_STATUS="2"
-        EXIT_TEXT="CRITICAL - file older than $t_crit seconds "
-        PERF_DATA="$PERF_DATA; age=$t_diff;$t_warn;$t_crit;"
-        
-    elif [ $t_diff -gt $t_warn ]; then
-        EXIT_STATUS="1"
-        EXIT_TEXT="WARNING - file older than $t_warn seconds "
-        PERF_DATA="$PERF_DATA; age=$t_diff;$t_warn;$t_crit;"
-    else
-        EXIT_STATUS="0"
-        EXIT_TEXT="OK - fileage within limits ($t_diff seconds) "
-        PERF_DATA="$PERF_DATA; age=$t_diff;$t_warn;$t_crit;"
-    
-    fi
-    
-    exit_nao
-        
-    
-
-fi
-
-
-if [ "$check" = "size" ]; then
-    f_size="$DU"
-    if [ $f_size -gt $s_crit ]; then
-        EXIT_STATUS="2"
-        EXIT_TEXT="CRITICAL - file_size bigger than $s_crit kB "
-        PERF_DATA="$PERF_DATA; size=$f_size;$s_warn;$s_crit;"
-        
-    elif [ $f_size -gt $s_warn ]; then
-        EXIT_STATUS="1"
-        EXIT_TEXT="WARNING - file_size bigger than $s_warn kB "
-        PERF_DATA="$PERF_DATA; size=$f_size;$s_warn;$s_crit;"
-    else
-        EXIT_STATUS="0"
-        EXIT_TEXT="OK - file_size within limits ($f_size kB) "
-        PERF_DATA="$PERF_DATA; size=$f_size;$s_warn;$s_crit;"
-    
-    fi
-    
-    exit_nao
-    
-
-fi
-
-
-exit_nao
diff --git a/check_logcourier b/check_logcourier
deleted file mode 100755
index cb6ec7d..0000000
--- a/check_logcourier
+++ /dev/null
@@ -1,590 +0,0 @@
-#!/usr/bin/env python
-#
-# check_logcourier - nagios-plugin for https://github.com/driskell/log-courier
-#
-# (c) copyright 2015 dogtown@mare-system.de
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins/src
-#
-# 
-# Docs: check_logcourier -h 
-#
-# Requirements:
-#    - python 2.5 or later
-#    - python-yaml
-#    - log-courier (obviously)
-#    - lc-admin 
-#
-#
-#
-#NRPE_Config
-#
-#command[nrpe_check_lc_status]=/etc/nagios/plugins/check_logcourier -t status
-#command[nrpe_check_lc_files]=/etc/nagios/plugins/check_logcourier -t files
-#command[nrpe_check_lc]=/etc/nagios/plugins/check_logcourier -t "$ARG1" 
-
-#
-# SERVICES_CONFIG
-# this one is ok to run 3/1/5
-# define  service {
-#         host_name               check_host
-#         service_description     lc_status
-#         check_command           check_nrpe!nrpe_check_lc_status
-#         use                     generic-service
-#         register                1
-#         normal_check_interval   3
-#         retry_check_interval    1
-#         max_check_attempts      5
-#
-# }
-
-# usually you should allow 15 minutes to recover files from 
-# delays
-# define  service {
-#         host_name               check_host
-#         service_description     lc_files
-#         check_command           check_nrpe!nrpe_check_lc_files
-#         use                     generic-service
-#         register                1
-#         normal_check_interval   3
-#         retry_check_interval    1
-#         max_check_attempts      15
-#
-# }
-
-
-version = "0.0.5.r116 - alpha - 2015-05-20"
-
-
-import getopt, sys, time, os, string
-import socket as sock 
-import subprocess as sub
-from subprocess import check_output
-
-import re
-
-# run-defaults
-debug = "no"
-ctype = "status"
-
-# lc-defaults
-host    = "127.0.0.1"
-port    = "1234"
-
-# return-defaults
-return_status="UNKNOWN"
-return_exit=3
-return_text="no return (default)"
-return_perfdata="none"
-
-lc_admin="/usr/bin/lc-admin"
-
-try:
-  from yaml import load as yload
-  from yaml import dump as ydump
-except:
-  print "ERROR> cannot load yaml"
-  sys.exit(2)
-  
-
-def check_lc_help():
-    print """
-
-check_logcourier
-    nagios_plugin to check log-courier, a cool logshipper for logstash
-    log-courier is here: https://github.com/driskell/log-courier
-    
-USAGE
-    check_logcourier -t [type] [options]
-    
-TYPES
-    -t status   - global status
-                  reads from Publisher/Prospector-Sections
-                  warning if Prospector watched_files != active states
-                  critical only if Status != Connected
-                  -wp XX - warning if pending payloads >= XX (number) **
-                  -cp YY - critical if pending payloads => YY (number) **
-                  -wt XX - warning if timeouts >= XX (number) **
-                  -ct YY - critical if timeouts >= XX (number) **
-                  returns perfdata from Publisher 
-
-    -t files    - check for state of transferred files; at the moment just
-                  checks for file in FILES, if current offset == last eof offset
-                  TODO: detect stale/dead files 
-    -D            ignore dead files (default: dont ignore)
-
-MISC Options
-    -R          - suppress run_time informations
-  
-    -H [IP]     - Host/IP to connect to, default: 127.0.0.1
-    -p [PORT]   - port to connect to (default: 1234 
-  
-    -d        debug
-    -v        version
-    -h        help
-
-Examples
-  
-$ /etc/nagios/plugins/check_logcourier -t files
-
-LCourier.FILES Warning Stale Logfile: /var/log/fire.log (stat:Dead) , /var/log/fire.log (no harvester), 
-    /var/log/daemon.log[cur:3258615303/eof:3258611206], 
-    /var/log/syslog[cur:5863560473/eof:5863556782], 
-    /var/log/nginx/access.log (stat:Dead), /var/log/nginx/access.log (no harvester), 
-    /var/log/kern.log[cur:7133542680/eof:7133533586], 
-    /var/log/nginx/error.log (stat:Dead), 
-    /var/log/nginx/error.log (no harvester) | run_time=29.10ms; 
-
-$ /etc/nagios/plugins/check_logcourier 
-LCourier.STATUS OK Shipper Connected | lps=48.18; pub_lines=14393869; pending=0; timeouts=1; retrans=0; watched_files=9; active_files=9; run_time=31.37ms; 
-
-Requirements:
-    - python 2.5 or later
-    - python-yaml
-    - log-courier (obviously)
-    - lc-admin 
-
-Remarks
-    - ** -> not yet implemented 
-
-
- """
-    
-    print """
-    Version: %s
-    """ % version
-
-def return_result():
-  end_time = time.time()
-  run_time = str((end_time - start_time) * 1000 ).split(".")
-  r1 = run_time[0]
-  r2 = run_time[1][0:2]
-  run_time = "%s.%s" % (r1, r2)
-  if return_perfdata == "none":
-    if rtime == "no":
-      perfdata = ""
-    else:
-      perfdata = "| run_time=%sms;" % run_time
-  else:
-    perfdata = " | %s " % return_perfdata
-    if rtime ==  "yes":
-      if return_perfdata[-1] != ";":
-        perfdata = "| %s; run_time=%sms;" % (return_perfdata, run_time)
-      else:
-        perfdata = "| %s run_time=%sms;" % (return_perfdata, run_time)
-  print "LCourier.%s %s %s %s " % (ctype.upper(), return_status, return_text, perfdata)
-  sys.exit(return_exit)
-
-
-def check_lcadmin():
-  global return_status, return_text, return_perfdata, return_exit
-  # version-check
-  v_27 = (2,7)
-  cur_version = sys.version_info[0:2]
-  lc_cmd = [lc_admin, '-connect=%s' % connection,  'status']
-  if v_27 >= cur_version:    
-    try:
-      out =  check_output(lc_cmd)
-    except:
-      return_status = "CRITICAL"
-      return_text = "Shipper not Running? (check connection and run 'lc-admin status' to debug)"
-      return_exit = 2
-      return_result()
-  else:
-    p = sub.Popen(lc_cmd, stdout=sub.PIPE)
-    out, err = p.communicate()
-    if err:
-      return_status = "CRITICAL"
-      return_text = "Shipper not Running?  (check connection and run 'lc-admin status' to debug)"
-      return_exit = 2
-      return_result()
-  
-  failed_conn = re.search("Failed to connect(.*)%s:%s(.*)connection refused" % (host, port), out, re.I)
-  if failed_conn:
-    return_status = "CRITICAL"
-    return_text = "Shipper running but cannot connect (connection refused)"
-    return_exit = 2
-    return_result()
-
-    
-
-  # blood f*ckin stupid hack
-  out.split("\n")
-  o_s = 0
-  for line in out.split("\n"):
-    o_s += 1
-    if line.find("Connected") > -1:
-      break
-  out = "\n".join(out.split("\n")[o_s:-1]).strip()
-
-  
-  
-  lcadmin_res = out
-  
-  
-      
-  #~ lcadmin_res = """
-#~ "State: /var/log/auth.log (0xc20804e1e0)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 6337
-    #~ Current offset: 6958819
-    #~ Last EOF Offset: 6958819
-    #~ Status: Idle
-    #~ Dead timer: 23h58m51s
-#~ "State: /var/log/daemon.log (0xc20804e420)":
-  #~ Status: Dead
-#~ "State: /var/log/denyhosts (0xc20804f020)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 405
-    #~ Current offset: 36575
-    #~ Last EOF Offset: 36575
-    #~ Status: Idle
-    #~ Dead timer: 23h58m29s
-#~ "State: /var/log/kern.log (0xc20804e4e0)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 15015
-    #~ Current offset: 66042058
-    #~ Last EOF Offset: 66042058
-    #~ Status: Idle
-    #~ Dead timer: 23h58m51s
-#~ "State: /var/log/messages (0xc20804e900)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 15018
-    #~ Current offset: 65996954
-    #~ Last EOF Offset: 65996954
-    #~ Status: Idle
-    #~ Dead timer: 23h58m51s
-#~ "State: /var/log/syslog (0xc20804e960)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 53009
-    #~ Current offset: 100965445
-    #~ Last EOF Offset: 100965445
-    #~ Status: Idle
-    #~ Dead timer: 23h59m9s
-#~ Prospector:
-  #~ Watched files: 6
-  #~ Active states: 6
-#~ Publisher:
-  #~ Status: Connected
-  #~ Speed (Lps): 0.00
-  #~ Published lines: 89787
-  #~ Pending Payloads: 0
-  #~ Timeouts: 0
-  #~ Retransmissions: 0
-  #~ """
-  
-  # james brown is dead
-  #~ lcadmin_res = """
-  #~ Log Courier version 1.6.3.gc967820 client
-#~ 
-#~ Attempting connection to tcp:127.0.0.1:1234...
-#~ Connected
-#~ 
-#~ "State: /var/log/auth.log (0xc208050b40)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 11478
-    #~ Current offset: 49236168
-    #~ Last EOF Offset: 49236168
-    #~ Status: Idle
-    #~ Dead timer: 23h59m10s
-#~ "State: /var/log/daemon.log (0xc208050ba0)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 23.00
-    #~ Speed (Bps): 725.26
-    #~ Processed lines: 4586446
-    #~ Current offset: 3258238077
-    #~ Last EOF Offset: 3258237563
-    #~ Status: Idle
-    #~ Dead timer: 23h59m58s
-#~ "State: /var/log/denyhosts (0xc208050cc0)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 579
-    #~ Current offset: 60020
-    #~ Last EOF Offset: 60020
-    #~ Status: Idle
-    #~ Dead timer: 23h41m22s
-#~ "State: /var/log/fire.log (0xc208050c00)":
-  #~ Status: Dead
-#~ "State: /var/log/kern.log (0xc208050a80)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 8.08
-    #~ Speed (Bps): 1508.64
-    #~ Processed lines: 5188246
-    #~ Current offset: 7132649586
-    #~ Last EOF Offset: 7132649025
-    #~ Status: Idle
-    #~ Dead timer: 23h59m58s
-#~ "State: /var/log/messages (0xc208050ae0)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 0.00
-    #~ Speed (Bps): 0.00
-    #~ Processed lines: 4
-    #~ Current offset: 540924038
-    #~ Last EOF Offset: 540924038
-    #~ Status: Idle
-    #~ Dead timer: 15h56m15s
-#~ "State: /var/log/nginx/access.log (0xc208050d20)":
-  #~ Status: Dead
-#~ "State: /var/log/nginx/error.log (0xc208050d80)":
-  #~ Status: Dead
-#~ "State: /var/log/syslog (0xc208050c60)":
-  #~ Status: Running
-  #~ Harvester:
-    #~ Speed (Lps): 23.00
-    #~ Speed (Bps): 754.41
-    #~ Processed lines: 4590130
-    #~ Current offset: 5863182501
-    #~ Last EOF Offset: 5863182501
-    #~ Status: Idle
-    #~ Dead timer: 23h59m58s
-#~ Prospector:
-  #~ Watched files: 9
-  #~ Active states: 9
-#~ Publisher:
-  #~ Status: Connected
-  #~ Speed (Lps): 13.28
-  #~ Published lines: 14376807
-  #~ Pending Payloads: 0
-  #~ Timeouts: 1
-  #~ Retransmissions: 0"""
-
-  
-  lc_data = yload(lcadmin_res)
-  return(lc_data)
-
-def check_status():
-
-  global return_status, return_text, return_perfdata, return_exit
-  
-  pub_d = check_data["Publisher"]
-  prosp_d = check_data["Prospector"]
-  
-  if pub_d["Status"] != "Connected":
-    return_status = "CRITICAL"
-    return_text = "Shipper not Connected"
-    return_exit = 2
-    return()
-  else:
-    return_status = "OK"
-    return_text = "Shipper Connected"
-    return_exit = 0
-
-  # here checks for wp/cp/wt/ct and perfdata
-
-  
-  lps = pub_d["Speed (Lps)"]
-  plines = pub_d["Published lines"]
-  pending = pub_d["Pending Payloads"]
-  timeouts = pub_d["Timeouts"]
-  retrans = pub_d["Retransmissions"]
-  return_perfdata = "lps=%s; pub_lines=%s; pending=%s; timeouts=%s; retrans=%s; " % (lps, plines, pending, timeouts, retrans)
-  
-  if prosp_d["Watched files"] != prosp_d["Active states"]:
-    return_status = "WARNING"
-    return_text = "Shipper Connected, but watched files != active files"
-    return_exit = 1
-  return_perfdata += "watched_files=%s; active_files=%s;" % (prosp_d["Watched files"], prosp_d["Active states"])
-  
-  
-
-def check_files():
-
-  global return_status, return_text, return_perfdata, return_exit
-
-  files_d = {}
-  for d in check_data:
-    if d in ("Publisher", "Prospector"):
-      continue
-    files_d[d] = check_data[d]
-
-  return_status = "OK"
-  return_text = "All Logfiles at current state"
-  return_exit = 0
-
-  f_ok = 0
-  f_nok = 0
-  f_diff = {}
-  
-  for f in files_d:
-    f_name = f.split(" ")[1]
-    f_diff[f_name] = 0
-    #print f
-    #print files_d[f]
-    if files_d[f]["Status"] != "Running":
-      if files_d[f]["Status"] == "Dead":
-        if ignore_dead == "yes":
-          continue 
-      f_status = 1
-      return_status = "Warning"
-      return_exit = 1
-      if return_text == "All Logfiles at current state":
-        return_text = "Stale Logfile: %s (stat:%s) " % (f_name, files_d[f]["Status"] )
-      else:
-        return_text += ", %s (stat:%s)" % (f_name, files_d[f]["Status"] )
-
-    f_nok += 1
-
-    
-    if not "Harvester" in files_d[f]:
-      return_status = "Warning"
-      return_exit = 1
-      if return_text == "All Logfiles at current state":
-        return_text = "Stale Logfile: %s (no harvester) " % (f_name)
-      else:
-        return_text += ", %s (no harvester)" % (f_name)
-      continue 
-    
-    if files_d[f]["Harvester"]["Current offset"] == files_d[f]["Harvester"]["Last EOF Offset"]:
-      f_nok -= 1
-      f_ok += 1
-      f_diff[f_name] = 0 
-      continue
-    else:
-      diff =  files_d[f]["Harvester"]["Current offset"] - files_d[f]["Harvester"]["Last EOF Offset"]
-      f_diff[f_name] = diff 
-      return_status = "Warning"
-      return_exit = 1
-      if return_text == "All Logfiles at current state":
-        return_text = "Stale Logfile: %s [diff:%s/cur:%s/eof:%s]" % (f_name, diff, files_d[f]["Harvester"]["Current offset"], files_d[f]["Harvester"]["Last EOF Offset"])
-      else:
-        return_text += ", %s[diff:%s/cur:%s/eof:%s]" % (f_name, diff, files_d[f]["Harvester"]["Current offset"], files_d[f]["Harvester"]["Last EOF Offset"])
-  
-  
-  return_perfdata = "f_ok=%s; f_nok=%s;" % (f_ok, f_nok)
-  for fdiff in f_diff:
-    return_perfdata += "%s=%s; " % (fdiff, f_diff[fdiff])
-  
-  
-  
-  
-
-def print_debug(txt):
-  if debug == "yes":
-    print "[d] - %s" % txt
-
-    
-    
-wv      = "no"
-cv      = "no"
-pv      = "no"
-lv      = "no"
-rv      = "no"
-ip      = "no"
-ifd     = "eth0"
-nio     = "all"
-iface   = "all"
-rtime   = "yes"    
-ignore_dead = "no"
-
-
-
-filters = []
-
-
-try:
-  opts, args = getopt.getopt(sys.argv[1:], "H:s:c:w:t:p:l:r:i:n:e:u:f:hdzvRD", 
-      ["help", "script", "debug" ])
-except getopt.GetoptError, err:
-  # print help information and exit:
-  print str(err) # will print something like "option -a not recognized"
-  check_lc_help()
-  sys.exit(2)
-
-
-
-for o, a in opts:
-  #print "o :: " + o + "   <-->  a: " + a
-  if o in ("-h", "--help"):
-    check_lc_help()
-    sys.exit()
-      
-
-  elif o in ("-w", "--warning"):
-    wv = "%s" % a
-  elif o in ("-c", "--critical"):
-    cv = "%s" % a
-      
-  elif o == "-t":
-    ctype = "%s" % a
-
-  elif o == "-d":
-    debug = "yes"
-  elif o == "-D":
-    ignore_dead = "yes"
-
-  elif o == "-p":
-    port = "%s" % a 
-
-  elif o == "-H":
-    host = "%s" % a 
-          
-  elif o == "-R":
-    rtime = "no" 
-          
-  else:
-    check_lc_help()
-    sys.exit(2)        
-
-
-
-# version-check
-req_version = (2,5)
-cur_version = sys.version_info
-if not cur_version >= req_version:
-  return_status="WARNING"
-  return_exit=1
-  return_text="python-version not supported; required: %s, your version: %s,%s" % (req_version, cur_version[0], cur_version[1] )
-  return_perfdata = "logcourier: "
-  
-  return_result 
-
-start_time = time.time()
-
-connection = "tcp:%s:%s" % (host, port)
-
-
-check_data = check_lcadmin()
-
-#print check_data
-
-
-if ctype == "none":
-  check_lc_help()
-  sys.exit(0)
-
-elif ctype == "status":
-  check_status()
-  return_result()
-
-elif ctype == "files":
-  check_files()
-  return_result()
-
-else:
-  check_lc_help()
-  sys.exit(2)
-    
diff --git a/check_mdstat b/check_mdstat
deleted file mode 100755
index 3b0b87f..0000000
--- a/check_mdstat
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/sh
-#
-# nagios_plugin to check for linux_based 
-# softraids -> mdstat/raid_rebuild_indicators
-#
-# (c) copyright 2011,2012,2013 mare-system.de
-# c: dogtown--[_at_]--mare-system--(dot)--de
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins/src
-#
-# v0.4.8 - 2013-01-13
-#
-##############################################################################
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# 
-# for more info see License.txt
-#
-##############################################################################
-#
-
-
-EXIT_STATUS="3"
-EXIT_TEXT="UNKNOWN"
-PERF_DATA=""
-
-mdstat="/proc/mdstat"
-
-
-helpme() {
-
-    echo "
-
-CHECK_MDSTAT
-
-    This plugin tests, if a raid-system is going through a
-    rebuild-process by checking /proc/mdstat, so no sudo-rights 
-    needed (usually)
-
-INSTALLATION:
-    copy this plugin to your local plugins-directory and create 
-    service/nrpe-definition
-
-USAGE:
-    
-    to run this plugin:
-
-    /etc/nagios/plugins/check_mdstat
-    
-    optional:
-    check_mdstat -h   help
-    check_mdstat -v   version
-    
-
-REMARKS
-    
-    Please note that this plugin checks linux-softraids only.
-    
-    if you use hardware-raidcontroller you might want to check
-    your raid-controller.
-    
-    Required: /proc/mdstat
-    
-
-    "
-
-
-}
-
-
-while getopts h opt
-do
-
-    case $opt in
-        *)
-        helpme
-        exit
-        ;;
-    esac
-    
-done
-
-if [ "$1" ]; then
-    helpme
-    
-fi
-
-
-if [ -f "$mdstat" ]; then
-
-    EXIT_STATUS="0"
-    EXIT_TEXT="OK - raid is active"
-
-    rebuild=`grep -B 2 -e "finish=" $mdstat`
-    if [ ! -z "$rebuild" ]; then
-
-        # dirty ... 
-        
-
-        EXIT_STATUS="2"
-        EXIT_TEXT="CRITICAL - raid rebuild"
-        PERF_DATA=" | $rebuild"
-    
-    fi
-
-else
-
-        EXIT_STATUS="3"
-        EXIT_TEXT="Unknown - no $mdstat file found; do you have a linux-softraid?"
-    
-
-
-fi
-
-PLUGIN_OUTPUT="MDSTAT $EXIT_TEXT $PERF_DATA"
-
-echo $PLUGIN_OUTPUT 
-exit $EXIT_STATUS
diff --git a/check_nginx_status b/check_nginx_status.py
similarity index 65%
rename from check_nginx_status
rename to check_nginx_status.py
index ffd72c5..7c3cd0a 100755
--- a/check_nginx_status
+++ b/check_nginx_status.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 #
 # (c) copyright 2012-2015 dogtown@mare-system.de
-# 
-# License: GPL v2 
+#
+# License: GPL v2
 #
 # dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins
 #
@@ -12,34 +12,38 @@
 #   yangzi2008@126.com
 #   http://exchange.nagios.org/directory/Plugins/Web-Servers/nginx/check_nginx/details
 #
-#   check_nginx_status.pl
-#   regis.leroy@gmail.com 
-#   http://exchange.nagios.org/directory/Plugins/Web-Servers/nginx/check_nginx_status-2Epl/details 
+#   check_nginx_status.py.pl
+#   regis.leroy@gmail.com
+#   http://exchange.nagios.org/directory/Plugins/Web-Servers/nginx/check_nginx_status-2Epl/details
 #
 #   gustavo chaves for findinx and fixing some bugs
 #
 # reimplemented by dogtown with more features
-# 
+#
 # TODO:
 #   - make -a work
 #   - make -t test1,test2,test available w/ -w 1,2,3 -c 1,2,3
 #
 #
 
-import string, urllib2, getopt, sys, time, os
+import getopt
+import os
+import sys
+import time
+import urllib
 
-version = "0.3.0.59 - rc-2 - 2015-02-02"
+version = "0.4.0.0 - perun - 2023-06-07"
 
 ### default_values
 
 # default status url
-url     = "/nginx_status"
+url = "/nginx_status"
 
 # default host to check
-host    = "localhost"
+host = "localhost"
 
 # default nginx_poret; is set to 443 if -s is used
-port    = 80
+port = 80
 
 # default result-file for calculations, see -r/-n options
 # set to 0 if you want to deactivate this feature globally,
@@ -51,9 +55,10 @@ result_file = "/tmp/check_nginx.results"
 
 
 def usage():
-   print """
+    print(
+        """
    
-check_nginx_status is a Nagios-Plugin
+check_nginx_status.py is a Nagios-Plugin
 to monitor nginx status and alerts on various values, 
 based on teh output from HttpStubStatus - Module
 
@@ -62,7 +67,7 @@ it also creates, based on the returned values, a csv to store data
 
 Usage:
 
-    check_nginx_status [-H|--HOST] [-p|--port] [-u|--url] [-a|--auth] [-s|--ssl]
+    check_nginx_status.py [-H|--HOST] [-p|--port] [-u|--url] [-a|--auth] [-s|--ssl]
                        [-t|--test] [-w|--warning] [-c|--critical]
                        [-o|--output] [-r|--resultfile][-n|--noresult]
                        [-h|--help] [-v|--version] [-d|--debug]
@@ -71,7 +76,7 @@ Usage:
 Options:
 
   --help|-h)
-    print check_nginx_status help
+    print check_nginx_status.py help
 
   --HOST|-H)
     Sets nginx host
@@ -165,20 +170,20 @@ Options:
 Examples:
 
     just get all perfdata, url is default (/nginx_status)
-    ./check_nginx_status --HOST www.example.com 
+    ./check_nginx_status.py --HOST www.example.com 
 
     just get active connections perfdata
-    ./check_nginx_status -H www.example.com -o 
+    ./check_nginx_status.py -H www.example.com -o 
     
     check for plugin_checktime, error > 10ms (warning) or 50ms (error) and output
     only perfdata for that values
-    ./check_nginx_status -H www.example.com -u /status  -w 10 -c 50 -o
+    ./check_nginx_status.py -H www.example.com -u /status  -w 10 -c 50 -o
     
     check for requests per second, alert on > 300/1000 active connections
-    ./check_nginx_status -H www.example.com -u /status -t rps -w 300 -c 1000
+    ./check_nginx_status.py -H www.example.com -u /status -t rps -w 300 -c 1000
 
     Check for accepts_errors
-    ./check_nginx_status -H www.example.com -t accepts_err -w 1 -c 50
+    ./check_nginx_status.py -H www.example.com -t accepts_err -w 1 -c 50
 
 Performancedata:
     
@@ -229,20 +234,26 @@ Docs & Download:
         https://bitbucket.org/maresystem/dogtown-nagios-plugins
     
             """
+    )
+
 
 def ver():
-    print """
-check_nginx_status
+    print(
+        """
+check_nginx_status.py
     version : %s
     
-    usage   : check_nginx_status -h
+    usage   : check_nginx_status.py -h
     
-    """ % version
+    """
+        % version
+    )
+
 
 def print_debug(dtext):
     if debug == 1:
-        print "[d] %s" % dtext
-    return(0)
+        print("[d] %s" % dtext)
+    return 0
 
 
 def calculate():
@@ -250,85 +261,114 @@ def calculate():
     now = int(time.time())
     if result_file != 0:
         if not os.path.isfile(result_file):
-            print_debug("no result_file found, creating with next run :: %s " % result_file)
+            print_debug(
+                "no result_file found, creating with next run :: %s " % result_file
+            )
         else:
-#~ 
+            # ~
 
             try:
                 f = open(result_file, "r")
                 ro = f.readline().split(";")
                 f.close()
-                o_ac    = int(ro[0])
-                o_acc   = int(ro[1])
-                o_han   = int(ro[2])
-                o_req   = int(ro[3])
-                o_err   = int(ro[4])
-                o_rpc   = int(ro[5])
-                o_rps   = int(ro[6])
-                o_cps   = int(ro[7])
-                o_dreq  = int(ro[8])
-                o_dcon  = int(ro[9])
-                o_read  = int(ro[10])
-                o_writ  = int(ro[11])
-                o_wait  = int(ro[12])
-                o_ct    = int(ro[13])
-                last    = int(os.path.getmtime(result_file))
-                dtime   = now - last 
+                o_ac = int(ro[0])
+                o_acc = int(ro[1])
+                o_han = int(ro[2])
+                o_req = int(ro[3])
+                o_err = int(ro[4])
+                o_rpc = int(ro[5])
+                o_rps = int(ro[6])
+                o_cps = int(ro[7])
+                o_dreq = int(ro[8])
+                o_dcon = int(ro[9])
+                o_read = int(ro[10])
+                o_writ = int(ro[11])
+                o_wait = int(ro[12])
+                o_ct = int(ro[13])
+                last = int(os.path.getmtime(result_file))
+                dtime = now - last
                 if req >= o_req:
-                  dreq = req - o_req
+                    dreq = req - o_req
                 else:
-                  dreq = req                
-                rps     = int(dreq / dtime)
+                    dreq = req
+                rps = int(dreq / dtime)
                 if acc >= o_acc:
-                  dcon = acc - o_acc
+                    dcon = acc - o_acc
                 else:
-                  dcon = acc
-                cps     = int(dcon / dtime)
+                    dcon = acc
+                cps = int(dcon / dtime)
 
             except:
-                print_debug("cannot read/process result_file :: %s \n use -r" % result_file)
-                #return(rps, cps, dreq, dcon)
-            
-            
+                print_debug(
+                    "cannot read/process result_file :: %s \n use -r" % result_file
+                )
+                # return(rps, cps, dreq, dcon)
+
     else:
-        
+
         if test in ("rps", "cps", "dreq", "dcon"):
-            print "NginxStatus.%s UNKNONW - noresult selected (-n), cannot calculate test_results" % (test)
+            print(
+                "NginxStatus.%s UNKNONW - noresult selected (-n), cannot calculate test_results"
+                % (test)
+            )
             sys.exit(3)
-        
+
         print_debug("noresult selected, return 0_values")
-        return(rps, cps, dreq, dcon)
-            
+        return (rps, cps, dreq, dcon)
 
     print_debug("writing result_file -> %s" % result_file)
     try:
         f = open(result_file, "w")
-        f.write("%s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s;\n" % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct))
+        f.write(
+            "%s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s;\n"
+            % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct)
+        )
         f.close()
     except:
         print_debug("cannot create result_file :: %s \n use -r" % result_file)
-        return(rps, cps, dreq, dcon)
+        return (rps, cps, dreq, dcon)
     csv = "%s.csv" % result_file
     if not os.path.isfile(csv):
         try:
             print_debug("creating result_file.csv -> %s" % result_file)
             f = open(csv, "w")
-            f.write(""""timestamp"; "active conns"; "accepted"; "handled"; "requests"; "req_errors"; "reqs per conn"; "reqs per sec"; "conns per sec"; "delta reqs"; "delta conns"; "reading"; "writing"; "waiting"; "checktime"; \n""")
+            f.write(
+                """"timestamp"; "active conns"; "accepted"; "handled"; "requests"; "req_errors"; "reqs per conn"; "reqs per sec"; "conns per sec"; "delta reqs"; "delta conns"; "reading"; "writing"; "waiting"; "checktime"; \n"""
+            )
         except:
-            print "ERR.cannot create result_file.csv :: %s \n use -r" % csv
+            print("ERR.cannot create result_file.csv :: %s \n use -r" % csv)
 
     print_debug("writing result_file.csv -> %s.csv" % result_file)
     try:
         f = open(csv, "a")
-        f.write("%s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s;" % (now, ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct))
+        f.write(
+            "%s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s; %s;"
+            % (
+                now,
+                ac,
+                acc,
+                han,
+                req,
+                err,
+                rpc,
+                rps,
+                cps,
+                dreq,
+                dcon,
+                read,
+                writ,
+                wait,
+                ct,
+            )
+        )
         f.close()
     except:
-        print "ERR.cannot write result_file.csv :: %s \n use -r" % csv 
+        print("ERR.cannot write result_file.csv :: %s \n use -r" % csv)
 
-    return(rps, cps, dreq, dcon)
+    return (rps, cps, dreq, dcon)
 
 
-#### main 
+#### main
 
 exot = 0
 ssl = 0
@@ -344,76 +384,96 @@ perfdata = ""
 try:
     iv = sys.argv[1]
 except:
-    print """
+    print(
+        """
     
-usage: check_nginx_status -h
+usage: check_nginx_status.py -h
 
 -----------------------------------------------------"""
+    )
     usage()
     sys.exit(3)
-    
+
 
 try:
-    options,args = getopt.getopt(sys.argv[1:],"ndovDshH:p:u:p:w:c:t:r:",["help","SSL","Debug","HOST","port","auth","test","url","warning","critical", "output", "resultfile", "noresult"])
+    options, args = getopt.getopt(
+        sys.argv[1:],
+        "ndovDshH:p:u:p:w:c:t:r:",
+        [
+            "help",
+            "SSL",
+            "Debug",
+            "HOST",
+            "port",
+            "auth",
+            "test",
+            "url",
+            "warning",
+            "critical",
+            "output",
+            "resultfile",
+            "noresult",
+        ],
+    )
 
 except getopt.GetoptError:
     usage()
     sys.exit(3)
 
-for name,value in options:
+for name, value in options:
 
-    if name in ("-H","--HOST"):
+    if name in ("-H", "--HOST"):
         host = "%s" % value
 
-    elif name in ("-u","--url"):
+    elif name in ("-u", "--url"):
         url = value
 
-    elif name in ("-a","--auth"):
+    elif name in ("-a", "--auth"):
         user, passwd = value.split(":")
 
-    elif name in ("-s","--ssl"):
+    elif name in ("-s", "--ssl"):
         ssl = 1
 
-    elif name in ("-r","--resultfile"):
+    elif name in ("-r", "--resultfile"):
         result_file = "%s" % value
 
-    elif name in ("-t","--test"):
-        test = "%s" % value 
+    elif name in ("-t", "--test"):
+        test = "%s" % value
 
-    elif name in ("-d","--debug"):
+    elif name in ("-d", "--debug"):
         debug = 1
 
-    elif name in ("-o","--output"):
+    elif name in ("-o", "--output"):
         output = 1
 
-    elif name in ("-n","--noresult"):
+    elif name in ("-n", "--noresult"):
         result_file = 0
 
-    elif name in ("-p","--port"):
+    elif name in ("-p", "--port"):
         try:
             port = int(value)
         except:
-            print("""%s Usage.ERROR - -p [PORT] must be an Integer """ % msg)    
+            print("""%s Usage.ERROR - -p [PORT] must be an Integer """ % msg)
             exot = 3
 
-    elif name in ("-w","--warning"):
+    elif name in ("-w", "--warning"):
         try:
             w = int(value)
         except:
             print("""%s Usage.ERROR -w [WARNING] must be an Integer    """ % msg)
             exot = 3
 
-    elif name in ("-c","--critical"):
+    elif name in ("-c", "--critical"):
         try:
             c = int(value)
         except:
             print("""%s Usage.ERROR -c [CRITICAL] must be an Integer    """ % msg)
             exot = 3
 
-    elif name in ("-v","--version"):
+    elif name in ("-v", "--version"):
         ver()
         sys.exit(0)
-    
+
     else:
         usage()
         ver()
@@ -425,7 +485,11 @@ if exot != 0:
 # creating test-url
 
 if host.find("http") > -1:
-    print("""%s Usage.ERROR - use -H [hostname], NOT -H [http://hostname] (%s)""" (msg, host))
+    print(
+        """%s Usage.ERROR - use -H [hostname], NOT -H [http://hostname] (%s)"""(
+            msg, host
+        )
+    )
     sys.exit(3)
 
 if ssl == 1:
@@ -444,42 +508,40 @@ curl = "%s%s" % (turl, url)
 print_debug("final url to fetch: %s" % curl)
 
 
-# start_time for checktime-calculation    
+# start_time for checktime-calculation
 st = time.time()
 
 
-
 try:
 
-    req = urllib2.Request(curl)
-    response = urllib2.urlopen(req)
+    req = urllib.Request(curl)
+    response = urllib.urlopen(req)
     status = response.readlines()
     print_debug("returned_status from url: \n    %s" % "    ".join(status))
     response.close()
-    #~ if 'user' in dir() and 'passwd' in dir():
-        #~ passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
-        #~ passman.add_password(None, curl, user, passwd)
-        #~ authhandler = urllib2.HTTPBasicAuthHandler(passman)
-        #~ opener = urllib2.build_opener(authhandler)
-        #~ urllib2.install_opener(opener)
+    # ~ if 'user' in dir() and 'passwd' in dir():
+    # ~ passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
+    # ~ passman.add_password(None, curl, user, passwd)
+    # ~ authhandler = urllib2.HTTPBasicAuthHandler(passman)
+    # ~ opener = urllib2.build_opener(authhandler)
+    # ~ urllib2.install_opener(opener)
 
 
 # TODO: http://stackoverflow.com/questions/2712524/handling-urllib2s-timeout-python
 except Exception:
-   print "%s: Error while getting Connection :: %s " % (msg, curl)
-   sys.exit(3)
-
+    print("%s: Error while getting Connection :: %s " % (msg, curl))
+    sys.exit(3)
 
 
 if len(status) == 0:
-   print "%s: No values found in %s " % (msg , curl)
-   sys.exit(3)
+    print("%s: No values found in %s " % (msg, curl))
+    sys.exit(3)
 
-# end_time for checktime-calculation    
+# end_time for checktime-calculation
 et = time.time()
 
 try:
-    ct = int((et - st)*1000)
+    ct = int((et - st) * 1000)
     l1 = status[0]
     ac = int(l1.split(":")[1].strip())
     l2 = status[2]
@@ -488,26 +550,27 @@ try:
     han = int(han)
     req = int(req)
     err = acc - han
-    rpc = int(req/han)
+    rpc = int(req / han)
     l3 = status[3]
     read = int((l3.split("Reading:")[1]).split()[0])
     writ = int((l3.split("Writing:")[1]).split()[0])
     wait = int((l3.split("Waiting:")[1]).split()[0])
 
 except:
-   print "%s: Error while trying to convert values from status_url %s " % (msg , curl)
-   for line in status:
-       print "  :: %s" % line.strip()
-   sys.exit(3)
+    print("%s: Error while trying to convert values from status_url %s " % (msg, curl))
+    for line in status:
+        print("  :: %s" % line.strip())
+    sys.exit(3)
 
 # calculate results, if wanted
 
 rps, cps, dreq, dcon = calculate()
-    
+
 # creating needed output
 
 
-print_debug("""-- status-report (perfdata)---
+print_debug(
+    """-- status-report (perfdata)---
 
 active_conns    :   %s
 accepted conns  :   %s    
@@ -525,24 +588,26 @@ waiting         :   %s
 
 checktime       :   %s ms
 
-""" % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct  )) 
+"""
+    % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct)
+)
 
 
-#~ if test == 0:
-    #~ if w == 0 or c == 0:
-        #~ pass
-    #~ else:
-        #~ test = "checktime"
+# ~ if test == 0:
+# ~ if w == 0 or c == 0:
+# ~ pass
+# ~ else:
+# ~ test = "checktime"
 
 if test != 0:
     if w == 0:
         print("""Usage.ERROR :: -w [WARNING] must be set and Integer (cannot be 0)""")
         sys.exit(3)
-    
+
     if c == 0:
         print("""Usage.ERROR :: -c [CRITICAL] must be set and Integer (cannot be 0)""")
         sys.exit(3)
-        
+
 # default test_text
 tt = "unknown"
 
@@ -595,7 +660,7 @@ elif test == "dcon":
 else:
     ta = ct
     tt = "CheckTime"
-    
+
 print_debug("set test: %s" % tt)
 dt = "NginxStatus.%s" % tt
 
@@ -603,29 +668,29 @@ dt = "NginxStatus.%s" % tt
 # creating perfdata
 if output == 1:
     if test == 0:
-        perfdata="active_conns=%s;" % ta
+        perfdata = "active_conns=%s;" % ta
     else:
         perfdata = "%s=%s;" % (test, ta)
 else:
-    perfdata = "ac=%s;acc=%s; han=%s; req=%s; err=%s; rpc=%s; rps=%s; cps=%s; dreq=%s; dcon=%s; read=%s; writ=%s; wait=%s; ct=%sms;"   % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct  ) 
+    perfdata = (
+        "ac=%s;acc=%s; han=%s; req=%s; err=%s; rpc=%s; rps=%s; cps=%s; dreq=%s; dcon=%s; read=%s; writ=%s; wait=%s; ct=%sms;"
+        % (ac, acc, han, req, err, rpc, rps, cps, dreq, dcon, read, writ, wait, ct)
+    )
 
 print_debug("perfdata: %s" % perfdata)
 
 
 if test == 0:
-    print "%s OK [ %s ] | %s" % (dt, ta,  perfdata)
+    print("%s OK [ %s ] | %s" % (dt, ta, perfdata))
     sys.exit(0)
 
 if ta >= c:
-    print "%s CRITICAL: %s | %s" % (dt, ta, perfdata)
+    print("%s CRITICAL: %s | %s" % (dt, ta, perfdata))
     sys.exit(2)
-    
+
 elif ta >= w:
-    print "%s WARNING: %s | %s" % (dt, ta, perfdata)
+    print("%s WARNING: %s | %s" % (dt, ta, perfdata))
     sys.exit(1)
 
 else:
-    print "%s OK [ %s ] | %s" % (dt, ta, perfdata)
-    
-
-
+    print("%s OK [ %s ] | %s" % (dt, ta, perfdata))
diff --git a/check_nmap b/check_nmap
deleted file mode 100755
index 68a4074..0000000
--- a/check_nmap
+++ /dev/null
@@ -1,567 +0,0 @@
-#!/usr/bin/python
-#
-#
-# requirements: 
-#     - python 2.5 or above, must be able to use threads
-#     - nmap 5.0 or above  including ndiff
-#     - unprivilegded user with sudo-rights for chgroup 
-#
-# todo: 
-#   - modus:nagios/standalone
-#   - profile: mailto= 
-#
-# commands-examples:
-#
-#
-# define  command {
-    # command_name    check_nmap
-    # command_line    $USER1$/check_nmap -x $ARG1$
-    # }
-
-    
-
-# define  service {
-        # host_name               nmap_scan_host
-        # service_description     nmap_scan
-        # check_command           check_nmap![profile-name]
-        # use                     generic-service
-        # register                1
-
-# }
-
-# cronjob
-# checks all 10 minutes for profil-name 
-# */10 * * * * /etc/nagios/plugins/check_nmap -s profil-name
-
-
-import time, socket, thread, sys, os, getopt, string
-
-version = "0.4.36 - 2013-01-19"
-
-#
-# config_start
-#
-
-debug = "no"
-
-data_dir = "/var/lib/check_nmap"
-nmap_exec = "/usr/bin/nmap"
-ndiff_exec = "/usr/bin/ndiff"
-nmap_switches = "-PN -T5 -sV " # maybe tweak this for better performance 
-nmap_ports = "-p U:1-,T:1-"
-nagios_version = 3
-nagios_group = "nagios" # for chmodding/chowning scan-files
-
-# use this for later reasons
-profiles = {
-       # 'profile-name', 'profile-description'
-       # profile-name should be single name with alphanumeric chars, no spaces
-        'standard':'Basic scan of localhost',
-           }
-
-
-
-# after which time an unaltered nmap_asctual.scan - file 
-# will create an alert (cron stopped, broken nmap etc)
-
-# defaults 
-scan_fresh_warning  = 1440
-scan_fresh_critical = 2880
-
-# this is needed for standalone-modus
-default_email = "root@localhost"
-mail_modus = "localhost" # might be: smarthost
-# this is only neede for mail_modus = "smarthost"
-smtp_server = ""
-smtp_port = 25
-smtp_user = ""
-smtp_pass = ""
-smtp_ssl = "no" # if yes -> port = 995
-
-#
-# config_end
-#
-
-
-def check_nmap_help():
-    
-    print """
-
-check_nmap  - version: %s
-Copyright 2009,2010,2011,2012,2013 mare-system / dogtown@mare-system.de    
-
-This plugin tests for nmap-diffs on a given server-list
-
-       it runs in three different modi:
-        -i [profile-name] 
-            create initial scan; interactively if no server.lst is
-            found
-            
-        -s [profile-name] 
-            create actual scan_result (should be run from an unprivilegded
-            users crontab, eg every hour, depending on your network
-            and level of paranoia)
-            
-
-        -x [profile-name]
-            execute scan/ ndiff: check actual_scan_result against 
-            initial_scan_result should be executed as nagios-check
-
-Please note: the modes -i / -s might take a long time if using default-values
-    due to the fact that the full portrange is used (-p U:1-,T:1-)
-    
-
-this is still in testing (late alpha/early beta) and should
-be wisely tested before executed against a larger network
-
-***) => still to be done
-
-USAGE:
-   check_nmap -x profile-name [ -w minutes -c minutes ]
-
-OPTIONS 
-    -h                 -> help
-    
-
-  modes:
-    -i profile-name    -> create initial scan_result
-    -s profile-name    -> create actual scan_result 
-                         (should be run from crontab, eg every hour)
-    -x profile-name    -> execute scan/ ndiff: check actual_scan_result 
-                          against initial_scan_result 
-                          should be executed as nagios-check
-
-  Options: 
-    -P                 -> skip nmap-ping-scan (should NOT be used when
-                          scanning a list of networks, e.g. 192.168.100.0/24,
-                          because othervise -PN is used for nmap, assuming you know
-                          the servers are up and running, but pings might get blocked
-                          default: -PN is OFF
-
-    -p [ports]         -> give nmap-style portrange e.g. 
-                          -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
-                          -p fast       -> -F FastMode
-                          -p top        -> --top-ports 1000
-                          -p default    -> default-scan, turns of -p
-
-    
-    -w minutes         -> time in minutes after which an unaltered 
-                          nmap_asctual.scan file will return warning
-                          default: 1440 *** (only with -x)
-                          
-    -c minutes         -> time in minutes after which an unaltered 
-                          nmap_current.scan file will return critical
-                          default: 2880 *** (only with -x)
-                          
-    -v nagios-version  -> might be 2 (limited output)
-                          default: 3 (only with -x)
-                          
-    -n name(s)         -> use given ip/cidr/dns-name instead of a server_list
-                          might be a comma-separated list, eg 
-                          192.168.0.12,192.168.0.15,192.168.0.17/32
-    
-
-INSTALL:
-
-  - edit this script and change values from # config - section
-  - create data_dir, give your nagios-user read and the nmap-user
-    rw - access to that directory; you should execute your nmap-scans
-    as an unprivileged user via crontab, NOT via nagios/nrpe, due to timeouts
-  - define your networks/hostlist to scan
-  - create a check (see below)
-
-
-Create a check
-  
-  interactively:
-    - run check_nmap -i [profile-name]; data-directories and server.lst
-      will be created within data_dir
-    
-  manually:
-
-    - create [data_dir]/profile-name (see value for data_dir below)
-      in section DATA
-    - create a file called servers.lst in [data_dir]/profile-name
-      with a list of servers to scan (might be omitted using switch -n )
-    - (not needed at the moment):
-      edit value profiles => add new profile-name/description to dictionary
-    - run check_nmap -i [profile-name]
-
-  always:
-    - add cronjob for check_nmap -x [profile-name]
-    - add service-check for check_nmap -x [profile-name]
-    - run forest, run
-    
-
-DATA_DIR:
-  default -> %s
-  
-  you might change the value for [data_dir] within the header 
-  of this script for your own needs
-  
-  data is stored below [data_dir] as follows:
-  
-    [data_dir]/[profile-name]/
-                server.lst        => list with servers to scan
-                                     might be omitted using switch -n 
-                nmap_initial.scan => scan-result created during profile-init
-                                     (using -i switch)
-                nmap_current.scan => actual scan_result, created from cronjob
-                scan.log          => action-log
-                ndiff.log         => ndiff-log (***)
-
-
-        
-    """ % (version, data_dir)
-
-def return_nagios():
-    nagios_status = "NMAP %s - %s" % (return_status, return_output)    
-    print nagios_status
-    sys.exit(return_code)
-
-
-def print_debug(in_put):
-    
-    if debug == "yes":
-        print "d: %s" % in_put
-
-
-def scan_log(out_text, scan_log_file):
-    actual_time=time.strftime("%F %H:%M", time.localtime(time.time()))
-    
-    try:
-        f = open(scan_log_file, "a")
-        f.write("%s  :: %s \n" % (actual_time, out_text))
-        f.close()
-    except:
-        pass
-    return()
-
-
-
-def nmap_scan(profile):
-    global profile_name
-    profile_name = profile
-    
-    if not os.path.isdir(scan_data_dir):
-        print "ERROR!! no scan_data_dir found -> %s \n > does it exists???\n > ... exiting ..." % scan_data_dir
-        sys.exit(2)
-    if os.access("%s" % nmap_exec, os.X_OK) == False:
-        print """
-        
-ERROR ... nmap_executable not found / not executable 
-          -> %s
- 
- > ... exiting        
-        """ % nmap_exec
-        sys.exit(2)
-    if list == "yes":
-        if not os.path.isfile(server_file):
-            print "ERROR!! no server_file found -> %s \n > does it exists???\n > ... exiting ..." % server_file
-            sys.exit()
-
-    nmap_command = "%s %s %s -oX %s %s %s " % (nmap_exec, nmap_switches, nmap_ports, scan_current_file, nmap_list_switch, server_file)
-    try:
-        os.system(nmap_command)
-        #os.popen(nmap_command).readlines() 
-    except:
-        print """
-        
-ERROR while trying to execute scan  
-          -> %s
- 
- > ... exiting        
-        """ % nmap_command
-        sys.exit(2)
-    try:
-        os.system("sudo chgrp %s %s " % (nagios_group, scan_current_file))
-        os.system("sudo chmod 640 %s " % scan_current_file)
-    except:
-        print "cannot chgroup/chmod %s for nagios-access" % scan_current_file
-
-    scan_log("[%s] :: SCAN  nmap run -> %s " % (profile, nmap_command), scan_log_file)
-
-
-def nmap_init(profile):
-    global profile_name
-    profile_name = profile
-    
-    
-    run_time = time.strftime("%Y-%m-%d_%H:%M", time.localtime(time.time()))
-    
-    if not os.path.isdir(scan_data_dir):
-        try:
-            os.makedirs(scan_data_dir)
-        except:
-            print "ERROR!! cannot create scan_data_dir  -> %s \n > do you have rw_rights to %s ???\n > ... exiting ..." % data_dir
-            sys.exit(2)
-    
-    if os.access("%s" % nmap_exec, os.X_OK) == False:
-        print """
-        
-ERROR ... nmap_executable not found / not executable 
-          -> %s
- 
- > ... exiting        
-        """ % nmap_exec
-        sys.exit(2)
-
-
-    if not os.path.isfile(server_file):
-        print "[i] no server_file found -> %s \n > ... creating ..." % server_file
-
-        servers = []
-        s_in = ""
-        print "> [q] to quit and write file %s " % server_file
-        while s_in != "q":
-            s_in = raw_input("> add server/net to server.lst: ")
-            if s_in == "q":
-                break
-            if len(s_in) < 5:
-                print "> [q] to quit and write file %s " % server_file
-                continue
-            else:
-                servers.append(s_in.strip())
-        
-        print "\n\n------------------------------\n> going to add now: \n"
-        for s in servers:
-            print "   - %s" % s
-        
-        write_file = raw_input("> write server.lst [Y|n] ")
-        if write_file != "n":
-            scan_log("creating server.lst -> %s" % server_file) 
-            f = open(server_file, "w")
-            for s in servers:
-                scan_log("  - added %s" % s) 
-                f.write("%-s \n" % s)
-            
-            f.write("\n\n# end \n")
-            f.close()
-            print "> file written ->  %s " % server_file
-            
-            
-        
-            
-        
-    if os.path.isfile(scan_init_file):
-        print "deleting old init-file"
-        try:
-            os.system("chmod 600 %s " % scan_init_file)
-            os.system("rm -f %s " % scan_init_file)
-        except:
-            os.system("chmod 600 %s " % scan_init_file)
-            os.system("rm -f %s " % scan_init_file)
-    
-
-    nmap_command = "%s %s %s -oX %s %s %s " % (nmap_exec, nmap_switches, nmap_ports, scan_init_file, nmap_list_switch, server_file)
-    print_debug(nmap_command)
-    
-    try:
-        os.system(nmap_command)
-        #os.popen(nmap_command).readlines() 
-    except:
-        print """
-        
-ERROR while trying to execute scan  
-          -> %s
- 
- > ... exiting        
-        """ % nmap_command
-        sys.exit(2)
-    
-    scan_log("[%s] :: INIT nmap run -> %s " % (profile, nmap_command), scan_log_file)
-    os.system("sudo chgrp %s %s " % (nagios_group, scan_init_file))
-    os.system("sudo chmod 440 %s " % scan_init_file)
-    os.system("sudo chgrp %s %s " % (nagios_group, scan_data_dir))
-    os.system("sudo chmod 750 %s " % scan_data_dir)
-    
-    sys.exit()
-
-def nmap_check(profile):
-    global return_status, return_output, return_code, return_perfdata
-
-    return_status = "UNKNOWN"
-    return_output = "unknow status for nmap-scan"
-    return_code = 3
-    return_perfdata = 0
-
-    
-    if not os.path.isdir(scan_data_dir):
-        return_status = "UNKNOWN"
-        return_output = "SCAN_DATA_DIR[%s] does not exist for nmap-check -> %s " % (scan_data_dir, profile)
-        return_code = 3
-        return_nagios()
-    if os.access("%s" % ndiff_exec, os.X_OK) == False:
-        return_status = "UNKNOWN"
-        return_output = "nmap_exectuable not found -> %s for nmap-check -> %s " % (ndiff_exec, profile)
-        return_code = 3
-        return_nagios()
-    if not os.path.isfile(scan_init_file):
-        return_status = "UNKNOWN"
-        return_output = "SCAN_INIT_FILE[%s] not found -> %s for nmap-check -> %s " % (scan_init_file, profile)
-        return_code = 3
-        return_nagios()
-
-    if not os.path.isfile(scan_current_file):
-        return_status = "UNKNOWN"
-        return_output = "SCAN_CURRENT_FILE[%s] not found -> %s for nmap-check -> %s " % (scan_current_file, profile)
-        return_code = 3
-        return_nagios()
-
-    
-    # puft in check for current_timestamp
-    
-    ndiff_command = "%s %s %s " % (ndiff_exec, scan_init_file, scan_current_file)
-    try:
-        ndiff_out = os.popen(ndiff_command).readlines()
-        #os.popen(nmap_command).readlines() 
-    except:
-        return_status = "UNKNOWN"
-        return_output = "ERRO while executing -> %s @ nmap-check -> %s " % (ndiff_command, profile)
-        return_code = 3
-        return_nagios()
-    
-    ndc = 0
-    for line in ndiff_out:
-        if line.find("Nmap") > -1:
-            continue
-        elif line.find("Not shown") > -1:
-            continue
-        elif line.find("open") > -1:
-            ndc += 1
-            return_output = "%s -> %s" % (return_output, line.strip())
-            continue
-        elif line.find("closed") > -1:
-            ndc += 1
-            return_output = "%s -> %s" % (return_output, line.strip())
-            continue
-        elif line.find("filtered") > -1:
-            ndc += 1
-            return_output = "%s -> %s" % (return_output, line.strip())
-            continue
-                    
-    
-    if ndc < 1:
-        return_status = "OK"
-        return_output = "nmap-check passed -> profile: %s " % (profile)
-        return_code = 0
-        return_nagios()
-    else:
-        return_output = "DIFF found: %s" % return_output
-        return_status = "CRITICAL"
-        return_code = 2
-        out_len = len(ndiff_out)
-        #print out_len
-            
-        if nagios_version == "3":
-            return_output = "%s \n%s" % (return_output, string.join(ndiff_out, ""))         
-        return_nagios()
-
-    
-# Argument parsing
-if len(sys.argv) < 2:
-    check_nmap_help()
-    sys.exit(2) 
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "i:x:n:s:c:w:v:p:dhP" )
-except getopt.GetoptError, err:
-    # print help information and exit:
-    print str(err) # will print something like "option -a not recognized"
-    sys.exit(2)
-
-
-do = "buttin"
-list = "yes"
-ping_scan = "no"
-
-for o, a in opts:
-    #print "o :: " + o + "   <-->  a: " + a
-    if o == "-v":
-        nagios_version = a
-
-    elif o == "-d":
-        debug = "yes"    
-        nmap_switches = nmap_switches + " --version-trace"
-
-    
-    elif o == "-h":
-        check_nmap_help()
-        exit(0)
-
-    elif o == "-n":
-        list = "no"
-        names = string.join(string.split(a, ","), " ")
-
-    elif o == "-s":
-        profile = a
-        do = "scan"
-
-    elif o == "-P":
-        ping_scan = "no"
-        nmap_switches = nmap_switches + " -PN "
-        
-    elif o == "-p":
-        if a == "fast":
-            nmap_ports = " -F "
-        elif a == "top":
-            nmap_ports = " --top-ports 1000 "
-        elif a == "default":
-            nmap_ports = " "
-        else:
-            nmap_ports = " -p %s " % a
-
-
-    elif o == "-x":
-        profile = a
-        do = "check"
-
-    elif o == "-i":
-        profile = a
-        do = "init"
-
-    elif o == "-w":
-        try:
-            scan_fresh_warning = int(a)
-            scan_fresh_warning = "%s" % a
-        except:
-            pass
-
-    elif o == "-c":
-        try:
-            scan_fresh_critical = int(a)
-            scan_fresh_critical = "%s" % a
-        except:
-            pass
-
-
-nmap_list_switch = "-iL"
-scan_data_dir = "%s/%s" % (data_dir, profile)
-server_file = "%s/server.lst" % scan_data_dir
-scan_init_file = "%s/nmap_initial.scan" % scan_data_dir
-scan_current_file = "%s/nmap_current.scan" % scan_data_dir
-scan_log_file = "%s/scan.log" % scan_data_dir
-
-if list == "no":
-    nmap_list_switch = ""
-    server_file = names    
-
-if do == "buttin":
-    pass
-
-elif do == "scan":
-    nmap_scan(profile)
-    sys.exit()
-
-elif do == "init":
-    nmap_init(profile)
-    sys.exit()
-
-elif do == "check":
-    nmap_check(profile)
-    
-
-return_status = "UNKNOWN"
-return_output = "unknown status in nmap-scan"
-return_code = 3
-return_nagios()
diff --git a/check_psinfo b/check_psinfo
deleted file mode 100755
index 274e7a1..0000000
--- a/check_psinfo
+++ /dev/null
@@ -1,1516 +0,0 @@
-#!/usr/bin/python
-#
-# check_psinfo - processinformations with perfdata
-#
-# (c) copyright 2010-2016 dogtown@mare-system.de
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins/src
-#
-# please note, some checks like users/net/cpu/iowait are linux-based
-# and *might* work on any *unix if you have the right programs installed
-# 
-# Docs: check_psinfo.md
-#
-# Requirements:
-#    - python 2.5 or later
-#    - python 2.7 or later for -t ebury
-#    - python-psutil-0.2.0 or later 
-#       - 0.6.1 for any function
-#       - 0.2.1 if you can skip -t mem / -t users
-#    - please note, as of v 0.6.x or later of this plugin
-#      it is based on psutil-0.6.x; some functions that worked
-#      with psutil-0.2.x (check_psinfo v0.2-0.4) 
-#    - see contrib/ or the folloqig link for ps-util-download
-#      https://code.google.com/p/psutil
-#
-#
-#
-#NRPE_Config
-#
-#command[nrpe_check_ps_mem]=/etc/nagios/plugins/check_psinfo -t mem -w 90 -c 95
-#command[nrpe_check_ps_mem_proc]=/etc/nagios/plugins/check_psinfo -t mem -p "$ARG1$"
-#command[nrpe_check_ps_mem_proc_limit]=/etc/nagios/plugins/check_psinfo -t mem -p "$ARG1$" -w "$ARG2$" -c "$ARG3$"
-#command[nrpe_check_ps_procs]=sudo /etc/nagios/plugins/check_psinfo -t proc
-#command[nrpe_check_ps_proc_name]=sudo /etc/nagios/plugins/check_psinfo -t proc -p "$ARG1$"
-#command[nrpe_check_ps_net]=sudo /etc/nagios/plugins/check_psinfo -t net
-#command[nrpe_check_ps_net_lo]=sudo /etc/nagios/plugins/check_psinfo -t net -l "$ARG1$"
-#command[nrpe_check_ps_net_re]=sudo /etc/nagios/plugins/check_psinfo -t net -r "$ARG1$"
-#command[nrpe_check_ps_net_proc]=sudo /etc/nagios/plugins/check_psinfo -t net -p "$ARG1$"
-#command[nrpe_check_ps_iowait]=/etc/nagios/plugins/check_psinfo -t iowait -w 15 -c 40
-#command[nrpe_check_ps_iostat]=/etc/nagios/plugins/check_psinfo -t iostat -w 15 -c 40
-#command[nrpe_check_ps_users]=/etc/nagios/plugins/check_psinfo -t users -w 3 -c 5
-#command[nrpe_check_ps_uptime]=/etc/nagios/plugins/check_psinfo -t uptime
-#command[nrpe_check_ps_uptime_limits]=/etc/nagios/plugins/check_psinfo -t uptime -w "$ARG1" -c "$ARG2" 
-#command[nrpe_check_ps_nio_all]=/etc/nagios/plugins/check_psinfo -t nio
-#command[nrpe_check_ps_nio_if]=/etc/nagios/plugins/check_psinfo -t nio -n "$ARG1$"
-#command[nrpe_check_ps_nio_if_val]=/etc/nagios/plugins/check_psinfo -t nio -n "$ARG1$" -e "$ARG2"
-#command[nrpe_check_ps_nio_if_val_limits]=/etc/nagios/plugins/check_psinfo -t nio -n "$ARG1$" -e "$ARG2" -w "$ARG3" -c "$ARG4" 
-#command[nrpe_check_ps_ebury_rootkit]=sudo /etc/nagios/plugins/check_psinfo -t ebury [-e [lazy|strict|ebury] [ -p [debian|redhat|sles]] [ -f [user1,user2] ]
-#command[nrpe_check_ps_nio_all]=/etc/nagios/plugins/check_psinfo -t sockets 
-
-#
-# SERVICES_CONFIG
-# define  service {
-#         host_name               check_host
-#         service_description     psinfo_mem
-#         check_command           check_nrpe!nrpe_check_ps_mem
-#         use                     generic-service
-#         register                1
-#
-# }
-# define  service {
-#         host_name               check_host
-#         service_description     psinfo_net_3306
-#         check_command           check_nrpe!nrpe_check_ps_net_lo!3306
-#         use                     generic-service
-#         register                1
-#
-# }
-
-#
-
-#
-version = "0.7.0.22.r106 - rc3 - 2016-08-20"
-
-
-import psutil as ps
-import getopt, sys, time, os, string, socket
-import fcntl, struct
-import subprocess as sub
-
-debug = "no"
-ctype = "none"
-return_status="UNKNOWN"
-return_exit=3
-return_text="no return (default)"
-return_perfdata="none"
-
-# for -t ebury
-debsums = "/usr/bin/debsums"
-rpm = "/bin/rpm"
-
-def psinfo_help():
-    print """
-
-check_psinfo
-    nagios_plugin to check processinfo (mem, cpu, running procs)
-    and return perfdata, if available
-
-    some of the checks, when executed as nagios-user, esp. as nrpe-checks, 
-    might need to be executed using sudo; see config-examples in the header
-    of this plugin/script
-    
-USAGE
-    check_psinfo -t [type] [options]
-    
-TYPES
-    -t mem    check memory 
-        -w usage in %
-        -c usage in %
-        check_psinfo -t mem -w 80 -c 90 
-        
-        -p proc_name                                    [*]
-        -w usage in mb                                  [*]
-        -c usage in mb                                  [*]
-        check_psinfo -t mem -p apache2 -w 1024 -c 2048
-        
-        you can use this to monitor / get perfdata without 
-        alerting, just skip -c / -w 
-        check_psinfo -t mem -p apache2 
-
-    -t proc   check for processes
-        -w total nr of procs                            [*]
-        -c total nr of procs                            [*]
-        -p proc_name                                    [*]
-        eg -p apache -c 150 -w 300
-        returns CRITICAL if no processes are found 
-            
-    -t cpu    check cpu_usage
-        -w X,Y,Z warn-load for 1,5,15 min avg
-        -c X,Y,Z crit-load for 1,5,15 min avg
-        
-        this might not run on systems without /proc - filesystem
-        
-        *** 
-        Please Note: this is a relative value, depending on your 
-        ammount of available processors
-        
-        C > W > procs.OK < w < c 
-            
-            
-    -t net    check net-connections
-        -w [nr] warn-nr of connections                  [*]
-        -c [nr] crit-nr of connections                  [*]
-        -l [nr] localport  (tcp) ***                    [*]
-        -r [nr] remoteport (tcp) ***                    [*]
-        -p [name] proc_name                             [*]
-        
-        if yout want to check for net_conns on servers like apache
-        you need to execute this script with sudo-rights. 
-        
-        examples:
-        check_psinfo -t net -l 3306 -c 200 -w 100 
-        -> checks for active netconns on local port 3306
-
-        check_psinfo -t net -p apache2 -c 300 -w 200 
-        -> checks for active netconns for a process with name apache2
-        
-        check_psinfo -t net -r 5432 -c 200 -w 100 
-        -> checks for active netconns to remote port 5432                        
-        
-    -t nio    check for certain network-io-stats; if no -e is given, 
-        all stats will be returned, but -w/-c might not be used
-        -n if   give interface-name like eth0/lo etc;   [*]
-                default: stats ffor all interfaces
-        -e val  check for error-val and might be:       [*]
-                - bsent   / number of bytes sent
-                - brecv   / number of bytes received
-                - psent   / number of packets sent
-                - precv   / number of packets received
-                - errin   / total number of errors while receiving
-                - errout  / total number of errors while sending
-                - dropin  / total number of incoming packets which 
-                            were dropped   
-                - droput  / total number of outgoing packets which 
-                            were dropped (always 0 on OSX and BSD)
-        -w [nr] warn-nr of errors                       [*]
-        -c [nr] crit-nr of errors                       [*]
-        
-        examples:
-        
-        check_psinfo -t nio -n eth0 
-        -> checks for interface-stats @ eth0, used to collect
-        perf_data
-        
-        check_psinfo -t nio -n eth0 -e errin -w 10 -c 1000
-        -> checks for incoming error-stats @ eth0 and alerts
-        on given values
-        
-        ***
-
-    -t sockets
-        -T socket_check_type
-           used | tcp_inuse | tcp_orphan | tcp_tw | tcp_alloc | tcp_mem
-                | udp_inuse | udp_mem 
-           all -> returns all values as perfdata, no w/c available
-           
-           default: all
-
-        -w [nr] warn-nr of sockets                  [*]
-        -c [nr] crit-nr of sockets                  [*]
-        
-        see /cat/proc/sockstat for more info
-
-inuse 2506 orphan 2413 tw 95 alloc 2509 mem 2369
-  
-    -t uptime checks the actual uptime
-        -w [days] -> warning_number of days uptime      [*]
-        -c [days] -> critical_number of days uptime     [*]
-
-    -t users  checks for logged_in users (tested on linux)
-        -w [nr]   -> warning_number of user_logins      [*]
-        -c [nr]   -> critical_number of user_logins     [*]
-
-    -t iowait check for current iowait - status
-        -w [nr] warn-% for iowait                       [*]
-        -c [nr] crit-% for iowait                       [*]
-
-    -t iostat check for global iowait - status
-        -w [nr] warn-% for iowait                       [*]
-        -c [nr] crit-% for iowait                       [*]
-  
-    -t disk   checks for disk_free/disk_used on given path (use -p)
-        -p path give partition/path to check,           [*]
-          default: / 
-        -w [nr] warn-% for disk_free                    [*]
-        -W [nr] warn-MB for disk_free                   [*]
-        -c [nr] crit-% for disk_free                    [*]
-        -C [nr] crit-MB for disk_free                   [*]
-        you could either use -c / -w or -C  / -W
-        ***
-
-    - t ebury -> checks for signs of the ebury rootkit using ipcs
-        -p  [debian|redhat|sles] system for package -   [*] 
-            verification (debsums / rpm -V)
-            if omitted, no package-check is done
-            if package-checks fails due to missing binary (debsums)
-            or package-verify-errors, alsways produces critical
-        -u  [user] www-user; defaults to www-data, if not given
-            checks shmem for given user / or all, when called as root
-        -e  [lazy|strict|ebury] - shmem-check (defaults to ebury): 
-            lazy: shmem is allowed, no check anyway
-            strict: check against ebury & cdork-variants, might fp very
-                    often, esp. when encrypted files are mounted or suphp
-                    is used
-            ebury: check for ebury-variant only (perm: 666), skip check
-                   for cdork (perm 600)
-            default: ebury
-        -f  [user1[,user2]] - filter out processes by user, usefull if you
-            run processes which uses shared memory, e.g. postgres or encrypted
-            partitions
-            default: off
-            
-                   
-        this check should be invoked using sudo and might have a certain FP-rate
-        
-        Known FP-Triggers:
-          - postgres
-          - encrypted drives via userland
-          - suphp
-                  
-        more infos: 
-        see https://www.cert-bund.de/ebury-faq
-            http://isc.sans.edu/diary/SSHD+rootkit+in+the+wild/15229
-            https://github.com/eset/malware-ioc/tree/master/windigo
-        
-        Usage:
-        ./check_psinfo -t ebury -p debian -f posgres,user1 -e strict
-  
-    -t iface  check if network_interface [ if ] is up, CRITICAL if not
-        -n if  - give interface-name like eth0 / virbr0 etc, 
-                 defaults to eth0                       [*]
-        -i ip  - check if given ip is found on that interface, 
-                 CRITICAL if not                        [*]
-        ***
-
-MISC Options
-    -R        suppress run_time informations
-  
-    -d        debug
-    -v        version
-    -h        help
-
-Requirements:
-    - python 2.5 or later
-    - python-psutil-0.2.0 or later 
-       - 0.6.1 for any function
-       - 0.2.1 if you can skip -t mem / -t users
-    - please note, as of v 0.6.x of this plugin
-      it is based on psutil-0.6.x; some functions that worked
-      with psutil-0.2.x (check_psinfo v0.2-0.4) 
-    - see contrib/ or the folloqig link for ps-util-download
-      https://code.google.com/p/psutil
-
- """
-    
-    print """
-    Version: %s
-    """ % version
-
-def return_result():
-    end_time = time.time()
-    run_time = str((end_time - start_time) * 1000 ).split(".")
-    r1 = run_time[0]
-    r2 = run_time[1][0:2]
-    run_time = "%s.%s" % (r1, r2)
-    if return_perfdata == "none":
-        if rtime == "no":
-            perfdata = ""
-        else:
-            perfdata = "| run_time=%sms;" % run_time
-    else:
-        perfdata = " | %s " % return_perfdata
-        if rtime ==  "yes":
-            if return_perfdata[-1] != ";":
-                perfdata = "| %s; run_time=%sms;" % (return_perfdata, run_time)
-            else:
-                perfdata = "| %s run_time=%sms" % (return_perfdata, run_time)
-    print "PSInfo.%s %s %s %s " % (ctype.upper(), return_status, return_text, perfdata)
-    sys.exit(return_exit)
-
-
-def psinfo_cpu():
-    """
-    not yet ready
-    """    
-    
-    global return_status, return_text, return_perfdata, return_exit
-    
-    return_status="UNKNOWN"
-    return_exit=3
-    return_text="not yet implemented"
-    return_perfdata="none"
-    return_result()
-
-
-def print_debug(txt):
-  if debug == "yes":
-    print "[d] - %s" % txt
-
-
-def psinfo_uptime():
-    """
-    """    
-    
-    global return_status, return_text, return_perfdata, return_exit
-    
-    # defaults
-    wd = 180    
-    cd = 360
-
-    if wv != "no":
-        try:
-            wd = int(wv)
-        except:
-            print "-w must be integer"
-            sys.exit(3)
-        try:
-            cd = int(cv)
-        except:
-            print "-c must be integer"
-            sys.exit(3)
-
-    now_time    = time.time()
-    boot_time   = ps.BOOT_TIME
-    up_time     = now_time - boot_time
-    up_hours    = int(up_time / 3600)
-    up_days     = int(up_time / 86400)
-
-    if up_days == 0:
-        up_txt = "< 24hrs (%s hrs)" % (up_hours)
-    elif up_days == 1:
-        up_txt = "1 day (%s hrs)" % up_hours
-    else:
-        up_txt = "%s days" % up_days
-
-    if up_time  > (cd * 86400):
-        return_status="CRITICAL"
-        return_exit=2
-    
-    elif up_time  > (wd * 86400):
-        return_status="WARNING"
-        return_exit=1
-    else:
-        return_status="OK"
-        return_exit=0
-
-    return_text="%s" % (up_txt)
-    return_perfdata="uptime=%s days;" % up_days
-    return_result()
-
-def psinfo_iface(iface):
-    
-    global return_status, return_text, return_exit
-    
-    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    sockfd = sock.fileno()
-    SIOCGIFADDR = 0x8915
-    ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
-    try:
-        res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
-    except:
-        # interface fails 
-        # now check, if iface is there anyway using ifconfig
-        res_found = 0
-        i = sub.Popen("/sbin/ifconfig", shell=True, stdout=sub.PIPE).stdout.readlines() 
-        for res in i:
-            if res.find(iface) > -1:
-                return_status="WARNING"
-                return_exit=1
-                return_text="IFace %s is Available / No IP :: %s" % (iface, res.replace("  ", " "))
-                return_result()
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="IFace %s is DOWN " % (iface)
-        return_result()
-
-    xip = struct.unpack('16sH2x4s8x', res)[2]
-    sip = socket.inet_ntoa(xip)
-    if sip == None:
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="IFace %s is DOWN" % (iface)
-        return_result()
-    if ip == "no":
-        return_status="OK"
-        return_exit=0
-        return_text="IFace %s is UP [ %s ]" % (iface, sip)
-        return_result()        
-
-    if sip == ip:
-        return_status="OK"
-        return_exit=0
-        return_text="IFace %s is UP / IP = %s" % (iface, sip)
-        return_result()        
-    else:
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="IFace %s is UP / IP should be: %s is: %s" % (iface, ip, sip)
-        return_perfdata=""
-        return_result()        
-
-    return_status="UNKNOWN"
-    return_exit=0
-    return_text="IFace %s is UP / IP = %s " % (iface, ip)
-    return_result()        
-
-def psinfo_nio(action="all", iface="all"):
-
-    """
-    psinfo_nio -> show netio_stats 
-    
-    """    
-
-    global return_status, return_text, return_perfdata, return_exit
-    
-    if iface == "all":
-        nior = ps.network_io_counters(pernic=False)
-    else:
-        niox = ps.network_io_counters(pernic=True)
-        nior = niox[iface]
-
-
-    
-    w = 0
-    c = 0
-    check_wc = "no"
-    return_text="NetIO-Stats if:%s.%s" % (iface, action)
-    
-    if wv != "no":
-        try:
-            w = int(wv)
-            check_wc = "yes"
-        except:
-            print "-w must be integer"
-            sys.exit(3)
-
-        try:
-            c = int(cv)
-            check_wc = "yes"
-        except:
-            print "-c must be integer"
-            sys.exit(3)
-
-
-    bsent = nior.bytes_sent
-    brecv = nior.bytes_recv
-    psent = nior.packets_sent
-    precv = nior.packets_recv
-    errin = nior.errin
-    errout= nior.errout
-    dropin= nior.dropin
-    dropout=nior.dropout
-    
-    cval = 0
-    if action == "bsent":
-        return_perfdata="bytes_sent=%s;%s;%s;" % (bsent, w, c)
-        cval = bsent
-    elif action == "brecv":
-        return_perfdata="bytes_received=%s;%s;%s;" % (brecv, w, c)
-        cval = brecv
-    elif action == "psent":
-        return_perfdata="packets_sent=%s;%s;%s;" % (psent, w, c)
-        cval = psent
-    elif action == "precv":
-        return_perfdata="packets_received=%s;%s;%s;" % (precv, w, c)
-        cval = precv
-    elif action == "errin":
-        return_perfdata="errin=%s;%s;%s;" % (errin, w, c)
-        cval = errin
-    elif action == "errout":
-        return_perfdata="errout=%s;%s;%s;" % (errout, w, c)
-        cval = errout
-    elif action == "dropin":
-        return_perfdata="dropin=%s;%s;%s;" % (dropin, w, c)
-        cval = dropin
-    elif action == "dropout":
-        return_perfdata="dropout=%s;%s;%s;" % (dropout, w, c)
-        cval = dropout
-    else:
-        check_wc = "no"
-        return_perfdata = "bytes_sent=%s;bytes_received=%s;packets_sent=%s;packets_received=%s;errin=%s;errout=%s;dropin=%s;dropout=%s;" % (bsent, brecv, psent, precv, errin, errout, dropin, dropout)
-
-    if check_wc == "no":
-        return_status="OK"
-        return_exit=0
-        return_result()
-
-    if cval > c:
-        return_status="CRITICAL"
-        return_exit=2
-        return_result()
-        
-    elif cval > w:
-        return_status="WARNING"
-        return_exit=1
-        return_result()
-    
-    return_status="OK"
-    return_exit=0
-    return_result()
-    
-def psinfo_ebury():
-  """
-  psinfo_ebury - checks for signs of ebury - 
-  """
-  global return_status, return_text, return_perfdata, return_exit
-
-
-  return_status="OK"
-  return_exit=0
-  return_text="nothing suspicious found"
-  return_perfdata = "ebury_checks: "
-
-  # checking for packages
-  
-  pkg = pv
-  if pkg == "debian":
-    pkg_verify = debsums 
-    pkgs = ["openssh-server", "openssh-client"]
-  elif pkg == "redhat":
-    pkg_verify = rpm
-    pkgs = ["openssh", "openssh-clients", "openssh-server"]
-  elif pkg == "sles":
-    pkg_verify = rpm
-    pkgs = ["openssh"]
-
-  else:
-    print_debug("skipping pkg-verify") 
-    pkg_verify = "/bin/true"
-    pkgs = []
-  
-  print_debug("package-system: %s - %s" % (pkg, pkg_verify)) 
-  prg = pkg_verify.split(" ")[0]
-  log_out = sub.PIPE  
-  if os.path.isfile(pkg_verify) and os.access(pkg_verify, os.X_OK):
-    #
-    # deal with rpm -V detecting changes in /etc/ssh, GNARF!
-    # 
-    
-    for pack in pkgs:
-      res = sub.Popen([pkg_verify, pack], 
-          stdout=log_out, 
-          stderr=log_out)
-      out,err = res.communicate()
-      pok = res.returncode
-        
-      if pok != 0:
-        print_debug(" > package-error in: %s" % pack)
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="package verify error"
-        return_perfdata += "pckg.error: %s / %s,  " % (pack, err)
-
-  else:
-    print_debug(" > package-error: no bin found for %s" % pkg_verify)
-    return_status="WARNING"
-    return_exit=1
-    return_text="package verify error: no bin found for %s,  " % (pkg_verify)
-    return_perfdata += "pckg.error: no bin found for %s,  " % (pkg_verify)
-
-  
-
-  # checking shmem
-  
-  if nio == "lazy":
-    print_debug("lazy.skipping strict shmem-check") 
-  else:
-    p1 = sub.Popen(["ipcs", "-m"], 
-            stdout=log_out, 
-            stderr=log_out)
-    out,err = p1.communicate()
-    out = out.split("\n")
-    print_debug("\n".join(out))
-    lc = []
-    dcount = 0
-    ecount = 0
-    if len(out) > 0:      
-      for l in out:
-        v = l.split()
-        if len(v) < 5:
-          print_debug("> line to short, skipping %s" % l)
-          continue
-        try:
-          perm = int(v[3])
-          byte = int(v[4])
-          user = v[2]
-        except:
-          #print_debug(l)
-          continue
-        if user in filters:
-          print_debug("skipping user: %s" % user)
-          continue
-        if perm == 666:
-          ecount += 1
-          lc.append(l)
-          if byte > 3000000:
-            return_status="CRITICAL"
-            return_exit=2
-            return_text="shmem-check failed"
-          else:
-            if return_status == "OK":
-              return_status="WARNING"
-              return_exit=1
-              return_text="shmem-check failed"
-        if nio == "strict":
-          if perm == 600:
-            dcount += 1
-            lc.append(l)
-            if byte > 3000000:
-              return_status="CRITICAL"
-              return_exit=2
-              return_text="shmem-check failed"
-            else:
-              if return_status == "OK":
-                return_status="WARNING"
-                return_exit=1
-                return_text="shmem-check failed"
-
-      if len(lc) > 0:
-        if return_status == "OK":
-          return_status="WARNING"
-          return_exit=1
-          return_text="shmem-check failed"
-        
-      return_perfdata += "shmem-entries=%s; ebury=%s; cdork=%s; %s, " % (len(lc), ecount, dcount,  "\n".join(lc))
-      #print_debug("shmem: %s" % ("\n".join(out)))
-
-    print_debug("> shmem-check: %s" % "\n".join(lc))
-  return_result()
-
-def psinfo_sockets():
-    """
-
-    psinfo_sockets -> show socket_status from cat /proc/net/sockstat
-
-    """    
-
-    global return_status, return_text, return_perfdata, return_exit
-    
-    w = 1000
-    c = 2000
-
-    sock_stat = os.popen("cat /proc/net/sockstat").readlines()
-    #~ sock_stat = """sockets: used 260
-#~ TCP: inuse 2506 orphan 2413 tw 95 alloc 2509 mem 2369
-#~ UDP: inuse 7 mem 3
-#~ UDPLITE: inuse 0
-#~ RAW: inuse 0
-#~ FRAG: inuse 0 memory 0""".split("\n")
-    #~ 
-    sock_used = 0
-    sock_tcp_inuse = 0
-    sock_tcp_orphan = 0
-    sock_tcp_tw = 0
-    sock_tcp_alloc = 0
-    sock_tcp_mem = 0
-    sock_udp_inuse = 0
-    sock_udp_mem = 0
-    sock_raw_inuse = 0
-    sock_frg_inuse = 0
-    sock_frg_memory = 0
-    
-    
-    for line in sock_stat:
-      if line.find("sockets:") > -1:
-        sock_used = line.split("used")[1].strip()
-        continue
-      elif line.find("TCP:") > -1:
-        sock_tcp_inuse  = line.split("inuse")[1].split()[0].strip()
-        sock_tcp_orphan  = line.split("orphan")[1].split()[0].strip()
-        sock_tcp_tw  = line.split("tw")[1].split()[0].strip()
-        sock_tcp_alloc  = line.split("alloc")[1].split()[0].strip()
-        sock_tcp_mem  = line.split("mem")[1].strip()
-        continue
-      elif line.find("UDP:")  > -1:
-        sock_udp_inuse  = line.split("inuse")[1].split()[0].strip()
-        sock_udp_mem  = line.split("mem")[1].split()[0].strip()
-        continue
-      elif line.find("RAW:") > -1:
-        sock_raw_inuse  = line.split("inuse")[1].split()[0].strip()
-        continue
-      elif line.find("FRAG:") > -1:
-        sock_frg_inuse  = line.split("inuse")[1].split()[0].strip()
-        sock_frg_mem  = line.split("memory")[1].split()[0].strip()
-        continue
-      
-    # TODO: implement more emthods than ALL
-    
-    perfdata="used=%s; tcp_inuse=%s; tcp_orphan=%s; tcp_tw=%s; tcp_alloc=%s; tcp_mem=%s; udp_inuse=%s; udp_mem=%s; raw_inuse=%s; frag_inuse=%s; frag_mem=%s;" % \
-    (    sock_used, sock_tcp_inuse, sock_tcp_orphan, sock_tcp_tw, sock_tcp_alloc, sock_tcp_mem, sock_udp_inuse, sock_udp_mem, sock_raw_inuse, sock_frg_inuse, sock_frg_memory)
-    return_status="OK"
-    return_exit=0
-    return_text="socket_stat"
-    return_perfdata=perfdata
-    return_result()
-
-
-def psinfo_net():
-    """
-    psinfo_net -> show net_status (using netstat -aln)
-    
-    """    
-
-    global return_status, return_text, return_perfdata, return_exit
-    
-    w = 100
-    c = 250
-    
-    
-    l_port = lv
-    r_port = rv
-    
-    if wv != "no":
-        try:
-            w = int(wv)
-        except:
-            pass        
-        try:
-            c = int(cv)
-        except:
-            pass                
-        
-    n_c = 0
-    port_info = ""
-    net_stat = os.popen("netstat -altn").readlines()
-    #n_c = len(net_stat)
-    for line in net_stat:
-        lx = line.split()
-        try:
-            lo = lx[3].strip()
-            re = lx[4].strip()
-            lop = string.split(lo, ":")[1].strip()
-            rep = string.split(re, ":")[1].strip()
-        except:
-            continue
-        if l_port != "no":
-            port_info = "[ local:%s ]" % l_port
-            try:
-                if int(lop) == int(l_port):
-                    n_c += 1
-                continue
-            except:
-                continue
-                
-        elif r_port != "no":
-            port_info = "[ remote:%s ]" % r_port    
-            try:
-                if int(rep) == int(r_port):
-                    n_c += 1
-                continue    
-            except:
-                continue
-        n_c += 1
-
-    if wv == "no":
-        return_status="OK"
-        return_exit=0
-        return_text="net_connections %s %s " % (n_c, port_info)
-        return_perfdata="net_con=%s;" % (n_c)
-        return_result()
-        
-    if n_c >= c:
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="Too many net_connections %s %s " % (n_c, port_info)
-        return_perfdata="net_con=%s;%s;%s;" % (n_c, w, c)
-        return_result()
-    
-    elif n_c >= w:
-        return_status="WARNING"
-        return_exit=1
-        return_text="Too many net_connections %s %s " % (n_c, port_info)
-        return_perfdata="net_con=%s;%s;%s;" % (n_c, w, c)
-        return_result()
-    
-    return_status="OK"
-    return_exit=0
-    return_text="net_connections within limits %s %s " % (n_c, port_info)
-    return_perfdata="net_con=%s;%s;%s;" % (n_c, w, c)
-    return_result()
-            
-
-def psinfo_iowait():
-    """
-    psinfo_iowait -> show iowait_status (needs iostat)
-    
-    """    
-
-    global return_status, return_text, return_perfdata, return_exit
-    
-    w = 20
-    c = 40
-    
-    
-    if wv != "no":
-        try:
-            w = int(wv)
-        except:
-            pass        
-        try:
-            c = int(cv)
-        except:
-            pass                
-        
-    io_wait = os.popen("iostat -c 1 2").readlines()
-    #n_c = len(net_stat)
-    lc = 0
-    wl = 0
-    wf = "no"
-    for line in io_wait:
-        
-        if line.find("iowait") > 1:
-            if lc < 4:
-                lc += 1
-                continue
-                
-            try:
-                wl = io_wait[lc+1].split()[3].replace(",", ".")
-                wf = "yes"
-                break
-            except:
-                pass 
-        lc += 1
-
-    if wf == "no":
-        return_text = "no value for iowait found"
-        return_exit()
-            
-    if wv == "no":
-        return_status="OK"
-        return_exit=0
-        return_text="io_wait_status -> %s " % (wl)
-        return_perfdata="io_wait=%s;" % (wl)
-        return_result()
-        
-    if float(wl) >= float(c):
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="IO_WAIT Too High -> %s  " % (wl)
-        return_perfdata="io_wait=%s;%s;%s;" % (wl, w, c)
-        return_result()
-    
-    elif float(wl) >= float(w):
-        return_status="WARNING"
-        return_exit=1
-        return_text="IO_WAIT High -> %s  " % (wl)
-        return_perfdata="io_wait=%s;%s;%s;" % (wl, w, c)
-        return_result()
-    
-    return_status="OK"
-    return_exit=0
-    return_text="io_wait within limits %s " % (wl)
-    return_perfdata="io_wait=%s;%s;%s;" % (wl, w, c)
-    return_result()
-
-
-def psinfo_iostat():
-    """
-    psinfo_iostat -> show global iowait_status (needs iostat)
-    
-    """    
-
-    global return_status, return_text, return_perfdata, return_exit
-    
-    w = 20
-    c = 40
-    
-    
-    if wv != "no":
-        try:
-            w = int(wv)
-        except:
-            pass        
-        try:
-            c = int(cv)
-        except:
-            pass                
-        
-    io_wait = os.popen("iostat -c").readlines()
-    #n_c = len(net_stat)
-    lc = 0
-    wl = 0
-    wf = "no"
-    for line in io_wait:
-        
-        if line.find("iowait") > 1:
-                
-            try:
-                wl = io_wait[lc+1].split()[3].replace(",", ".")
-                wf = "yes"
-                break
-            except:
-                pass 
-        lc += 1
-
-    if wf == "no":
-        return_text = "no value for iowait found"
-        return_exit()
-            
-    if wv == "no":
-        return_status="OK"
-        return_exit=0
-        return_text="io_stat_status -> %s " % (wl)
-        return_perfdata="io_stat=%s;" % (wl)
-        return_result()
-        
-    if float(wl) >= float(c):
-        return_status="CRITICAL"
-        return_exit=2
-        return_text="IO_STAT Too High -> %s  " % (wl)
-        return_perfdata="io_stat=%s;%s;%s;" % (wl, w, c)
-        return_result()
-    
-    elif float(wl) >= float(w):
-        return_status="WARNING"
-        return_exit=1
-        return_text="IO_STAT High -> %s  " % (wl)
-        return_perfdata="io_stat=%s;%s;%s;" % (wl, w, c)
-        return_result()
-    
-    return_status="OK"
-    return_exit=0
-    return_text="io_stat within limits %s " % (wl)
-    return_perfdata="io_stat=%s;%s;%s;" % (wl, w, c)
-    return_result()
-            
-
-def psinfo_proc():
-    """
-    
-    """    
-    global return_status, return_text, return_perfdata, return_exit
-    
-    # defaults
-    w = 5
-    c = 10
-    
-    
-
-    xll = ps.get_pid_list()
-    proc_c = 0
-    p_c = 0
-    for pid in xll:
-        p_c += 1
-        try:
-            pn = ps.Process(pid)
-            pn = pn.name
-        except:
-            continue
-            
-        if pn == pv:
-            proc_c +=1
-
-
-    if pv == "no":
-        return_status="OK"
-        return_exit=0
-        return_text="%s procs running)" % (p_c)
-        return_perfdata="procs=%s;" % p_c
-        return_result()     
-
-    if wv == "no":
-        if proc_c > 0:
-            return_status="OK"
-            return_exit=0
-            return_text="%s (%s procs running)" % (pv, proc_c)
-            return_perfdata="procs=%s;" % proc_c
-            return_result()
-        else:
-            return_status="CRITICAL"
-            return_exit=2
-            return_text="No processes found for %s " % pv
-            return_perfdata="procs=0;"
-            return_result()
-    
-    else:
-        try:
-            w = int(wv)
-        except:
-            pass
-    
-        try:
-            c = int(cv)
-        except:
-            pass
-
-        if proc_c > 0:
-            pass
-        else:
-            return_status="CRITICAL"
-            return_exit=2
-            return_text="No processes found for %s " % pv
-            return_perfdata="procs=0;"
-            return_result()
-
-
-        if proc_c > c:
-            return_status="CRITICAL"
-            return_exit=2
-            return_text="Too many processes for %s (%s procs running)" % (pv, proc_c)
-            return_perfdata="procs=%s;%s;%s;" % (proc_c, w, c)
-            return_result()
-        
-        elif proc_c > w:
-            return_status="WARNING"
-            return_exit=1
-            return_text="Too many processes for %s (%s procs running)" % (pv, proc_c)
-            return_perfdata="procs=%s;%s;%s;" % (proc_c, w, c)
-            return_result()
-        
-        return_status="OK"
-        return_exit=0
-        return_text=" %s (%s procs running)" % (pv, proc_c)
-        return_perfdata="procs=%s;%s;%s;" % (proc_c, w, c)
-        return_result()
-    
-    
-
-
-    return_result()
-
-
-def psinfo_users():
-    """
-    defaults: 
-        w: NIL
-        c: NIL
-        
-    """    
-    
-    global return_status, return_text, return_perfdata, return_exit
-    
-    c = 30
-    w = 50
-    check_numbers = "no"
-    
-    if wv != "no":
-        check_numbers = "yes"
-        try:
-            w = int(wv)
-        except:
-            print "-w must be integer"
-            sys.exit(3)
-        try:
-            c = int(cv)
-        except:
-            print "-c must be integer"
-            sys.exit(3)
-    
-    lusers = ps.get_users()
-    luser_list = ""
-    
-    for luser in lusers:
-        login_time = time.strftime("%Y-%d-%m.%H:%M", time.localtime(float(luser[3])))
-        luser_list += "%s@%s[%s] " % (luser[0], luser[2], login_time)
-
-
-    return_status="OK"
-    return_exit=1
-    
-    if check_numbers == "yes":
-        if len(lusers) >= c:
-            return_status="CRITICAL"
-            return_exit=2
-        
-        elif len(lusers) >= w:
-            return_status="WARNING"
-            return_exit=1
-
-    
-
-    return_text="%s Users logged in" % len(lusers)
-    return_perfdata="users=%s;%s" % (len(lusers),luser_list)
-    
-    return_result()
-
-def psinfo_mem():
-    """
-    defaults: 
-        w: 80%
-        c: 90%
-        
-    """    
-    
-    global return_status, return_text, return_perfdata, return_exit
-    
-    w = 80
-    c = 90
-    
-    if pv != "no":
-        w = ""
-        c = ""
-        check_vals = "yes"
-        if wv == "no":
-            check_vals = "no"
-        else:
-            try:
-                w = int(wv)
-            except:
-                check_vals = "no"
-            try:
-                c = int(cv)
-            except:
-                check_vals = "no"
-
-       
-        xll = ps.get_pid_list()
-        proc_c = 0
-        mem_c = 0
-        for pid in xll:
-            try:
-                px = ps.Process(pid)
-                pn = px.name
-                pm = px.get_memory_info()
-            except:
-                continue
-                
-            if pn == pv:
-                proc_c += 1
-                mem_c = mem_c +  pm[0]
-        mem_c_mb = mem_c / (1024*1024)
-        
-        if proc_c > 0:
-            pass
-        else:
-            return_status="CRITICAL"
-            return_exit=2
-            return_text="No processes found for %s " % pv
-            return_perfdata="procs=0;"
-            return_result()
-
-        return_status="OK"
-        return_exit=0
-        return_text="Memory within limits for process %s (%s MB)" % (pv, mem_c_mb)
-        return_perfdata="proc_mem=%s;%s;%s;" % (mem_c_mb, w, c)
-
-
-        if check_vals == "yes":
-            if mem_c_mb >= c:
-                return_status="CRITICAL"
-                return_exit=2
-                return_text="Too much memory for process %s (%s MB)" % (pv, mem_c_mb)
-            
-            elif mem_c_mb >= w:
-                return_status="WARNING"
-                return_exit=1
-                return_text="Too much memory for process %s (%s MB)" % (pv, mem_c_mb)
-        
-        return_result()
-        
-
-    
-    if wv != "no":
-        wxv = wv.replace("%", "")
-        try:
-            w = int(wxv)
-        except:
-            pass
-    
-    if cv != "no":
-        cxv = cv.replace("%", "")
-        try:
-            c = int(cxv)
-        except:
-            pass
-
-    totalm  = ps.virtual_memory().total 
-    
-    usedm   = ps.virtual_memory().used
-    freem   = ps.virtual_memory().free
-
-    total_buff = ps.virtual_memory().buffers
-    total_cache = ps.virtual_memory().cached
-
-    real_used = usedm - total_buff - total_cache
-    real_free = totalm - real_used
-    
-    total_mb = int(totalm / (1024*1024))
-    used_mb  = int(usedm / (1024*1024))    
-    free_mb  = int(freem / (1024*1024))    
-
-    realu_mb = int(real_used / (1024*1024))    
-    realf_mb = int(real_free / (1024*1024))    
-    
-    warn_value = int(total_mb * w / 100)
-    crit_value = int(total_mb * c / 100)
-    
-    #print "t: %s :: f: %s :: u: %s  :: ru : %s :: rf: %s" % (total_mb, free_mb, used_mb, realu_mb, realf_mb)
-
-    used_ratio = real_used * 100 / totalm
-
-    return_perfdata = "free_mb=%s;%s;%s; used_mb=%s;%s;%s; total_mb=%s;%s;%s;" % (realf_mb, warn_value, crit_value, realu_mb, warn_value, crit_value, total_mb, warn_value, crit_value )
-
-    if used_ratio >= c:
-        return_status = "CRITICAL"
-        return_exit = 2
-        return_text = "Very Low Memory (%s %s used of %sMB ) " % (used_ratio, "%", total_mb)  
-        return_result()
-    if used_ratio >= w:
-        return_status = "WARNING"
-        return_exit = 1
-        return_text = "Low Memory (%s %s used of %sMB ) " % (used_ratio, "%", total_mb)  
-        return_result()
-
-    return_status = "OK"
-    return_exit = 0
-    return_text = "Memory (%s %s used of %sMB ) " % (used_ratio, "%", total_mb)  
-    return_result()
-    
-        
-    
-    
-    
-wv      = "no"
-cv      = "no"
-pv      = "no"
-lv      = "no"
-rv      = "no"
-ip      = "no"
-ifd     = "eth0"
-nio     = "all"
-iface   = "all"
-rtime   = "yes"    
-shmem_check_user = "www-data"
-filters = []
-
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "s:c:w:t:p:l:r:i:n:e:u:f:hdzvR", 
-        ["help", "script", "debug" ])
-except getopt.GetoptError, err:
-    # print help information and exit:
-    print str(err) # will print something like "option -a not recognized"
-    psinfo_help()
-    sys.exit(2)
-
-
-
-for o, a in opts:
-    #print "o :: " + o + "   <-->  a: " + a
-    if o in ("-h", "--help"):
-        psinfo_help()
-        sys.exit()
-        
-
-    elif o in ("-w", "--warning"):
-        wv = "%s" % a
-    elif o in ("-c", "--critical"):
-        cv = "%s" % a
-        
-    elif o == "-t":
-        ctype = "%s" % a
-
-    elif o == "-e":
-        nio = "%s" % a
-
-    elif o == "-u":
-        shmem_check_user = "%s" % a
-    
-    elif o == "-d":
-        debug = "yes"
-
-    elif o == "-p":
-        pv = "%s" % a 
-
-    elif o == "-i":
-        ip = "%s" % a 
-
-    elif o == "-f":
-        filters = a.split(",")
-        # for ebury-checks 
-
-    elif o == "-n":
-        ifd = "%s" % a 
-        iface = ifd
-        
-    elif o == "-l":
-        try:
-            lv = int(a)
-        except:
-            print "value for -l must be integer"
-            sys.exit(3)
-
-    elif o == "-r":
-        try:
-            rv = int(a)
-        except:
-            print "value for -r  must be integer"
-            sys.exit(3)
-            
-    elif o == "-R":
-        rtime = "no" 
-
-    
-    else:
-        psinfo_help()
-        sys.exit(2)        
-
-if len(sys.argv) == 1:
-    psinfo_help()
-    sys.exit(0)
-
-
-# version-check
-req_version = (2,5)
-cur_version = sys.version_info
-if not cur_version >= req_version:
-  return_status="WARNING"
-  return_exit=1
-  return_text="python-version not supported; required: %s, your version: %s,%s" % (req_version, cur_version[0], cur_version[1] )
-  return_perfdata = "ebury_checks: "
-  
-  return_result 
-
-start_time = time.time()
-
-
-
-if ctype == "none":
-    psinfo_help()
-    sys.exit(0)
-
-elif ctype == "mem":
-    psinfo_mem()
-    return_result()
-    
-elif ctype == "cpu":
-    psinfo_cpu()
-    return_result()
-
-elif ctype in ("proc", "procs"):
-    psinfo_proc()
-    return_result()
-        
-elif ctype == "net":
-    psinfo_net()
-    return_result()
-
-
-elif ctype == "sockets":
-    psinfo_sockets()
-    return_result()
-
-elif ctype == "nio":
-    psinfo_nio(nio, iface)
-    return_result()
-
-elif ctype == "uptime":
-    psinfo_uptime()
-    return_result()
-
-elif ctype == "iowait":
-    psinfo_iowait()
-    return_result()
-
-elif ctype == "users":
-    psinfo_users()
-    return_result()
-
-elif ctype == "iostat":
-    psinfo_iostat()
-    return_result()
-
-elif ctype == "iface":
-    psinfo_iface(ifd)
-    return_result()
-
-elif ctype == "ebury":
-    psinfo_ebury()
-    return_result()
-
-else:
-    psinfo_help()
-    sys.exit(2)
-    
-
-# 
-
-#~ meminfo
-#~ =======
-#~ 
-#~ In meminfo, you're probably most interested in the fields MemTotal and
-#~ MemFree (and possibly Buffers and Cached if you want to see how much
-#~ of the used memory is in fact cache rather than user programs). You
-#~ might also want to look at SwapTotal and SwapFree.
-#~ 
-#~ The following just dumps all the lines from /etc/meminfo into a
-#~ dictionary (str:int):
-#~ 
-#~ # I thought a regex would be the easiest way to do this.
-#~ import re
-#~ re_parser = re.compile(r'^(?P<key>\S*):\s*(?P<value>\d*)\s*kB' )
-#~ def meminfo():
-#~ """-> dict of data from meminfo (str:int).
-#~ Values are in kilobytes.
-#~ """
-#~ result = dict()
-#~ for line in open('/proc/meminfo'):
-#~ match = re_parser.match(line)
-#~ if not match:
-#~ continue # skip lines that don't parse
-#~ key, value = match.groups(['key', 'value'])
-#~ result[key] = int(value)
-#~ return result
-#~ 
-#~ 
-#~ stat
-#~ ====
-#~ /proc/stat contains the CPU info you need.
-#~ 
-#~ In stat, you can look at the first four fields of each "cpu" record,
-#~ for example on my machine:
-#~ $ cat /proc/stat
-#~ cpu 63888 1648769 11015 494 998 799 59339 0
-#~ cpu0 63888 1648769 11015 494 998 799 59339 0
-#~ intr 9483429 148 2 0 0 4 0 0 0 3 0 0 0 4 0 0 321118 105939 0 3 35085
-#~ 32465 8988658 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-#~ ctxt 4526886
-#~ btime 1201376745
-#~ processes 7197
-#~ procs_running 2
-#~ procs_blocked 0
-#~ 
-#~ The cpu record refers to all processor cores, while cpuN refers to
-#~ each CPU or CPU core individually.
-#~ 
-#~ Unless things are more complicated than they appear, to get the busy
-#~ time fraction:
-#~ 
-#~ def cpuusage():
-#~ """-> dict of cpuid : (usertime, nicetime, systemtime, idletime)
-#~ cpuid "cpu" means the total for all CPUs.
-#~ cpuid "cpuN" means the value for CPU N.
-#~ """
-#~ wanted_records = [line for line in open('/proc/stat') if
-#~ line.startswith('cpu')]
-#~ result = {}
-#~ for cpuline in wanted_records:
-#~ fields = cpuline.split()[:5]
-#~ data = map(int, fields[1:])
-#~ result[fields[0]] = tuple(data)
-#~ return result
-#~ 
-#~ The manpage points out that the contents of /proc/stat can vary by
-#~ architecture, though I would guess at least the "cpu" line would be
-#~ available on all.
-#~ 
-#~ 
-#~ loadavg
-#~ =======
-#~ You can get the load average and the other information in /proc/
-#~ loadavg with:
-#~ 
-#~ def loadavg():
-#~ """-> 5-tuple containing the following numbers in order:
-#~ - 1-minute load average (float)
-#~ - 5-minute load average (float)
-#~ - 15-minute load average (float)
-#~ - Number of threads/processes currently executing (<= number of
-#~ CPUs) (int)
-#~ - Number of threads/processes that exist on the system (int)
-#~ - The PID of the most recently-created process on the system (int)
-#~ """
-#~ loadavgstr = open('/proc/loadavg', 'r').readline().strip()
-#~ data = loadavgstr.split()
-#~ avg1, avg5, avg15 = map(float, data[:3])
-#~ threads_and_procs_running, threads_and_procs_total = map(int,
-#~ data[3].split('/'))
-#~ most_recent_pid = int(data[4])
-#~ return avg1, avg5, avg15, threads_and_procs_running,
-#~ threads_and_procs_total, most_recent_pid
diff --git a/check_psinfo.md b/check_psinfo.md
deleted file mode 100644
index a14606c..0000000
--- a/check_psinfo.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
-# CHECK_PSINFO - nagios_plugin for processinformations with perfdata
-
-- download: https://bitbucket.org/maresystem/dogtown-nagios-plugins/
-
-
-
-## Installation and Configuration
-
-- see check_psinfo -h
-- Requirements: 
-  - python 2.5 -  2.x
-  - psutil 0.6 or above for all modules, 0.2 for minimal checks (might
-    fail on mem/users - check)
-
-
-
-## Checks
-
-- see check_psinfo -h
-
-
-### Check for signs of Ebury - Rootkit
-
-Please note: this is just a simple check on certain signs
-in shared memory-segments that MIGHT give a hint, if a system 
-is infected. rkhunter or chckrootkit would be better tools
-for detection, but (as of feb 2014), both fail on detection. 
-
-An additional check runs against the system's package-manager 
-
-~~~
-
-USAGE 
-
-check_psinfo -h
-
-
-~~~ 
-
-
-** References **
-
-- https://www.cert-bund.de/ebury-faq
-- http://isc.sans.edu/diary/SSHD+rootkit+in+the+wild/15229
-- https://www.mare-system.de/blog/page/1395263085/
-
-
-
-
diff --git a/check_redis b/check_redis
deleted file mode 100755
index 72b7d0e..0000000
--- a/check_redis
+++ /dev/null
@@ -1,314 +0,0 @@
-#!/usr/bin/python
-#
-# (c) copyright 2017 dogtown@mare-system.de
-# 
-# License: GPL v2 
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins
-#
-# Requirement: python-redis 
-#
-
-import string, urllib2, getopt, sys, time, os
-
-import redis
-
-
-# default host to check
-host    = "127.0.0.1"
-
-# default redis-port
-port    = 6379
-
-
-version = "0.0.1 alpha 1"
-
-
-# definitions
-
-
-def usage():
-   print """
-   
-check_redis_status is a Nagios-Plugin
-to monitor redis status and alerts on various values, 
-
-
-Usage:
-
-    check_redis [-H|--HOST] [-p|--port] [-D|--DB]
-                       [-t|--test] [-w|--warning] [-c|--critical]
-                       [-h|--help] [-v|--version] [-d|--debug]
-
-
-Options:
-
-  --help|-h)
-    print check_redis help
-
-  --HOST|-H)
-    Sets redis_host
-    Default: localhost
-  
-  --port|-p)
-    Sets connection-port 
-    Default: 6379
-  
-  --DB|-D)
-    sets db to use
-    Default: 0
-  
-  
-  --test|-t)
-    Sets the test(check)_value for w/c
-    if used, -w/-c is mandatory
-    Default: keylen
-    possible Values:
-
-        keylen          -> check how many keys are in redis
-        used_mem        -> check used memory in MB
-        clients         -> check for connected clients
-        
-  --warning|-w)
-    Sets a warning level for selected test(check)
-    Default: off
-  
-  --critical|-c)
-    Sets a critical level for selected test(check)
-    Default: off
-    
-  --debug|-d)
-    turn on debugging - messages (use this for manual testing, 
-    never via nagios-checks; beware of the messy output
-    Default: off 
-    
-  --version|-v)
-    display version and exit
-
-
-    
-    *** ) -> please dont use this option, not implemented or not functional
-
-Examples:
-
-    just check if online and get all perfdata
-    ./check_redis
-
-    just get active client_connections perfdata
-    ./check_redis -t clients [-w 100 -c 200] 
-    
-    check for the legnth of storey keys (get keys * | wc -l )
-    ./check_redis -t keylen  -w 1000 -c 5000
-    
-    check used mekory (in mb)
-    ./check_redis -t used_mem -w 500 -c 1000
-
-Performancedata:
-    
-    Redis.Check OK | ac=1;used_mem=123;keylen=1024
-
-        ac        -> active connections
-        used_mem  -> currently used memory
-        keylen    -> how many keys are stored in redis
-
-
-
-    
-Requirements:
-
-
-    python 2.x
-    python-redis
-
-Docs & Download:
-
-        https://bitbucket.org/maresystem/dogtown-nagios-plugins
-    
-            """
-
-def ver():
-    print """
-check_redis
-    version : %s
-    
-    usage   : check_redis -h
-    
-    """ % version
-
-def print_debug(dtext):
-    if debug == 1:
-        print "[d] %s" % dtext
-    return(0)
-
-
-
-
-#### main 
-
-exot = 0
-ssl = 0
-debug = 0
-test = 0
-w = c = 0
-output = 0
-user = passwd = 0
-msg = "CheckRedis.Conn - UNKNOWN"
-perfdata = ""
-db = 0
-
-
-try:
-    iv = sys.argv[1]
-except:
-    print """
-    
-usage: check_redis -h
-
------------------------------------------------------"""
-    usage()
-    sys.exit(3)
-    
-
-try:
-    options,args = getopt.getopt(sys.argv[1:],"ndovshH:D:p:w:c:t:r:",["help","debug","HOST","port","auth","test","warning","critical", "output", "resultfile", "noresult", "DB"])
-
-except getopt.GetoptError:
-    usage()
-    sys.exit(3)
-
-for name,value in options:
-
-    if name in ("-H","--HOST"):
-        host = "%s" % value
-
-
-    elif name in ("-a","--auth"):
-        user, passwd = value.split(":")
-
-    elif name in ("-s","--ssl"):
-        ssl = 1
-
-    elif name in ("-t","--test"):
-        test = "%s" % value 
-
-    elif name in ("-d","--debug"):
-        debug = 1
-
-    elif name in ("-o","--output"):
-        output = 1
-
-    elif name in ("-n","--noresult"):
-        result_file = 0
-
-    elif name in ("-p","--port"):
-        try:
-            port = int(value)
-        except:
-            print("""%s Usage.ERROR - -p [PORT] must be an Integer """ % msg)    
-            exot = 3
-
-    elif name in ("-w","--warning"):
-        try:
-            w = int(value)
-        except:
-            print("""%s Usage.ERROR -w [WARNING] must be an Integer    """ % msg)
-            exot = 3
-
-    elif name in ("-D","--DB"):
-        try:
-            db = int(value)
-        except:
-            print("""%s Usage.ERROR -D [DATABASE] must be an Integer    """ % msg)
-            exot = 3
-
-
-    elif name in ("-c","--critical"):
-        try:
-            c = int(value)
-        except:
-            print("""%s Usage.ERROR -c [CRITICAL] must be an Integer    """ % msg)
-            exot = 3
-
-    elif name in ("-v","--version"):
-        ver()
-        sys.exit(0)
-    
-    else:
-        usage()
-        ver()
-        sys.exit(0)
-
-if exot != 0:
-    sys.exit(exot)
-
-# creating test-url
-
-
-
-# start_time for checktime-calculation    
-st = time.time()
-
-
-try:
-
-  r = redis.StrictRedis(host=host, port=port, db=db)
-  print_debug("Redis-Connection OK: h=%s, p=%s, db=%s \n    " % (host, port, db))
-except Exception:
-  print "%s CRITICAL: Connection-Error | h=%s p=%s db=%s" % (msg, host, port, db)
-  sys.exit(3)
-
-
-
-if test != 0:
-    if w == 0:
-        print("""Usage.ERROR :: -w [WARNING] must be set and Integer (cannot be 0)""")
-        sys.exit(3)
-    
-    if c == 0:
-        print("""Usage.ERROR :: -c [CRITICAL] must be set and Integer (cannot be 0)""")
-        sys.exit(3)
-        
-# default test_text
-# checking which test to perform
-all_keys = r.keys("*")
-keylen = len(all_keys)
-used_mem = float(r.info()["used_memory"]) / 1024 / 1024
-clients = r.info()["connected_clients"]
-perfdata = "ac=%s;used_mem=%s;keylen=%s" % (clients, used_mem, keylen)
-
-et = time.time()
-rt = int((et - st) * 1000) 
-perfdata = "ac=%s;used_mem=%.2f;keylen=%s;rt=%s" % (clients, used_mem, keylen, rt)
-
-print_debug("set test: %s" % test)
-
-dt = "CheckRedis.%s" % test
-
-
-if test == 0:
-  print "%s OK | %s" % (dt,  perfdata)
-  sys.exit(0)
-elif test == "keylen":
-  ta = keylen
-elif test == "used_mem":
-  ta = used_mem 
-elif test == "clients":
-  ta = clients
-else:
-  print "%s OK  | %s" % (dt, perfdata)
-  sys.exit(0)
-
-  
-if ta >= c:
-    print "%s CRITICAL: %s | %s" % (dt, ta, perfdata)
-    sys.exit(2)
-    
-elif ta >= w:
-    print "%s WARNING: %s | %s" % (dt, ta, perfdata)
-    sys.exit(1)
-
-else:
-    print "%s OK [ %s ] | %s" % (dt, ta, perfdata)
-    
-
-
diff --git a/check_script_procs.sh b/check_script_procs.sh
deleted file mode 100755
index 9f295b0..0000000
--- a/check_script_procs.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash
-#
-# check_plugin for checking a given ammount of scripts are running
-#
-# usefull if you want to check for scripts, not processes 
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins/src
-#
-#
-
-# You may have to change this, depending on where you installed your
-# Nagios plugins
-PROGNAME=`basename $0`
-PATH="/usr/bin:/usr/sbin:/bin:/sbin"
-LIBEXEC="/etc/nagios/plugins"
-. $LIBEXEC/utils.sh
-
-
-### DEFINING THE PROCESS LIST ###
-PROCESS="dumbo"
-
-
-### REQUISITE NAGIOS COMMAND LINE STUFF ###
-
-print_usage() {
-        echo "Usage: $PROGNAME [options]"
-        echo "Usage: $PROGNAME --help"
-}
-
-print_help() {
-        echo ""
-        print_usage
-        
-        echo "
-
-    OPTIONS
-        -p \"process name\"
-            process name, can be \"bash script_name.sh\" 
-        -e [nr] 
-            default: 1
-            expect [nr] of running processes, if the number differs, 
-            CRITICAL will be returned; this is optional, 
-        
-        "
-}
-
-expect_nr="1"
-
-while getopts hp:e: opt
-do
-
-    case $opt in
-        --help|-h) 
-            print_help; exit $STATE_OK;;
-        p)
-            PROCESS="$OPTARG"
-            ;;
-        e)
-            expect_nr="$OPTARG"
-            ;;
-            
-        *)
-            print_help
-            exit $STATE_UNKNOWN
-        ;;
-    esac
-    
-done
-
-### FINALLY THE MAIN ROUTINE ###
-
-COUNT="0"
-DOWN=""
-
-
-
-proc_count=`ps -ef | grep -i "$PROCESS" | grep -v grep | grep -v $PROGNAME | wc -l`
-
-if [ $proc_count -lt $expect_nr ]
-then
-    COUNT="1"
-    DOWN="$DOWN $PROCESS"
-    STATUS_TEXT="not enough processes found for $PROCESS [ running($proc_count) needed($expect_nr) ]"
-elif [ $proc_count -gt $expect_nr ]
-then
-    COUNT="1"
-    DOWN="$DOWN $PROCESS"
-    STATUS_TEXT="too many processes found for $PROCESS [ running($proc_count) needed($expect_nr) ]"
-
-else
-    #ps -ef | grep -i $PROCESS | grep -v grep | grep -v $PROGNAME
-    PROC_LIST="$PROC_LIST$PROCESS[$proc_count] "
-
-fi
-
-if [ $COUNT -gt 0 ]
-then
-        echo "ScriptProcs CRITICAL - $STATUS_TEXT"
-        exit $STATE_CRITICAL
-fi
-
-# Nothing caused us to exit early, so we're okay.
-echo "ScriptProcs OK - All requisite processes running ( $PROCESS [ running($proc_count) needed($expect_nr) ])"
-exit $STATE_OK
diff --git a/check_selenium b/check_selenium
deleted file mode 100755
index 5447ac1..0000000
--- a/check_selenium
+++ /dev/null
@@ -1,224 +0,0 @@
-#!/usr/bin/python
-#
-# check_selenium.py / executes from selenium-ide exported
-#                     checks and parses output
-# part of nagdog
-#
-# (c) copyright 2009,2010,2011,2012,2013 dogtown@mare-system.de
-#
-#
-# v 0.4.12 - AALPHAA - 2013-01-10
-# 
-# 
-
-import os, posix, string, sys, time, getopt
-
-# where the testcases are stored, must be python_exports from selenium ide 
-test_dir="/srv/data/selenium_tests"
-
-# check for running browser-procs, set to no to disable
-#-> check for max_procs (firefox)
-check_for_procs = "yes"
-max_procs_allowed = 15
-browser_cmd = "firefox-bin"
-
-# defaults
-warning_t="15"
-critical_t="30"
-test_count="none"
-debug = "no"
-
-return_status="UNKNOWN"
-return_exit=3
-return_text="no return (default)"
-return_perfdata="none"
-
-def check_selenium_help():
-    print """
-
-check_selenium 
-    nagios_plugin to check selenium_tests and display results / perfdata
-    
-    USAGE
-     check_selenium [options]
-     
-    OPTIONS
-      -s [scriptname] 
-            test_script to execute
-            must be located in $test_dir 
-
-      -t [count] 
-            number of test that must be executed; if number
-            differs, status==WARNING
-            default: off 
-
-      -w [seconds]
-            threshold in seconds for the test to pass
-            to change status to WARNING
-            default: 15 sek
-
-      -c [seconds] 
-            threshold in seconds for the test to pass
-            to change status to CRITICAL
-            default: 30sek
-            
-      -d    turn debug on
-      
-      -p [procs] 
-            checks for running (*browser*) processes; 
-            exits if too many running procs found
-            default: 15
-            
-      
-    
-    """
-
-    
-
-def return_result():
-    
-    rp = return_perfdata.strip()
-    if rp[-1] != ";":
-        rp = "%s;" % rp
-    print "SELENIUM %s %s | %s " % (return_status, return_text, rp)
-    sys.exit(return_exit)
-
-def print_debug(debug_output):
-    if debug == "yes":
-        print "d:: %s " % debug_output
-    return()
-        
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "s:c:w:t:p:hdz", 
-        ["help", "script", "debug" ])
-except getopt.GetoptError, err:
-    # print help information and exit:
-    print str(err) # will print something like "option -a not recognized"
-    check_selenium_help()
-    sys.exit(2)
-
-
-for o, a in opts:
-    #print "o :: " + o + "   <-->  a: " + a
-    if o in ("-s", "--script"):
-        test_script = a
-        test_script_path = "%s/%s" % (test_dir, test_script)
-    elif o in ("-h", "--help"):
-        check_selenium_help()
-        sys.exit()
-        
-
-    elif o in ("-w", "--warning"):
-        warning_t = a
-    elif o in ("-c", "--critical"):
-        critical_t = a
-        
-    elif o == "-t":
-        test_count = a
-    
-    elif o == "-d":
-        debug = "yes"
-
-    elif o == "-p":
-        
-        try:
-            max_procs_allowed = int(a)
-        except:
-            pass
-    
-    else:
-        check_selenium_help()
-        sys.exit(2)        
-
-if len(sys.argv) == 1:
-    check_selenium_help()
-    sys.exit(0)
-
-if not test_script:
-    return_text = "no testscript given"
-    return_status="CRITICAL"
-    return_exit = 2
-    return_result()
-
-if not os.path.exists(test_script_path):
-    return_text = "no testscript found in %s " % test_script_path
-    return_status="CRITICAL"
-    return_exit = 2
-    return_result()
-
-
-if check_for_procs != "no":
-    running = os.popen("ps -ef | grep %s" % browser_cmd).readlines()
-    if len(running) > max_procs_allowed:
-        return_exit = 1
-        return_status == "WARNING"
-        return_text = "Proc.FAIL: to much running processes found; running: %s :: allowd: %s  (checking: %s )" % (len(running), max_procs_allowed, test_script) 
-        return_perfdata = test_out_compiled
-        return_result()
-        sys.exit(2)
-
-
-print_debug("excuting %s in %s " % (test_script, test_dir))
-
-test_output = os.popen("cd %s && python %s 2>&1 " % (test_dir, test_script)).readlines()
-
-print_debug(test_output)
-
-test_out_compiled = string.join(test_output, "")
-
-
-# return if test failed 
-if test_out_compiled.find("FAIL") > -1:
-    return_exit = 2
-    return_status == "CRITICAL"
-    return_text = "FAIL: not all tests passed -> %s " % (test_script) 
-    return_perfdata = test_out_compiled
-    return_result()
-    sys.exit(2)
-
-out_string = string.strip(test_output[2])
-out_status = string.strip(test_output[4])
-
-out_time = float((string.split(out_string, "test in")[1]).replace("s", ""))
-
-print_debug(out_time)
-return_perfdata = "checktime=%ss;" % int(out_time)
-
-if out_status == "OK":
-    try:
-        wt = float(warning_t)
-    except:
-        return_text = "Warning-Time (-w) must be a number"
-        return_result()
-
-    try:
-        ct = float(critical_t)
-    except:
-        return_text = "Critical-Time (-c) must be a number"
-        return_result()
-
-    if out_time > ct:
-        return_status = "CRTITICAL"
-        return_exit = 2
-        return_text = "all tests passed, but time exceeds > %s s (%s)" % (ct,return_perfdata)
-        return_result()
-    elif out_time > wt:
-        return_status = "WARNING"
-        return_exit = 1
-        return_text = "all tests passed, but time exceeds > %s s (%s)" % (wt,return_perfdata)
-        return_result()
-
-         
-    return_exit = 0
-    return_status = "OK"
-    return_text = "all tests passed from %s  ( %s )" % (test_script, int(out_time))
-else:
-    return_exit = 2
-    return_status == "CRITICAL"
-    return_text = "not all tests passed :: %s -> %s " % (out_status, test_script) 
-
-return_result()
-
-    
-
diff --git a/check_selenium.README b/check_selenium.README
deleted file mode 100644
index 3ee54fe..0000000
--- a/check_selenium.README
+++ /dev/null
@@ -1,80 +0,0 @@
-
-check_selenium.py README
-
-(c) copyright 2008,2009,2010 mm/mare-system.de
-    dogtown@mare-system.de
-
-
-Requirements
-
-    make sure to have a selenium-server.jar running an accessible
-    from your testscripts (server/port etc), for setting up 
-    headless selenium-server see below
-
-    create an nagios-accessible directory (check_dir) for your sel_check_scripts.py
-
-    get selenium-python-clientdrivers (see seleniumhq for an actual version
-    
-    place selenium*.py and test_*.py from  python-clientdrivers into $check_dir 
-    
-    create some tests from Selenium IDE, export Test-cases as python_tests
-    
-    upload your sel_check_scripts to $check_dir
-    
-    copy the nagios_plugin check_selenium.py to your $USER1$ / nagios_plugins_dir
-    
-    run some tests as user nagios
-    
-    create a check_command and service_definition (see below)
-    
-    ... fini ... 
-
-
-Bugs / Addidtional Notes
-    
-    please note, this plugin was created for a customer and works superb in our
-    environment (test-cases, not suites, python-checks, firefox)
-    
-    if you have commnets/suggestions or find bugs please report them to dogtown@mare-system.de
-
-
-Sample nagios_command and service_def
-
-define command{
-    command_name    check_selenium
-    command_line    $USER1$/check_selenium.py  -s $ARG1$ -w $ARG2$  -c $ARG3$ 
-    }
-
-
-define  service {
-        host_name               check_host
-        service_description     check_selenium
-        check_command           check_selenium!check_script!20!33
-        use                     custom-service
-
-}
-
-    
-    
-
-Selenium-Server headless
-
-    - install java 
-      aptitude install sun-java6-bin  sun-java6-jre 
-    
-    - install a simple windowmanager 
-      aptitude install gdm icewm-lite 
-      
-    - install firefox
-    
-    - install xvfb
-      aptitude install xfvb
-      
-    - add a xfvb_display to some startup-script
-      Xvfb :99 -ac -noreset &
-    
-    - execute selenium-server with the correct display
-      export DISPLAY=:99 && java -jar /path/to/selenium-server-1.0.1/selenium-server.jar &
-    
-    - check your tests now
-
diff --git a/check_shodan_credits b/check_shodan_credits
deleted file mode 100755
index 2647f43..0000000
--- a/check_shodan_credits
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-# (c) copyright 2018 dogtown@mare-system.de
-# 
-# License: GPL v2 
-#
-# dload: https://bitbucket.org/maresystem/dogtown-nagios-plugins
-#
-#
-# requirements:
-#    - python-requests, python-simplejson
-#
-#
-#
-# checkcommands.cfg
-#
-#
-#
-#~ define command {
-
-    #~ command_name    check_shodan_credits
-    #~ command_line    $USER1$/check_shodan_credits -k $ARG1$ -D $ARG2$ -w $ARG3$ -c $ARG4$
-
-#~ }
-
-
-#~ services.cfg 
-#~ #
-#~ #
-#~ define  service {
-        #~ hostname                EXTERNAL_API
-        #~ service_description     check_shodan_credits_dev 
-        #~ check_command           check_shodan_credits!DEV!SHODAN_API_KEY!10!2
-        #~ use                     cysmo-service
-        #~ register                1
-        #~ notifications_enabled   1
-        #~ normal_check_interval   10
-        #~ retry_check_interval    5
-        #~ max_check_attempts      3
-
-#~ }
-
-
-
-version = "0.0.5.r2 - alpha - 2018-05-20"
-
-
-import getopt, sys, time, os, string
-import requests 
-import simplejson as json 
-
-
-import re
-
-# run-defaults
-debug = "no"
-ctype = "status"
-
-
-# return-defaults
-return_d = {}
-return_d["status"]="UNKNOWN"
-return_d["exit"]=3
-return_d["text"]="no return (default)"
-return_d["perfdata"]="none"
-
-def return_exit(rd):
-  print "ShodanCredits %s %s %s %s " % ( D, rd["status"], rd["text"], rd["perfdata"])
-  sys.exit(rd["exit"])
-
-def check_shodan_help():
-  print """
-
-# usage: $0 -k YOUR_API_KEY -d Description [ -w INT [ -c INT ]]
-    
-  
-  """
-
-
-try:
-  opts, args = getopt.getopt(sys.argv[1:], "D:k:w:c:h", 
-      ["help", "script", "debug" ])
-except getopt.GetoptError, err:
-  # print help information and exit:
-  print str(err) # will print something like "option -a not recognized"
-  check_shodan_help()
-  sys.exit(2)
-
-
-w = 10
-c = 2
-k=0
-D=""
-
-
-for o, a in opts:
-  #print "o :: " + o + "   <-->  a: " + a
-  if o in ("-h", "--help"):
-    check_shodan_help()
-    sys.exit()
-
-  elif o in ("-k", "--key"):
-    k = a
-      
-
-  elif o in ("-w", "--warning"):
-    w = int(a)
-  elif o in ("-c", "--critical"):
-    c = int(a)
-
-  elif o in ("-D", "--Description"):
-    D = a
-      
-          
-  else:
-    check_shodan_help()
-    sys.exit(2)        
-
-if k == 0:
-  print("""
-
-ERROR you need to give an API-key
-
-  
-  """)
-  check_shodan_help()
-  sys.exit(2)
-  
-  
-  
-
-url = "https://api.shodan.io/api-info?key=%s" % k
-shodan_answer = requests.get(url)
-
-if shodan_answer.status_code != 200:
-  return_d["status"]="Error"
-  return_d["exit"]=3
-  return_d["text"]="Error in API-Call, HTTPstatus: %s" % shodan_answer.status_code
-  return_d["perfdata"]=shodan_answer.text
-  return_exit(return_d)
-
-sj = json.loads(shodan_answer.text)
-if sj["query_credits"] < c:
-  return_d["status"]="Critical"
-  return_d["exit"]=2
-  return_d["text"]="Critical, Credits: %s" % sj["query_credits"]
-  return_d["perfdata"]="| credits: %s;" % sj["query_credits"]
-
-elif sj["query_credits"] < w:
-  return_d["status"]="Warning"
-  return_d["exit"]=1
-  return_d["text"]="Warning, Credits: %s" % sj["query_credits"]
-  return_d["perfdata"]="| credits: %s;" % sj["query_credits"]
-  
-else:
-  return_d["status"]="Ok"
-  return_d["exit"]=0
-  return_d["text"]="All OK, Credits: %s" % sj["query_credits"]
-  return_d["perfdata"]="| credits: %s;" % sj["query_credits"]
-
-return_exit(return_d)
-  
-  
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/check_snort b/check_snort
deleted file mode 100755
index 597b4b0..0000000
--- a/check_snort
+++ /dev/null
@@ -1,542 +0,0 @@
-#!/bin/sh
-#
-# check_snort   - nagios_plugin to check snort-host or
-#                 snort-alert_count against
-#                 given averages (need snort_db-database)
-#
-# v0.2.14 - ALPHA - 2010-07-10
-# 
-# next version will be reimplemented in python
-#
-#
-#  Copyright (C) 2008,2009,2010  mare-system.de
-#                                dogtown@mare-system.de
-#
-#  This program is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; version 2
-#  of the License.
-#  
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#  
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-#
-#  http://www.gnu.org/licenses/gpl-2.0.html
-#
-
-
-#
-# VARS 
-#
-
-
-
-# DB
-SNORT_DB="snort"
-SNORT_DB_HOST="localhost"
-SNORT_DB_PORT="3306"
-SNORT_DB_USER="snortuser"
-SNORT_DB_PASS="snortpass"
-
-
-# DEFAULT_VARS
-SPOOL_DATA_DIR="/var/log/nagios"
-DEBUG="no"                           # no debug on default
-LOG_FILE="$SPOOL_DATA_DIR/check_snort.`date +%a`.log"
-HOSTNAME=`hostname -f`
-
-
-# -m alerts defaults
-INTERVAL="2"
-WARNING_THRESH="500"                 # warning_threshold in %
-CRITICAL_THRESH="1000"               # critical_threshold in %
-PRIORITY_LEVEL="3"                   # prio-level to check against
-
-#
-# -m host defaults
-#
-SNORT_SYSLOG="/var/log/syslog"
-DROPPED_WARNING="5"                  # dropped packets warning_threshold in %
-DROPPED_CRITICAL="10"                # dropped packets critical_threshold in %
-
-####################################################
-#
-# functions
-#
-NOW_DATE=`date +%F-%H:%M`
-EXIT_STATUS="UNKNOWN"
-EXIT_TEXT="$HOSTNAME unknown status $NOW_DATE"
-EXIT_VALUE="3"
-DEBUG_DEFAULT_OPT=" 2>&1 > /dev/null"
-
-
-trap exit_now EXIT 
-trap exit_now SIGCHLD
-
-
-
-
-function check_snort_help {
-
-    echo "
-
-check_snort.sh 
-            - nagios_plugin to check snort_hosts or 
-              snort_alerts in snort_databases
-              and alert on given thresholds; 
-              to be used @ snort_db_hosts via check_nrpe
-              see check_snort.README for more details
-              
-  [nyr]  ->  use with caution: function not yet ready implemented and tested 
-
-  USAGE:
-    check_snort.sh [options] 
-
-  CONFIG:
-    values for db_acces, defaults etc might be configured 
-    within this file -> $0
-    
-  OPTIONS
-    this script uses 2 modes: 
-    -m [modus]    set the working-modus
-                  MODI: 
-                    host   - check snort_host specific details (running, dropped packages)
-                             [nyr]
-                    alerts - check snort_alerts against a given database (only mysql supported
-                             at the moment 
-
-    -c [percent]  set critical_threshold in % ; if actual_alert
-                  is [percent] higher then avg_alert returns CRITICAL 
-                  if the alertcount is [percent] lower, an
-                  anormal_report is generated and displayed
-                  default: 500
-                  
-    -w [percent]  set warning_threshold in % ; if actual_alert
-                  is [percent] higher then avg_alert warning is displayed
-                  if the alertcount is [percent] lower, an
-                  anormal_report is generated and displayed
-                  default: 1000
-                  
-    -i [INTERVAL] set check_interval (actual_alert vs avg_alert:
-                  1 -> 5min vs 60min
-                  2 -> 1hour vs 24hour (default)
-                  3 -> 24hour vs 7day
-                  4 -> 7 day vs 30 day (DO NOT USE)
-                  5 -> 7 day vs 90 day (DO NOT USE)
-                  6 -> display total number (no warning/critical) [nyr]
-                  
-    -p [PRIORITY] set the snort_sig_priority_level to check against;
-                  default: 3
-    
-    -s [sid]      set a special sid to check instead of priority
-                  [nyr]
-                  
-    
-    -d            debuG_output > logfile
-                  
-    -l [logfile]  alternate log_file
-                  default: SPOOL_DATA_DIR/check_snort.log
-                  
-    
-    -o [out_dir]  give a separate spool_data_dir 
-                  default: /var/log/nagios
-                  may be changed within the script itself via default_VAR
-    
-    -z            create cvs_output in SPOOL_DATA_DIR [nyr]
-  
-  
-  EXAMPLE
-   check_snort.sh -m alerts -i 3 -w 100 -c 200 
-   
-   
-"    
-    
-}
-
-
-function get_last_count {
-
-
-
-    now=`date +%s`
-    time_diff_x=$(( now - ACTUAL_ALERTS ))
-    time_diff=`stamp2date $time_diff_x`
-    #echo "dttt: $before_24_date"
-    mysql_exec_last="select count(sid) from event,signature where event.signature=signature.sig_id and signature.sig_priority > '$((PRIORITY_LEVEL-1))' and timestamp(event.timestamp) > '$time_diff';"
-    print_debug "get_last  -> mysql -h $SNORT_DB_HOST -P $SNORT_DB_PORT -u $SNORT_DB_USER --password=$SNORT_DB_PASS -e \"$mysql_exec_last\" $SNORT_DB "    
-    
-    COUNT_LAST=`mysql --skip-column-names -h $SNORT_DB_HOST -P $SNORT_DB_PORT -u $SNORT_DB_USER --password=$SNORT_DB_PASS -e "$mysql_exec_last" $SNORT_DB`
-    if [ ! "$COUNT_LAST" ]; then
-        COUNT_LAST="1"
-    elif [ "$COUNT_LAST" = "0" ]; then
-        COUNT_LAST="1"
-    fi
-    
-    print_debug "time_diff -> $time_diff / COUNT_LAST: -> $COUNT_LAST"
-
-    
-}
-
-function get_avg_count {
-
-    now=`date +%s`
-    time_diff=$(( now - AVERAGE_ALERTS  ))
-    time_diff=`stamp2date $time_diff`
-    mysql_exec_avg="select count(sid) from event,signature where event.signature=signature.sig_id and signature.sig_priority > '$((PRIORITY_LEVEL-1))' and timestamp(event.timestamp) > '$time_diff';"
-    #print_debug "get_avg -> mysql -h $SNORT_DB_HOST -P $SNORT_DB_PORT -u $SNORT_DB_USER --password=$SNORT_DB_PASS -e \"$mysql_exec_avg\" $SNORT_DB " 
-    
-    COUNT_AVG=`mysql --skip-column-names -h $SNORT_DB_HOST -P $SNORT_DB_PORT -u $SNORT_DB_USER --password=$SNORT_DB_PASS -e "$mysql_exec_avg" $SNORT_DB `
-    if [ ! "$COUNT_AVG" ]; then
-        COUNT_AVG="1"
-    elif [ "$COUNT_AVG" = "0" ]; then
-        COUNT_AVG="1"
-    fi
-    
-    print_debug "time_diff -> $time_diff / COUNT_AVG: -> $COUNT_AVG"
-
-    
-    
-}
-
-function get_latest_values {
-    if [ ! -f "$values_log_file" ]; then
-        EXIT_STATUS="WARNING"
-        EXIT_VALUE="2"
-        EXIT_TEXT="check_file not found -> $values_log_file (trying to create) "
-        print_debug "check_file not found -> $values_log_file (trying to create) "
-        touch $values_log_file
-        exit_now
-    fi
-    print_debug "reading $values_log_file"
-    last_total=`cat $values_log_file | head -n 1`
-    last_status=`cat $values_log_file | head -n 1 | awk -F ":" '{ print $1 }' | tr -d " "`
-    last_last=`cat $values_log_file | head -n 1 | awk -F ":" '{ print $2 }' | tr -d " "`
-    last_avg=`cat $values_log_file | head -n 1 | awk -F ":" '{ print $3 }' | tr -d " "`
-    last_date=`cat $values_log_file | head -n 1 | awk -F ":" '{ print $3 }' | tr -d " "`
-    
-    if [ "$last_status" = "SUPERCRITICAL" ]; then
-        EXIT_STATUS="CRITICAL"
-        EXIT_VALUE="2"
-        EXIT_TEXT="critical status found > $values_log_file -> $last_total  "
-        exit_now
-    
-    fi
-    print_debug " > last_status -> $last_status / last_last -> $last_last / last_avg -> $last_avg / last_date -> $last_date --> $values_log_file" 
-    #exit
-}
-
-function write_latest_values {
-    check_exit_status="$EXIT_STATUS"
-    if [ ! -f "$values_log_file" ]; then
-        touch $values_log_file
-    fi
-    echo "$check_exit_status : $COUNT_LAST : $AVG_AVG : $NOW_DATE" > $values_log_file
-    print_debug "$EXIT_STATUS : $COUNT_LAST : $AVG_AVG values_log_file -> $values_log_file" 
-    
-}
-
-function stamp2date {
-    date --date "1970-01-01 $1 sec" "+%Y-%m-%d %T"
-}
-
-function print_debug {
-    if [ "$DEBUG" = "yes" ]; then
-        print_log "$1"    
-    fi
-
-}
-
-
-function print_log {
-    log_insert="$NOW_DATE  -  [ $MODUS ] - $1"
-    echo "$1" >> $LOG_FILE   
-}
-
-function exit_now {
-    if [ "$EXIT_PERF_DATA" ]; then
-        EXIT_PERF_DATA=" | $EXIT_PERF_DATA"
-    fi
-    
-    echo "SNORT_CHECK $EXIT_STATUS - [$MODUS] $EXIT_TEXT $EXIT_PERF_DATA"
-    exit "$EXIT_VALUE"
-    
-}
-
-
-function check_host {
-    
-    snort_pid=`pidof snort`
-    if [ ! "$snort_pid" ]; then    
-        EXIT_TEXT="$EXIT_TEXT ::  no pid for snort found _pidof snort_  (sorry)"
-        exit
-    fi
-    snort_stats=`sudo kill -s SIGUSR1 $snort_pid && sudo tail -n 200 $SNORT_SYSLOG | grep  "snort" | awk -F "]:" '{ print $2 }'`
-    
-    
-    for line in $snort_stats
-        do
-            if echo $line | grep "Packet Wire Totals" ; then
-                start_stats="1"
-            else
-                I=1
-            fi 
-            
-            if [ "$start_stats" = "1" ]; then 
-                if echo $line | grep "Received" ; then
-                    echo "$received"
-                    received_pckt=`echo $line | awk -F ":" '{ print $2 }' | tr -d " "`
-                elif echo $line | grep "Analyzed" ; then
-                    analyzed_pckt=`echo $line | awk -F ":" '{ print $2 }' | awk -F " " '{ print $1 }' | tr -d " "`
-                elif echo $line | grep "Dropped" ; then
-                    dropped_pckt=`echo $line | awk -F ":" '{ print $2 }' | awk -F " " '{ print $1 }' | tr -d " "`
-                elif echo $line | grep "Outstanding" ; then
-                    outstanding_pckt=`echo $line | awk -F ":" '{ print $2 }' | awk -F " " '{ print $1 }' | tr -d " "`
-                    break
-                fi
-            
-            fi
-        done
-        
-        dropped_perc=$(( 100 / received_pckts * dropped_pckt ))
-
-        EXIT_PERF_DATA=" dropped_perc=$dropped_perc;$DROPPED_WARNING;$DROPPED_CRITICAL; dropped_total=$dropped_pckt"
-
-
-
-    if [ $dropped_perc -gt $DROPPED_CRITICAL ]; then
-        EXIT_STATUS="CRITICAL"
-        EXIT_VALUE="2"
-    elif [ $dropped_perc -gt $DROPPED_WARNING ]; then
-        EXIT_STATUS="WARNING"
-        EXIT_VALUE="1"
-    else
-        EXIT_STATUS="OK"
-        EXIT_VALUE="0"
-
-    fi
-
-    EXIT_TEXT="snort-stats total received: $received_pckt, dropped: $dropped_pckt / $dropped_perc % :: warning: $DROPPED_WARNING, :: critical: $DROPPED_CRITICAL "
-
-    write_latest_values
-
-    #print_debug "exit_status -> $EXIT_VALUE : $EXIT_STATUS  -> $EXIT_TEXT  :perfdata: $EXIT_PERF_DATA"
-    print_log "$NOW_DATE :: $EXIT_STATUS  :: $EXIT_TEXT  :perfdata: $EXIT_PERF_DATA :: file: $values_log_file" 
-
-    
-    exit
-    
-}
-
-function check_alerts {
-    # getting time_intervals from INTERVAL
-
-    if [ "$INTERVAL" = "1" ]; then 
-        AVERAGE_ALERTS="3600"
-        ACTUAL_ALERTS="300"
-        DIVIDER="12"
-        COUNT_INTERVAL="5min-1hr"
-
-    elif [ "$INTERVAL" = "2" ]; then 
-        AVERAGE_ALERTS="86400"
-        ACTUAL_ALERTS="3600"
-        DIVIDER="24"
-        COUNT_INTERVAL="1hr-24hr"
-
-
-    elif [ "$INTERVAL" = "3" ]; then 
-        AVERAGE_ALERTS="604800"
-        ACTUAL_ALERTS="86400"
-        DIVIDER="7"
-        COUNT_INTERVAL="24hr-7d"
-        
-    elif [ "$INTERVAL" = "4" ]; then 
-        AVERAGE_ALERTS="2592000"
-        ACTUAL_ALERTS="604800"
-        COUNT_INTERVAL="7d-30d"
-        DIVIDER="4"
-        
-    elif [ "$INTERVAL" = "5" ]; then 
-        AVERAGE_ALERTS="7776000"
-        ACTUAL_ALERTS="604800"
-        DIVIDER="13"
-        COUNT_INTERVAL="7d-90d"
-
-    else 
-        AVERAGE_ALERTS="86400"
-        ACTUAL_ALERTS="3600"
-        COUNT_INTERVAL="1hr-24hr"
-        DIVIDER="24"
-        
-    fi
-
-    print_debug "
-    ----[ $NOW_DATE ]-----------------------------------------------
-
-    "
-    LAST_TAG=`echo $COUNT_INTERVAL | awk -F "-" '{ print $1 }'`
-    AVG_TAG=`echo $COUNT_INTERVAL | awk -F "-" '{ print $2 }'`
-
-    values_log_file="$SPOOL_DATA_DIR/$PRIORITY_LEVEL-$COUNT_INTERVAL.check"
-
-
-    get_latest_values
-    get_last_count
-    get_avg_count
-
-    # bashematics is not foofun for me ...
-    AVG_AVG=$(( COUNT_AVG / DIVIDER ))
-    if [ "$AVG_AVG" = "0" ]; then
-        AVG_AVG="1"
-    fi
-
-    w_limit=$(( AVG_AVG + (AVG_AVG * WARNING_THRESH  / 100)  ))
-    c_limit=$(( AVG_AVG + (AVG_AVG * CRITICAL_THRESH / 100)  ))
-
-    print_debug "check_options: AVG -> $AVERAGE_ALERTS / ACT -> $ACTUAL_ALERTS / INT -> $COUNT_INTERVAL / DIV -> $DIVIDER"
-
-    print_debug "
-
-    PRIORITY  -> $PRIORITY_LEVEL
-    INTERVAL  -> $COUNT_INTERVAL
-    LAST      -> $COUNT_LAST
-    AVG       -> $COUNT_AVG
-    AVG_AVG   -> $AVG_AVG
-    w_limit   -> $w_limit
-    c_limit   -> $c_limit
-    "
-
-    #~ w_limit   -> $w_limit
-    #~ c_limit   -> $c_limit
-    #~ 
-
-    EXIT_PERF_DATA="$LAST_TAG=$COUNT_LAST;$w_limit;$c_limit; $AVG_TAG=$COUNT_AVG; $AVG_TAG-avg=$AVG_AVG"
-
-
-
-    if [ $COUNT_LAST -gt $c_limit ]; then
-        EXIT_STATUS="CRITICAL"
-        EXIT_VALUE="2"
-    elif [ $COUNT_LAST -gt  $w_limit ]; then
-        EXIT_STATUS="WARNING"
-        EXIT_VALUE="1"
-    else
-        EXIT_STATUS="OK"
-        EXIT_VALUE="0"
-
-    fi
-
-    EXIT_TEXT="p-$PRIORITY_LEVEL :: $COUNT_INTERVAL :: last: $COUNT_LAST - avg: $AVG_AVG / thresh: $w_limit/$c_limit [$WARNING_THRESH%/$CRITICAL_THRESH%]"
-
-    write_latest_values
-
-    #print_debug "exit_status -> $EXIT_VALUE : $EXIT_STATUS  -> $EXIT_TEXT  :perfdata: $EXIT_PERF_DATA"
-    print_log "$NOW_DATE :: $EXIT_STATUS  :: $EXIT_TEXT  :perfdata: $EXIT_PERF_DATA :: file: $values_log_file" 
-    
-}
-
-
-####################################################
-#
-# program
-#
-
-if  [ ! "$1" ]; then
-    check_snort_help
-    exit
-fi
-
-while getopts dhw:c:i:p:l:s:m: opt
-do
-
-
-    case $opt in
-        i) 
-            INTERVAL="$OPTARG"
-        ;;
-        
-        c)
-            CRITICAL_THRESH="$OPTARG"
-            DROPPED_CRITICAL="$OPTARG"
-        ;;
-        
-        w)
-            WARNING_THRESH="$OPTARG"
-            DROPPED_WARNING="$OPTARG"
-        ;;
-        
-        p)
-            PRIORITY_LEVEL="$OPTARG"
-        ;;
-        
-        s)
-            SID="$OPTARG"
-        ;;
-        
-        d)
-        DEBUG="yes"
-        ;;
-        m)
-        
-        MODUS="$OPTARG"
-        ;;
-        
-        l)
-        LOG_FILE="$OPTARG"
-        ;;
-        
-        o)
-        SPOOL_DATA_DIR="$OPTARG"
-        ;;
-
-        h)
-        check_snort_help
-        exit 
-        ;;
-        *)
-        check_snort_help
-        exit
-        ;;
-    esac
-    
-
-    
-done
-
-shift $((OPTIND - 1))
-
-if [ ! -d "$SPOOL_DATA_DIR" ]; then
-    echo "
-> error no output_dir given/created; run 
-> \$ mkdir -p $SPOOL_DATA_DIR && chown nagios:nagios $SPOOL_DATA_DIR
-> to create that dir
-
-"
-    EXIT_TEXT="$EXIT_TEXT ::  SPOOL_DATA_DIR not found -> $SPOOL_DATA_DIR"
-    exit
-    
-fi
-
-
-    
-if [ "$MODUS" = "host" ]; then
-    check_host
-
-elif [ "$MODUS" = "alerts" ]; then
-    check_alerts
-
-else
-    EXIT_TEXT="$EXIT_TEXT ::  no modus selected (use -m switch) -> help: check_snort.sh -h "
-    exit
-
-fi
-
-exit
-
-
-
-
diff --git a/check_snort.README b/check_snort.README
deleted file mode 100644
index 27652bd..0000000
--- a/check_snort.README
+++ /dev/null
@@ -1,522 +0,0 @@
-
-check_snort.sh -> plugins to check snort (alerts/hosts*)
-
-    check_snort is a nagios-plugin to check the functions of
-    a running snort-sensor* or events in snort_alert_databases 
-    against given thresholds
-    this plugin is designed to collect snort_statisticts and display
-    via pnp-graphs; i wouldn't count on the nagios-alerts, but
-    it's nice to check ypour 5min-alert-count or 24hrs-alert-count
-    with time-based correlation. 
-     
-    both checks are designed to run via nrpe.
-
-    
-    
-    *) not yet ready and to be done
-
-
-Installation:
-    download from monitoringexchange.org 
-        -> http://www.monitoringexchange.org/ 
-
-    
-    and put check_snort.sh into your $PLUGINS_REPOSITORY at your
-    snort_senors (for check_snort -m host) or your snort_alert_db_server
-    (for check_snort.sh -m alerts)
-    
-    edit check_snort.sh and change the variables as needed
-    
-    create $SPOOL_DATA_DIR with write_permissions for user nagios; this
-    directory will be used for check-data and logfiles 
-    
-    check out check_snort.cfg.template for nagios command/service-definitions 
-    and a pnp-template
-    
-    run test from nagios-host; you might turn on debugging_output (output 
-    appears in the logs @ $SPOOL_DATA_DIR)
-
-    enjoy your graphs ;-) 
-
-
-Plugin-Modi
-    the plugin works in two different modi:
-  
-  Alert-Modus  
-    check_snort.sh -m alerts checks the actual alerts againts an average 
-    alert_count; selection can be made with the -i switch
-
-    -i [INTERVAL] set check_interval (actual_alert vs avg_alert:
-                  1 -> 5min vs 60min
-                  2 -> 1hour vs 24hour [default]
-                  3 -> 24hour vs 7day
-                  4 -> 7 day vs 30 day (DO NOT USE)
-                  5 -> 7 day vs 90 day (DO NOT USE)
-                  6 -> display total number (no warning/critical) [nyr]
-    
-    furthermore you can choose a priority-level with the -p switch, given a range
-    from 1 (lowest prio, all alerts) to 4 (highest prio, only successfull-[user|admin] 
-    and successfull exploits); -p 3 is always a good start
-
-    -p [PRIORITY] set the snort_sig_priority_level to check against;
-                  default: 3
-    
-    
-  Host-Modus *
-    tbd ...
-    
-
-
-Running the plugin
-    depending on the amount of alerts it's wise to start just
-    with a few checks, maybe interval 2 for prio 2/3
-    (check_snort.sh -m alerts -i 2 -p 2 ), being checked
-    every five minutes)
-    alerting is best done with interval 1 or 2, but you'll need to adjust
-    the warning/critical threshold, since the default values and the values
-    in cfg.templates are taken from a webserver-environment.
-     
-    if you implement checks with -i > 2 you should run this checks
-    just once every hour or less frequent, since this interval 
-    is more for statistical reasons and not alerting, but might cause some
-    load on the database. 
-    
-    
-    
-    
-Output:
-    log_output is placed into $SPOOL_DATA_DIR (default) and might be verbose using
-    the -d switch 
-    the plugin returns, if check was able to execute OK/WARNING/CRITICAL, otherwise UNKNOWN
-    in good nagios-plugin-tradition; beside this some values are display:
-    the following live shows the output for: check_snort.sh -m alerts -p 1 -i 1 -w 1000 -c 10000
-    SNORT_CHECK OK - [alerts] p-1 :: 5min-1hr :: last: 151 - avg: 20 / thresh: 220/2020 [1000%/10000%]  
-    the output displays modus, prio, intervall last_alerts, avg_alerts and the threshold in values and 
-    percent. beside this, the plugin also returns actaual_alert_count, avg_alert_count, total_alert_count 
-    for the avg_interval; in this case, perfdata would be 5min=151;220;2020; 1hr=244; 1hr-avg=20.
-    for displaying the graphs via pnp there is a little pnp_template in check_snort.fg.template
-    check the plugin_homepage for examples 
-    
-    
-
-Usage: 
-
-
-check_snort.sh 
-            - nagios_plugin to snort_hosts or 
-              check snort_alerts in snort_databases
-              and alert on given thresholds; 
-              to be used @ snort_db_hosts via check_nrpe
-              see check_snort.README for more details
-              
-  [nyr]  ->  use with caution: function not yet ready implemented and tested 
-
-  USAGE:
-    check_snort.sh [options] 
-
-  CONFIG:
-    values for db_acces, defaults etc might be configured 
-    within this file -> /path/to/plugins/check_snort.sh
-    
-  OPTIONS
-    this script uses 2 modes: 
-    -m [modus]    set the working-modus
-                  MODI: 
-                    host   - check snort_host specific details (running, dropped packages)
-                             [nyr]
-                    alerts - check snort_alerts against a given database (only mysql supported
-                             at the moment 
-
-    -c [percent]  set critical_threshold; if actual_alert
-                  is [percent] higher then avg_alert returns CRITICAL 
-                  if the alertcount is [percent] lower, an
-                  anormal_report is generated and displayed
-                  default: 100
-                  
-    -w [percent]  set warning_threshold; if actual_alert
-                  is [percent] higher then avg_alert warning is displayed
-                  if the alertcount is [percent] lower, an
-                  anormal_report is generated and displayed
-                  default: 500
-                  
-    -i [INTERVAL] set check_interval (actual_alert vs avg_alert:
-                  1 -> 5min vs 60min
-                  2 -> 1hour vs 24hour [default]
-                  3 -> 24hour vs 7day
-                  4 -> 7 day vs 30 day (DO NOT USE)
-                  5 -> 7 day vs 90 day (DO NOT USE)
-                  6 -> display total number (no warning/critical) [nyr]
-                  
-    -p [PRIORITY] set the snort_sig_priority_level to check against;
-                  default: 3
-    
-    -s [sid]      set a special sid to check instead of priority
-                  [nyr]
-                  
-    
-    -d            debuG_output > logfile
-                  
-    -l [logfile]  alternate log_file
-                  default: SPOOL_DATA_DIR/check_snort.log
-                  
-    
-    -o [out_dir]  give a separate spool_data_dir 
-                  default: /var/log/nagios
-                  may be changed within the script itself via default_VAR
-    
-    -z            create cvs_output in SPOOL_DATA_DIR [nyr]
-  
-  
-  EXAMPLE
-   check_snort.sh -m alerts -i 3 -w 100 -c 200 
-
-
-check_snort.cfg.templates 
-
-
-#
-# nagios/pnp config_templates for check_snort.sh 
-#
-# 2009-10-20
-#
-# local-nrpe.cfg
-# dont_blame_nrpe=1
-command[check_snort_alerts]=/etc/nagios/plugins/check_snort.sh -m alerts -i $ARG1$ -p $ARG2$ -w $ARG3$ -c $ARG4$ 
-
-
-    
-
-# nagios_conf
-
-### command_definition w/ values ###################################
-define  command {
-    command_name    check_snort_alerts
-    command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c check_snort_alerts -a $ARG2$
-    }   
-    
-
-
-##### prio 4 templates #####################################
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p4-1 5min
-        check_command           check_snort_alerts!1 4 1000 10000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   5
-        retry_check_interval    5
-        max_check_attempts      3
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p4-2 1hr
-        check_command           check_snort_alerts!2 4 500 5000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   30
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p4-3 24hr
-        check_command           check_snort_alerts!3 4 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   60
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p4-4 7d
-        check_command           check_snort_alerts!4 4 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p4-5 7d
-        check_command           check_snort_alerts!5 4 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-
-##### prio 3 templates #####################################
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p3-1 5min
-        check_command           check_snort_alerts!1 3 1000 10000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   5
-        retry_check_interval    2
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p3-2 1hr
-        check_command           check_snort_alerts!2 3 500 5000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   30
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p3-3 24hr
-        check_command           check_snort_alerts!3 3 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   60
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p3-4 7d
-        check_command           check_snort_alerts!4 3 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p3-5 7d
-        check_command           check_snort_alerts!5 3 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-
-##### prio 2 templates #####################################
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p2-1 5min
-        check_command           check_snort_alerts!1 2 1000 10000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   5
-        retry_check_interval    2
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p2-2 1hr
-        check_command           check_snort_alerts!2 2 400 5000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   30
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p2-3 24hr
-        check_command           check_snort_alerts!3 2 300 1000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   60
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p2-4 7d
-        check_command           check_snort_alerts!4 2 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p2-5 7d
-        check_command           check_snort_alerts!5 2 500 1000
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      2
-        register                0
-
-}
-
-##### prio 1 templates #####################################
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p1-1 5min
-        check_command           check_snort_alerts!1 1 1000 10000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   5
-        retry_check_interval    2
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p1-2 1hr
-        check_command           check_snort_alerts!2 1 400 5000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   30
-        retry_check_interval    5
-        max_check_attempts      2
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p1-3 24hr
-        check_command           check_snort_alerts!3 1 300 1000 
-        use                     generic-service
-        check_period            24x7
-        normal_check_interval   60
-        retry_check_interval    10
-        max_check_attempts      3
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p1-4 7d
-        check_command           check_snort_alerts!4 1 500 1000
-        use                     generic-service
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      3
-        register                0
-
-}
-
-define  service {
-        host_name               snort_db_host
-        service_description     snort_alerts p1-5 7d
-        check_command           check_snort_alerts!5 1 500 1000
-        use                     generic-service
-        normal_check_interval   720
-        retry_check_interval    10
-        max_check_attempts      3
-        register                0
-
-}
-
-
-
-# pnp_template => nagios3/htdocs/pnp/templates/check_snort.pnp
-<?php
-#
-# Copyright (c) 2006-2008 Joerg Linge (http://www.pnp4nagios.org)
-#
-# modified for check_snort_alerts / 
-#
-# 2009-09-30
-#
-#
-$opt[1] = "--title \"AVG_ALERTS / $servicedesc\" ";
-#
-$def[1] =  "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;
-$def[1] .=  "DEF:var2=$rrdfile:$DS[3]:AVERAGE " ;
-$def[1] .= "AREA:0 " ;
-$def[1] .= "AREA:var2#00FF00:\"Avg Alerts $NAME[2] \":STACK " ;
-$def[1] .= "LINE1:var2#000000 " ;
-$def[1] .= "LINE2:var1#FF0000:\"Last Alerts $NAME[1] \" " ;
-$def[1] .= "VDEF:var3=var1,MAXIMUM " ;
-$def[1] .= "LINE1:var3#F020F7:MAX " ;
-$def[1] .= "COMMENT:\"              \" " ;
-$def[1] .= "COMMENT:\"-----------------------------------------------\" " ;
-$def[1] .= "COMMENT:\"last alerts count-interval  $NAME[1]                 \" " ;
-$def[1] .= "COMMENT:\"avg  alerts count-interval  $NAME[3]                 \" " ;
-$def[1] .= "COMMENT:\"-----------------------------------------------            \" " ;
-$def[1] .= "GPRINT:var1:LAST:\"last alerts %6.0lf                \" ";
-$def[1] .= "COMMENT:\"                       \" " ;
-$def[1] .= "GPRINT:var2:LAST:\"avg-alerts  %6.0lf   \" ";
-$def[1] .= "COMMENT:\"                                 \" " ;
-$def[1] .= "GPRINT:var1:MAX:\"max-alerts  %6.0lf   \" ";
-$def[1] .= "COMMENT:\"                                 \" " ;
-$def[1] .= "COMMENT:\"-----------------------------------------------\" " ;
-$def[1] .= "COMMENT:\"limits -> w $WARN[1] | c $CRIT[1]                  \" " ;
-$def[1] .= "COMMENT:\"-----------------------------------------------            \" " ;
-$def[1] .= "COMMENT:\"host   -> $hostname     \" " ;
-#$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
-
-
-$opt[2] = "--title \"TOTAL_ALERTS / $servicedesc\" ";
-
-$def[2] =  "DEF:var1=$rrdfile:$DS[2]:AVERAGE " ;
-$def[2] .= "AREA:0 " ;
-$def[2] .= "AREA:var1#00FF00:\"total_count $NAME[3] - $servicedesc \":STACK " ;
-$def[2] .= "LINE1:var1#000000 " ;
-$def[2] .= "COMMENT:\"                 \" " ;
-$def[2] .= "COMMENT:\"-----------------------------------------------\" " ;
-$def[2] .= "COMMENT:\"total counts  $NAME[3]                 \" " ;
-$def[2] .= "COMMENT:\"-----------------------------------------------            \" " ;
-$def[2] .= "GPRINT:var1:LAST:\"$NAME[3] total_count %6.0lf    \" ";
-$def[2] .= "COMMENT:\"                                 \" " ;
-$def[2] .= "COMMENT:\"-----------------------------------------------            \" " ;
-$def[2] .= "COMMENT:\"host        $hostname     \" " ;
-
-
-?>
-
diff --git a/contrib/psutil-0.2.1/CREDITS b/contrib/psutil-0.2.1/CREDITS
deleted file mode 100644
index 5b80b8c..0000000
--- a/contrib/psutil-0.2.1/CREDITS
+++ /dev/null
@@ -1,56 +0,0 @@
-
-Intro
-=====
-
-We would like to recognize some of the people who have been instrumental in the
-development of psutil.
-I'm sure we are forgetting some people (feel free to email us), but here is a
-short list.
-It's modeled after the Linux CREDITS file where the fields are:
-name (N), e-mail (E), web-address (W), country (C), description (D), (I) issues
-(issue tracker is at http://code.google.com/p/psutil/issues/list).
-Really thanks to all of you.
-
-
-Maintainers
-===========
-
-N: Giampaolo Rodola'
-C: Italy
-E: g.rodola@gmail.com
-
-N: Jay Loden
-C: NJ, USA
-E: jloden@gmail.com
-W: http://www.jayloden.com
-
-
-Contributors
-============
-
-N: wj32
-E: wj32.64@gmail.com
-D: process username() and get_connections() on Windows
-I: 114, 115
-
-N: Yan Raber
-C: Bologna, Italy
-E: yanraber@gmail.com
-D: help on Windows development
-
-N: Dave Daeschler
-C: USA
-E: ddaeschl@rsaisp.com
-
-N: cjgohlke
-E: cjgohlke@gmail.com
-D: Windows 64 bit support
-I: 107
-
-N: Jeffery Kline
-E: jeffery.kline@gmail.com
-I: 130
-
-N: Grabriel Monnerat
-E: gabrielmonnerat@gmail.com
-I: 146
diff --git a/contrib/psutil-0.2.1/HISTORY b/contrib/psutil-0.2.1/HISTORY
deleted file mode 100644
index 5e16aee..0000000
--- a/contrib/psutil-0.2.1/HISTORY
+++ /dev/null
@@ -1,193 +0,0 @@
-Bug tracker at http://code.google.com/p/psutil/issues
-
-0.2.1 - 2011-03-20
-------------------
-
-NEW FEATURES
-
- * Issue 64: per-process I/O counters.
- * Issue 116: per-process wait() (wait for process to terminate and return its
-   exit code).
- * Issue 134: per-process get_threads() returning information (id, user and
-   kernel times) about threads opened by process.
- * Issue 136: process executable path on FreeBSD is now determined by asking
-   the kernel instead of guessing it from cmdline[0].
- * Issue 137: per-process real, effective and saved user and group ids.
- * Issue 140: system boot time.
- * Issue 142: per-process get and set niceness (priority).
- * Issue 143: per-process status.
- * Issue 147: per-process I/O nice (priority) - Linux only.
- * Issue 148: psutil.Popen class which tidies up subprocess.Popen and
-   psutil.Process in a unique interface.
- * Issue 152: (OSX) get_process_open_files() implementation has been rewritten
-   in C and no longer relies on lsof resulting in a 3x speedup.
- * Issue 153: (OSX) get_process_connection() implementation has been rewritten
-   in C and no longer relies on lsof resulting in a 3x speedup.
-
-BUGFIXES
-
- * Issue 83: process cmdline is empty on OSX 64-bit.
- * Issue 130: a race condition can cause IOError exception be raised on
-   Linux if process disappears between open() and subsequent read() calls.
- * Issue 145: WindowsError was raised instead of psutil.AccessDenied when using
-   process resume() or suspend() on Windows.
- * Issue 146: 'exe' property on Linux can raise TypeError if path contains NULL
-   bytes.
- * Issue 151: exe and getcwd() for PID 0 on Linux return inconsistent data.
-
-API CHANGES
-
- * Process "uid" and "gid" properties are deprecated in favor of "uids" and
-   "gids" properties.
-
-
-0.2.0 - 2010-11-13
-------------------
-
-NEW FEATURES
-
- * Issue 79: per-process open files.
- * Issue 88: total system physical cached memory.
- * Issue 88: total system physical memory buffers used by the kernel.
- * Issue 91: per-process send_signal() and terminate() methods.
- * Issue 95: NoSuchProcess and AccessDenied exception classes now provide "pid",
-   "name" and "msg" attributes.
- * Issue 97: per-process children.
- * Issue 98: Process.get_cpu_times() and Process.get_memory_info now return
-   a namedtuple instead of a tuple.
- * Issue 103: per-process opened TCP and UDP connections.
- * Issue 107: add support for Windows 64 bit. (patch by cjgohlke)
- * Issue 111: per-process executable name.
- * Issue 113: exception messages now include process name and pid.
- * Issue 114: process username Windows implementation has been rewritten in pure
-   C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
-   longer required as a third-party dependancy. (patch by wj32)
- * Issue 117: added support for Windows 2000.
- * Issue 123: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
-   new 'interval' parameter.
- * Issue 129: per-process number of threads.
-
-BUGFIXES
-
- * Issue 80: fixed warnings when installing psutil with easy_install.
- * Issue 81: psutil fails to compile with Visual Studio.
- * Issue 94: suspend() raises OSError instead of AccessDenied.
- * Issue 86: psutil didn't compile against FreeBSD 6.x.
- * Issue 102: orphaned process handles obtained by using OpenProcess in C were
-   left behind every time Process class was instantiated.
- * Issue 111: path and name Process properties report truncated or erroneous
-   values on UNIX.
- * Issue 120: cpu_percent() always returning 100% on OS X.
- * Issue 112: uid and gid properties don't change if process changes effective
-   user/group id at some point.
- * Issue 126: ppid, uid, gid, name, exe, cmdline and create_time properties are
-   no longer cached and correctly raise NoSuchProcess exception if the process
-   disappears.
-
-API CHANGES
-
- * psutil.Process.path property is deprecated and works as an alias for "exe"
-   property.
- * psutil.Process.kill(): signal argument was removed - to send a signal to the
-   process use send_signal(signal) method instead.
- * psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
- * psutil.cpu_times() returns a nametuple instead of a tuple.
- * New psutil.Process methods: get_open_files(), get_connections(),
-   send_signal() and terminate().
- * ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
-   cached and raise NoSuchProcess exception if process disappears.
- * psutil.cpu_percent() no longer returns immediately (see issue 123).
- * psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
-   immediately by default (see issue 123).
-
-
-0.1.3 - 2010-03-02
-------------------
-
-NEW FEATURES
-
- * Issue 14: per-process username
- * Issue 51: per-process current working directory (Windows and Linux only)
- * Issue 59: Process.is_running() is now 10 times faster
- * Issue 61: added supoprt for FreeBSD 64 bit
- * Issue 71: implemented suspend/resume process
- * Issue 75: python 3 support
-
-BUGFIXES
-
- * Issue 36: process cpu_times() and memory_info() functions succeeded also for
-   dead processes while a NoSuchProcess exception is supposed to be raised.
- * Issue 48: incorrect size for mib array defined in getcmdargs for BSD
- * Issue 49: possible memory leak due to missing free() on error condition on
- * Issue 50: fixed getcmdargs() memory fragmentation on BSD
- * Issue 55: test_pid_4 was failing on Windows Vista
- * Issue 57: some unit tests were failing on systems where no swap memory is
-   available
- * Issue 58: is_running() is now called before kill() to make sure we are going
-   to kill the correct process.
- * Issue 73: virtual memory size reported on OS X includes shared library size
- * Issue 77: NoSuchProcess wasn't raised on Process.create_time if kill() was
-   used first.
-
-
-0.1.2 - 2009-05-06
-------------------
-
-NEW FEATURES
-
- * Issue 32: Per-process CPU user/kernel times
- * Issue 33: Process create time
- * Issue 34: Per-process CPU utilization percentage
- * Issue 38: Per-process memory usage (bytes)
- * Issue 41: Per-process memory utilization (percent)
- * Issue 39: System uptime
- * Issue 43: Total system virtual memory
- * Issue 46: Total system physical memory
- * Issue 44: Total system used/free virtual and physical memory
-
-BUGFIXES
-
- * Issue 36: NoSuchProcess not raised on Windows when accessing timing methods
- * Issue 40: test_get_cpu_times() failing on FreeBSD and OS X
- * Issue 42: get_memory_percent() raises AccessDenied on Windows
-
-
-0.1.1 - 2009-03-06
-------------------
-
-NEW FEATURES
-
- * Issue 4: FreeBSD support for all functions of psutil
- * Issue 9: Process.uid and Process.gid now retrieve process UID and GID.
- * Issue 11: Support for parent/ppid - Process.parent property returns a
-   Process object representing the parent process, and Process.ppid returns
-   the parent PID.
- * Issue 12 & 15: NoSuchProcess exception now raised when creating an object
-   for a nonexistent process, or when retrieving information about a process
-   that has gone away.
- * Issue 21: AccessDenied exception created for raising access denied errors
-   from OSError or WindowsError on individual platforms.
- * Issue 26: psutil.process_iter() function to iterate over processes as
-   Process objects with a generator.
- * Process objects can now also be compared with == operator for equality
-   (PID, name, command line are compared).
-
-BUGFIXES
-
- * Issue 16: Special case for Windows' "System Idle Process" (PID 0) which
-   otherwise would return an "invalid parameter" exception.
- * Issue 17: get_process_list() ignores NoSuchProcess and AccessDenied
-   exceptions during building of the list.
- * Issue 22: Process(0).kill() was failing on Windows with an unset exception
- * Issue 23: Special case for pid_exists(0)
- * Issue 24: Process(0).kill() now raises AccessDenied exception instead of
-   WindowsError.
- * Issue 30: psutil.get_pid_list() was returning two instances of PID 0 on OS
-   X and FreeBSD platforms.
-
-
-0.1.0 - 2009-01-27
-------------------
-
- * Initial release.
-
diff --git a/contrib/psutil-0.2.1/LICENSE b/contrib/psutil-0.2.1/LICENSE
deleted file mode 100644
index e91b135..0000000
--- a/contrib/psutil-0.2.1/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-psutil is distributed under BSD license reproduced below.
-
-Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola'
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
- * Neither the name of the psutil authors nor the names of its contributors
-   may be used to endorse or promote products derived from this software without
-   specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/contrib/psutil-0.2.1/MANIFEST.in b/contrib/psutil-0.2.1/MANIFEST.in
deleted file mode 100644
index 1fc8328..0000000
--- a/contrib/psutil-0.2.1/MANIFEST.in
+++ /dev/null
@@ -1,9 +0,0 @@
-include CREDITS
-include HISTORY
-include LICENSE
-include MANIFEST.in
-include README
-include setup.py
-recursive-include docs *.html *.dia *.png
-recursive-include psutil *.py *.c *.h
-recursive-include test *.py
diff --git a/contrib/psutil-0.2.1/PKG-INFO b/contrib/psutil-0.2.1/PKG-INFO
deleted file mode 100644
index b892a99..0000000
--- a/contrib/psutil-0.2.1/PKG-INFO
+++ /dev/null
@@ -1,41 +0,0 @@
-Metadata-Version: 1.0
-Name: psutil
-Version: 0.2.1
-Summary: A process utilities module for Python
-Home-page: http://code.google.com/p/psutil/
-Author: Giampaolo Rodola, Dave Daeschler, Jay Loden
-Author-email: psutil-dev@googlegroups.com
-License: License :: OSI Approved :: BSD License
-Download-URL: http://psutil.googlecode.com/files/psutil-0.2.1.tar.gz
-Description: 
-        psutil is a module providing convenience functions for managing processes in a
-        portable way by using Python.
-Keywords: psutil,ps,top,process,utility,lsof,top,netstat,taskmgr
-Platform: Platform Independent
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: POSIX :: BSD :: FreeBSD
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.0
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Topic :: System :: Monitoring
-Classifier: Topic :: System :: Networking
-Classifier: Topic :: System :: Benchmark
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: MIT License
diff --git a/contrib/psutil-0.2.1/README b/contrib/psutil-0.2.1/README
deleted file mode 100644
index 18ca454..0000000
--- a/contrib/psutil-0.2.1/README
+++ /dev/null
@@ -1,120 +0,0 @@
-
-Introduction
-============
-
-psutil is a module providing an interface for retrieving information on running
-processes in a portable way by using Python.
-It currently supports Linux, OS X, FreeBSD and Windows.
-
-psutil website is at http://code.google.com/p/psutil/
-
-The following document describes how to compile and install psutil from sources
-on different platforms.
-
-
-Using easy_install
-==================
-
-The easiest way to install psutil from sources is using easy_install.
-Get the latest easy_install version from http://pypi.python.org/pypi/setuptools
-and just run:
-
- > easy_install psutil
-
-This should get the most updated psutil version from the Python pypi repository,
-unpack it, compile it and install it automatically.
-
-
-Installing on Windows using mingw32
-===================================
-
-After the mingw [1] environment is properly set up on your system you can
-compile Windows sources by entering:
-
- > setup.py build -c mingw32
-
-To compile and install just append the "install" keyword at the end of the
-command line above, like this:
-
- > setup.py build -c mingw32 install
-
-It might be possible that distutils will complain about missing gcc executable.
-That means you have to add mingw bin PATH variable first.
-Entering this line in the command prompt should do the work:
-
- > SET PATH=C:\MinGW\bin;%PATH%
-
-NOTE: this assumes MinGW is installed in C:\MinGW, if not simply replace the
-path in the command above with an appropriate location.
-
-[1] http://www.mingw.org/
-
-
-Installing on Windows using Visual Studio
-=========================================
-
-To use Visual Studio to install psutil, you must have the same version of
-Visual Studio used to compile your installation of Python. For older versions
-of Python that will be Visual Studio 2003. For 2.6 and later it should be
-Visual Studio 2008. If you do not have the requisite version of Visual Studio
-available then it is recommended to use MinGW to compile psutil instead.
-
-If you do have Visual Studio installed, you can use the basic distutils
-commands:
-
-  > setup.py build
-
-or to install and build:
-
-  > setup.py install
-
-distutils should take care of any necessary magic to compile from there.
-
-
-Installing on OS X
-==================
-
-OS X installation from source will require gcc which you can obtain as part of
-the 'XcodeTools' installer from Apple. Then you can run the standard distutils
-commands:
-
-to build only:
-
-  > python setup.py build
-
-to install and build:
-
-  > python setup.py install
-
-NOTE: due to developer's hardware limitations psutil has only been compiled and
-tested on OS X 10.4.11 so may or may not work on other versions.
-
-
-Installing on FreeBSD
-=====================
-
-The same compiler used to install Python must be present on the system in order
-to build modules using distutils. Assuming it is installed, you can build using
-the standard distutils commands:
-
-build only:
-
-  > python setup.py build
-
-install and build:
-
-  > python setup.py install
-
-
-Installing on Linux
-===================
-
-gcc is required and so the python headers. They can easily be installed by using
-the distro package manager. For example, on Ubuntu:
-
-  > sudo apt-get install python-dev
-
-Once done, you can install/build psutil with:
-
-  > python setup.py install
-
diff --git a/contrib/psutil-0.2.1/docs/class_diagram.dia b/contrib/psutil-0.2.1/docs/class_diagram.dia
deleted file mode 100644
index 401ac72..0000000
--- a/contrib/psutil-0.2.1/docs/class_diagram.dia
+++ /dev/null
@@ -1,1475 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
-  <dia:diagramdata>
-    <dia:attribute name="background">
-      <dia:color val="#ffffff"/>
-    </dia:attribute>
-    <dia:attribute name="pagebreak">
-      <dia:color val="#000099"/>
-    </dia:attribute>
-    <dia:attribute name="paper">
-      <dia:composite type="paper">
-        <dia:attribute name="name">
-          <dia:string>#A4#</dia:string>
-        </dia:attribute>
-        <dia:attribute name="tmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="bmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="lmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="rmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="is_portrait">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="scaling">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="fitto">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-      </dia:composite>
-    </dia:attribute>
-    <dia:attribute name="grid">
-      <dia:composite type="grid">
-        <dia:attribute name="width_x">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="width_y">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="visible_x">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="visible_y">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:composite type="color"/>
-      </dia:composite>
-    </dia:attribute>
-    <dia:attribute name="color">
-      <dia:color val="#d8e5e5"/>
-    </dia:attribute>
-    <dia:attribute name="guides">
-      <dia:composite type="guides">
-        <dia:attribute name="hguides"/>
-        <dia:attribute name="vguides"/>
-      </dia:composite>
-    </dia:attribute>
-  </dia:diagramdata>
-  <dia:layer name="Background" visible="true" active="true">
-    <dia:object type="UML - LargePackage" version="0" id="O0">
-      <dia:attribute name="obj_pos">
-        <dia:point val="4.25,0.01251"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="4.2,-1.03749;61.8,36.5375"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="4.25,0.01251"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="57.500000000000007"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="36.474989999999977"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#psutil#</dia:string>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="UML - Class" version="0" id="O1">
-      <dia:attribute name="obj_pos">
-        <dia:point val="27.7475,4.05"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="27.6975,4;35.1975,6.2"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="27.7475,4.05"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="7.4000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="2.0999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#psutil (module)#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="comment">
-        <dia:string>#main py module#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="abstract">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_comments">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_after_char">
-        <dia:int val="40"/>
-      </dia:attribute>
-      <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
-      </dia:attribute>
-      <dia:attribute name="comment_tagging">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_color">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font">
-        <dia:font family="monospace" style="0" name="Courier"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font">
-        <dia:font family="monospace" style="88" name="Courier-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font">
-        <dia:font family="monospace" style="8" name="Courier-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font">
-        <dia:font family="sans" style="80" name="Helvetica-Bold"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font">
-        <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font">
-        <dia:font family="sans" style="8" name="Helvetica-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font_height">
-        <dia:real val="0.69999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="attributes"/>
-      <dia:attribute name="operations"/>
-      <dia:attribute name="template">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="templates"/>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="UML - Class" version="0" id="O2">
-      <dia:attribute name="obj_pos">
-        <dia:point val="12.7,9.3"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="12.65,9.25;19.41,19.65"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="12.7,9.3"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="6.6600000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="10.300000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#Process class#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="comment">
-        <dia:string>#higher-level public python wrapper#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="abstract">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_attributes">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_comments">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_after_char">
-        <dia:int val="40"/>
-      </dia:attribute>
-      <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
-      </dia:attribute>
-      <dia:attribute name="comment_tagging">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_color">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font">
-        <dia:font family="monospace" style="0" name="Courier"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font">
-        <dia:font family="monospace" style="88" name="Courier-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font">
-        <dia:font family="monospace" style="8" name="Courier-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font">
-        <dia:font family="sans" style="80" name="Helvetica-Bold"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font">
-        <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font">
-        <dia:font family="sans" style="8" name="Helvetica-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font_height">
-        <dia:real val="0.69999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="attributes">
-        <dia:composite type="umlattribute">
-          <dia:attribute name="name">
-            <dia:string>#pid#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="value">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umlattribute">
-          <dia:attribute name="name">
-            <dia:string>#name#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="value">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umlattribute">
-          <dia:attribute name="name">
-            <dia:string>#cmdline#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="value">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umlattribute">
-          <dia:attribute name="name">
-            <dia:string>#...#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="value">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="operations">
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#get_cpu_times#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#terminate#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#kill#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#...#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="template">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="templates">
-        <dia:composite type="umlformalparameter">
-          <dia:attribute name="name">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="UML - Class" version="0" id="O3">
-      <dia:attribute name="obj_pos">
-        <dia:point val="24.85,16.25"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="24.8,16.2;36.4925,23.2"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="24.85,16.25"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="11.592499999999999"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="6.9000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#_ps[platform].py module#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="comment">
-        <dia:string>#intermediate python wrapper module#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="abstract">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_comments">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_after_char">
-        <dia:int val="40"/>
-      </dia:attribute>
-      <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
-      </dia:attribute>
-      <dia:attribute name="comment_tagging">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_color">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font">
-        <dia:font family="monospace" style="0" name="Courier"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font">
-        <dia:font family="monospace" style="88" name="Courier-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font">
-        <dia:font family="monospace" style="8" name="Courier-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font">
-        <dia:font family="sans" style="80" name="Helvetica-Bold"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font">
-        <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font">
-        <dia:font family="sans" style="8" name="Helvetica-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font_height">
-        <dia:real val="0.69999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="attributes"/>
-      <dia:attribute name="operations">
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#process_exists#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#kill_process#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#get_pid_list#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#...#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="template">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="templates"/>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="UML - Class" version="0" id="O4">
-      <dia:attribute name="obj_pos">
-        <dia:point val="22.835,26.9875"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="22.785,26.9375;38.4,32.9375"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="22.835,26.9875"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="15.515000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="5.9000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#_psutil_[platform].c#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="comment">
-        <dia:string>#C extension#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="abstract">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_attributes">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_comments">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_after_char">
-        <dia:int val="40"/>
-      </dia:attribute>
-      <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
-      </dia:attribute>
-      <dia:attribute name="comment_tagging">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_color">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font">
-        <dia:font family="monospace" style="0" name="Courier"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font">
-        <dia:font family="monospace" style="88" name="Courier-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font">
-        <dia:font family="monospace" style="8" name="Courier-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font">
-        <dia:font family="sans" style="80" name="Helvetica-Bold"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font">
-        <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font">
-        <dia:font family="sans" style="8" name="Helvetica-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font_height">
-        <dia:real val="0.69999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="attributes"/>
-      <dia:attribute name="operations">
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#process_exists#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>#bool#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters">
-            <dia:composite type="umlparameter">
-              <dia:attribute name="name">
-                <dia:string>#pid#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="type">
-                <dia:string>#int#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="value">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="comment">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="kind">
-                <dia:enum val="0"/>
-              </dia:attribute>
-            </dia:composite>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#get_process_info#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>#ProcessInfo#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters">
-            <dia:composite type="umlparameter">
-              <dia:attribute name="name">
-                <dia:string>#pid#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="type">
-                <dia:string>#int#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="value">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="comment">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="kind">
-                <dia:enum val="0"/>
-              </dia:attribute>
-            </dia:composite>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#kill_process#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>#int#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters">
-            <dia:composite type="umlparameter">
-              <dia:attribute name="name">
-                <dia:string>#pid#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="type">
-                <dia:string>#int#</dia:string>
-              </dia:attribute>
-              <dia:attribute name="value">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="comment">
-                <dia:string>##</dia:string>
-              </dia:attribute>
-              <dia:attribute name="kind">
-                <dia:enum val="0"/>
-              </dia:attribute>
-            </dia:composite>
-          </dia:attribute>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#get_pid_list#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>#int[]#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="template">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="templates"/>
-    </dia:object>
-    <dia:object type="UML - Class" version="0" id="O5">
-      <dia:attribute name="obj_pos">
-        <dia:point val="38.7485,8.77375"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="38.6985,8.72375;49.761,14.6238"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="38.7485,8.77375"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="10.9625"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="5.8000000000000007"/>
-      </dia:attribute>
-      <dia:attribute name="name">
-        <dia:string>#System-related objects#</dia:string>
-      </dia:attribute>
-      <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="comment">
-        <dia:string>##</dia:string>
-      </dia:attribute>
-      <dia:attribute name="abstract">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_attributes">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="suppress_operations">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="visible_attributes">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="visible_comments">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_operations">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="wrap_after_char">
-        <dia:int val="40"/>
-      </dia:attribute>
-      <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
-      </dia:attribute>
-      <dia:attribute name="comment_tagging">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.0010000000000000002"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_color">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="text_color">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font">
-        <dia:font family="monospace" style="0" name="Courier"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font">
-        <dia:font family="monospace" style="88" name="Courier-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font">
-        <dia:font family="monospace" style="8" name="Courier-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font">
-        <dia:font family="sans" style="80" name="Helvetica-Bold"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font">
-        <dia:font family="sans" style="88" name="Helvetica-BoldOblique"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font">
-        <dia:font family="sans" style="8" name="Helvetica-Oblique"/>
-      </dia:attribute>
-      <dia:attribute name="normal_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="polymorphic_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_font_height">
-        <dia:real val="0.80000000000000004"/>
-      </dia:attribute>
-      <dia:attribute name="classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="abstract_classname_font_height">
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="comment_font_height">
-        <dia:real val="0.69999999999999996"/>
-      </dia:attribute>
-      <dia:attribute name="attributes">
-        <dia:composite type="umlattribute">
-          <dia:attribute name="name">
-            <dia:string>#TOTAL_PHYMEM#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="value">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="operations">
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#get_pid_list#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#cpu_times#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#pid_exists#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-        <dia:composite type="umloperation">
-          <dia:attribute name="name">
-            <dia:string>#...#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="stereotype">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="visibility">
-            <dia:enum val="0"/>
-          </dia:attribute>
-          <dia:attribute name="comment">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="abstract">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="inheritance_type">
-            <dia:enum val="2"/>
-          </dia:attribute>
-          <dia:attribute name="query">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="class_scope">
-            <dia:boolean val="false"/>
-          </dia:attribute>
-          <dia:attribute name="parameters"/>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="template">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="templates">
-        <dia:composite type="umlformalparameter">
-          <dia:attribute name="name">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="type">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O6">
-      <dia:attribute name="obj_pos">
-        <dia:point val="30.6462,23.15"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="30.2393,23.0993;30.9628,27.0993"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="30.6462,23.15"/>
-        <dia:point val="30.5925,26.9875"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow">
-        <dia:enum val="22"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_length">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_width">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O3" connection="6"/>
-        <dia:connection handle="1" to="O4" connection="1"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O7">
-      <dia:attribute name="obj_pos">
-        <dia:point val="19.36,14.9"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="19.2919,14.8319;24.9474,18.0694"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="19.36,14.9"/>
-        <dia:point val="24.85,18"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow">
-        <dia:enum val="22"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_length">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_width">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O2" connection="13"/>
-        <dia:connection handle="1" to="O3" connection="3"/>
-      </dia:connections>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O8">
-      <dia:attribute name="obj_pos">
-        <dia:point val="44.2298,14.5738"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="36.3402,14.5078;44.2957,18.0979"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="44.2298,14.5738"/>
-        <dia:point val="36.4425,18"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow">
-        <dia:enum val="22"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_length">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_width">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O5" connection="6"/>
-        <dia:connection handle="1" to="O3" connection="4"/>
-      </dia:connections>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O9">
-      <dia:attribute name="obj_pos">
-        <dia:point val="27.7475,5.1"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="15.9248,5.03606;27.8114,9.43732"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="27.7475,5.1"/>
-        <dia:point val="16.03,9.3"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow">
-        <dia:enum val="22"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_length">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_width">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O1" connection="3"/>
-        <dia:connection handle="1" to="O2" connection="1"/>
-      </dia:connections>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O10">
-      <dia:attribute name="obj_pos">
-        <dia:point val="35.1475,5.1"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="35.0824,5.0349;44.3334,8.88859"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="35.1475,5.1"/>
-        <dia:point val="44.2298,8.77375"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow">
-        <dia:enum val="22"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_length">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:attribute name="end_arrow_width">
-        <dia:real val="0.5"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O1" connection="4"/>
-        <dia:connection handle="1" to="O5" connection="1"/>
-      </dia:connections>
-      <dia:childnode parent="O0"/>
-    </dia:object>
-  </dia:layer>
-</dia:diagram>
diff --git a/contrib/psutil-0.2.1/docs/class_diagram.png b/contrib/psutil-0.2.1/docs/class_diagram.png
deleted file mode 100755
index 22a035e8df62e47cd8d882c06e2170919739d9ea..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 66252
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
Md^tIG;#dFpA04}dga7~l

diff --git a/contrib/psutil-0.2.1/docs/documentation.html b/contrib/psutil-0.2.1/docs/documentation.html
deleted file mode 100644
index 6b64b99..0000000
--- a/contrib/psutil-0.2.1/docs/documentation.html
+++ /dev/null
@@ -1,120 +0,0 @@
-
-<!-- saved from url=(0066)http://code.google.com/p/psutil/wiki/DocumentationDev?show=content -->
-<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>DocumentationDev</title>
- <script>window["_GOOG_TRANS_EXT_VER"] = "1";</script></head>
- <body>
-
-
-
-<div>
-<table>
- <tbody><tr>
-
-
- <td style="vertical-align:top;">
-
- <div id="wikicontent">
- <div class="vt" id="wikimaincol">
- <h1><a name="API_Reference"></a>API Reference<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#API_Reference" class="section_anchor"></a></h1><h2><a name="Exceptions"></a>Exceptions<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#Exceptions" class="section_anchor"></a></h2><p>psutil.<strong>NoSuchProcess<a href="http://code.google.com/p/psutil/w/edit/NoSuchProcess">?</a></strong><font size="3"><strong><tt>(</tt></strong></font><i>pid, name=None, msg=None</i><font size="3"><strong><tt>)</tt></strong></font> </p><blockquote>Raised when no process with the given PID is found in the current process list or when a process no longer exists (zombie).
-</blockquote><p></p><blockquote><i><strong>Changed in 0.2.0:</strong> <tt>pid</tt>, <tt>name</tt> and <tt>msg</tt> arguments were added</i>
-</blockquote><p>psutil.<strong>AccessDenied<a href="http://code.google.com/p/psutil/w/edit/AccessDenied">?</a></strong><font size="3"><strong><tt>(</tt></strong></font><i>pid=None, name=None, msg=None</i><font size="3"><strong><tt>)</tt></strong></font> </p><blockquote>Raised when permission to perform an action is denied.
-</blockquote><p></p><blockquote><i><strong>Changed in 0.2.0:</strong> <tt>pid</tt>, <tt>name</tt> and <tt>msg</tt> arguments were added </i>
-</blockquote><p>psutil.<strong>TimeoutExpired<a href="http://code.google.com/p/psutil/w/edit/TimeoutExpired">?</a></strong><font size="3"><strong><tt>(</tt></strong></font><i>pid=None, name=None</i><font size="3"><strong><tt>)</tt></strong></font> </p><blockquote>Raised on <tt>Process.wait(timeout)</tt> if timeout expires and process is still alive.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.1</strong></i>
-</blockquote><hr><h2><a name="Classes"></a>Classes<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#Classes" class="section_anchor"></a></h2><p>psutil.<strong>Process</strong><font size="3"><strong><tt>(</tt></strong></font><i>pid</i><font size="3"><strong><tt>)</tt></strong></font> </p><blockquote>A class which represents an OS process.
-</blockquote><ul><li><strong>pid</strong><br>The process pid. </li></ul><ul><li><strong>ppid</strong><br>The process parent pid. </li></ul><ul><li><strong>parent</strong><br>Return the parent process as a <tt>Process</tt> object. If no ppid is known then return <tt>None</tt>. </li></ul><ul><li><strong>name</strong><br>The process name. </li></ul><ul><li><strong>exe</strong><br>The process executable as an absolute path name. </li></ul><blockquote><i><strong>New in 0.2.0</strong></i>
-</blockquote><ul><li><strong>cmdline</strong><br>The command line process has been called with. </li></ul><ul><li><strong>path</strong><br>The process path.  </li></ul><blockquote><i><strong>Deprecated in 0.2.0</strong></i>
-</blockquote><ul><li><strong>create_time</strong><br> The process creation time as a floating point number expressed in seconds since the epoch, in <a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time" rel="nofollow">UTC</a>. </li></ul><ul><li><strong>uids</strong><br>The <i>real</i>, <i>effective</i> and <i>saved</i> user ids of the current process as a nameduple. This is the same as <a href="http://docs.python.org/library/os.html#os.getresuid" rel="nofollow">os.getresuid()</a> but per-process.  </li></ul><blockquote><i><strong>New in 0.2.1</strong></i><br><strong><i>Availability:</i></strong><i> UNIX</i>
-</blockquote><ul><li><strong>gids</strong><br>The <i>real</i>, <i>effective</i> and <i>saved</i> group ids of the current process as a nameduple. This is the same as <a href="http://docs.python.org/library/os.html#os.getresgid" rel="nofollow">os.getresgid()</a> but per-process.  </li></ul><blockquote><i><strong>New in 0.2.1</strong></i><br><i><strong>Availability:</strong> UNIX</i>
-</blockquote><ul><li><strong>uid</strong><br>The <i>real</i> user id of the current process. This is the same as <a href="http://docs.python.org/library/os.html#os.getuid" rel="nofollow">os.getuid()</a> but per-process. On Windows always return <tt>-1</tt>. </li></ul><blockquote><i><strong>Deprecated in 0.2.1:</strong> use uids property instead.</i>
-</blockquote><ul><li><strong>gid</strong><br>The <i>real</i> group id of the current process. This is the same as <a href="http://docs.python.org/library/os.html#os.getuid" rel="nofollow">os.getgid()</a> but per-process. On Windows always return <tt>-1</tt>. </li></ul><blockquote><i><strong>Deprecated in 0.2.1:</strong> use gids property instead.</i>
-</blockquote><ul><li><strong>username</strong><br>The name of the user that owns the process. On UNIX this is calculated by using <i>real</i> process uid. </li></ul><blockquote><i><strong>Changed in 2.0:</strong> Windows implementation has been rewritten in C for performace and <a href="http://sourceforge.net/projects/pywin32/" rel="nofollow">pywin32</a> extension is no longer required.</i>
-</blockquote><ul><li><strong>status</strong><br>The current process status. The return value is one of the <tt>STATUS_*</tt> constants, which is an integer that can be used in conjunction with str() to obtain a human-readable form of the current process status. Example: </li><pre class="prettyprint">&gt;&gt;&gt; import psutil, os
-&gt;&gt;&gt; p = psutil.Process(os.getpid())
-&gt;&gt;&gt; p.status
-0
-&gt;&gt;&gt; p.status == psutil.STATUS_RUNNING
-True
-&gt;&gt;&gt; str(p.status)
-'running'
-&gt;&gt;&gt; </pre></ul><blockquote><i><strong>New in 2.1</strong></i>
-</blockquote><ul><li><strong>nice</strong><br>Get or set process <a href="http://blogs.techrepublic.com.com/opensource/?p=140" rel="nofollow">niceness</a> (priority). On UNIX this is a number which usually goes from -20 to 20. The higher the nice value, the lower the priority of the process.   </li><pre class="prettyprint">&gt;&gt;&gt; p = psutil.Process(os.getpid())
-&gt;&gt;&gt; p.nice
-0
-&gt;&gt;&gt; p.nice = 10  # set/change process priority
-&gt;&gt;&gt; p.nice
-10</pre></ul><blockquote>On Windows this is available as well by using <a href="http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx" rel="nofollow">GetPriorityClass</a> and <a href="http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx" rel="nofollow">SetPriorityClass</a>. <tt>psutil.*_PRIORITY_CLASS</tt> constants (explained <a href="http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx" rel="nofollow">here</a>) can be used in conjunction. Example which increases process priority:
-</blockquote><blockquote><pre class="prettyprint">&gt;&gt; p.nice = psutil.HIGH_PRIORITY_CLASS</pre>
-</blockquote><blockquote><i><strong>New in 2.1</strong></i>
-</blockquote><ul><li><strong>getcwd</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return a string representing the process current working directory. </li></ul><blockquote><i><strong>Availability:</strong> Windows, Linux</i>
-</blockquote><ul><li><strong>get_io_counters</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return process I/O statistics as a namedtuple including the number of read and write operations performed by the process and the amount of bytes read and written. For linux refer to <a href="http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt#1304" rel="nofollow">/proc filesysem documentation</a>. On BSD there's apparently no way to retrieve bytes counters, hence <tt>-1</tt> is returned for <tt>read_bytes</tt> and <tt>write_bytes</tt> fields. OSX is not supported. </li><pre class="prettyprint">&gt;&gt;&gt; p.get_io_counters()
-io(read_count=454556, write_count=3456, read_bytes=110592, write_bytes=0)</pre></ul><blockquote><i><strong>New in 2.1</strong></i><br><i><strong>Availability:</strong> Linux, Windows, FreeBSD</i>
-</blockquote><ul><li><strong>get_ionice</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return <a href="http://friedcpu.wordpress.com/2007/07/17/why-arent-you-using-ionice-yet/" rel="nofollow">process I/O niceness</a> (priority) as a namedtuple including priority class and priority data. See <tt>set_ionice</tt> below for more information. </li></ul><blockquote><i><strong>New in 2.1</strong></i><br><i><strong>Availability:</strong> Linux</i>
-</blockquote><ul><li><strong>set_ionice</strong><font size="3"><strong><tt>(</tt></strong></font><i>ioclass, iodata=None</i><font size="3"><strong><tt>)</tt></strong></font><br>Change <a href="http://friedcpu.wordpress.com/2007/07/17/why-arent-you-using-ionice-yet/" rel="nofollow">process I/O niceness</a> (priority). <i>ioclass</i> is one of the <strong><tt>IOPRIO_CLASS_*</tt></strong> constants. <i>iodata</i> is a number which goes from 0 to 7. The higher <i>iodata</i> value, the lower the I/O priority of the process. For further information refer to <a href="http://linux.die.net/man/1/ionice" rel="nofollow">ionice</a> command line utility or <a href="http://linux.die.net/man/2/ioprio_set" rel="nofollow">ioprio_set</a> system call. The example below sets IDLE priority class for the current process, meaning it will only get I/O time when no other process needs the disk: </li><pre class="prettyprint">&gt;&gt;&gt; import psutil, os
-&gt;&gt;&gt; p = psutil.Process(os.getpid())
-&gt;&gt;&gt; p.set_ionice(psutil.IOPRIO_CLASS_IDLE)
-&gt;&gt;&gt; </pre></ul><blockquote><i><strong>New in 2.1</strong></i><br><i><strong>Availability:</strong> Linux</i>
-</blockquote><ul><li><strong>get_num_threads</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return the number of threads used by this process. </li></ul><blockquote><i><strong>New in 0.2.0</strong></i>
-</blockquote><ul><li><strong>get_threads</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return threads opened by process as a list of namedtuples including thread id and thread CPU times (user/system). </li></ul><blockquote><i><strong>New in 0.2.1</strong></i>
-</blockquote><ul><li><strong>get_cpu_times</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return a tuple whose values are process CPU user and system times which means the amount of time expressed in seconds that a process has spent in <a href="http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1" rel="nofollow">user/system mode</a>. </li></ul><ul><li><strong>get_cpu_percent</strong><font size="3"><strong><tt>(</tt></strong></font><i>interval=0.1</i><font size="3"><strong><tt>)</tt></strong></font><br>Return a float representing the process CPU utilization as a percentage. When interval is &gt; 0.0 compares process times to system CPU times elapsed before and after the interval (blocking). When interval is 0.0 or None compares process times to system CPU times elapsed since last call, returning immediately. In this case is recommended for accuracy that this function be called with at least 0.1 seconds between calls. </li></ul><blockquote><i><strong>Changed in 0.2.0:</strong> interval parameter was added</i>
-</blockquote><ul><li><strong>get_memory_info</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return a tuple representing <a href="http://en.wikipedia.org/wiki/Resident_Set_Size" rel="nofollow">RSS</a> (Resident Set Size) and VMS (Virtual Memory Size) in bytes.<br>On UNIX RSS and VMS are the same values shown by ps. On Windows RSS and VMS refer to "Mem Usage" and "VM Size" columns of taskmgr.exe. </li></ul><ul><li><strong>get_memory_percent</strong><font size="3"><strong><tt>()</tt></strong></font><br>Compare physical system memory to process resident memory and calculate process memory utilization as a percentage. </li></ul><ul><li><strong>get_children</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return the children of this process as a list of <tt>Process</tt> objects. </li></ul><blockquote><i><strong>New in 0.2.0</strong></i>
-</blockquote><ul><li><strong>get_open_files</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return files opened by process as a list of <a href="http://docs.python.org/library/collections.html?highlight=namedtuple#collections.namedtuple" rel="nofollow">namedtuples</a> including file absolute path name and file descriptor. On <strong>FreeBSD</strong> this is done by parsing <a href="http://en.wikipedia.org/wiki/Lsof" rel="nofollow">lsof</a> command output. If lsof is not installed on the system <a href="http://docs.python.org/library/exceptions.html?highlight=notimplementederror#exceptions.NotImplementedError" rel="nofollow">NotImplementedError</a> exception is raised.  Example: </li><pre class="prettyprint">&gt;&gt;&gt; import psutil, os
-&gt;&gt;&gt; f = open('file.ext', 'w')
-&gt;&gt;&gt; psutil.Process(os.getpid()).get_open_files()
-[openfile(path='/home/giampaolo/svn/psutil/file.ext', fd=3)]</pre></ul><blockquote><i><strong>New in 0.2.0</strong></i><br>
-<i><strong>Changed in 0.2.1:</strong> OSX implementation rewritten in C; no longer requiring lsof.</i>
-</blockquote><ul><li><strong>get_connections</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return all TCP and UPD connections opened by process as a list of <a href="http://docs.python.org/library/collections.html?highlight=namedtuple#collections.namedtuple" rel="nofollow">namedtuples</a>. Every namedtuple provides 6 attributes:<br><br> </li><ul><li><strong>fd</strong>: the socket file descriptor. This can be passed to <a href="http://docs.python.org/library/socket.html#socket.fromfd" rel="nofollow">socket.fromfd</a> to obtain a usable socket object. This is only available on UNIX; on Windows <tt>-1</tt> is always returned.<br> </li><li><strong>family</strong>: the address family, either <a href="http://docs.python.org/library/socket.html#socket.AF_INET" rel="nofollow">AF_INET</a> or <a href="http://docs.python.org/library/socket.html#socket.AF_INET6" rel="nofollow">AF_INET6</a> <br> </li><li><strong>type</strong>: the address type, either <a href="http://docs.python.org/library/socket.html#socket.SOCK_STREAM" rel="nofollow">SOCK_STREAM</a> or <a href="http://docs.python.org/library/socket.html#socket.SOCK_DGRAM" rel="nofollow">SOCK_DGRAM</a> <br> </li><li><strong>local_address</strong>: the local address as a <tt>(ip, port)</tt> tuple. <br> </li><li><strong>remote_address</strong>: the remote address as a <tt>(ip, port)</tt> tuple. When the remote endpoint is not connected the tuple is empty. <br> </li><li><strong>status</strong>: a string representing the TCP connections status. String values are supposed to match Linux's <a href="http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h" rel="nofollow">tcp_states.h</a> header file across all platforms. For UDP sockets this is always going to be an empty string.<br> </li></ul></ul><blockquote>Example:
-<pre class="prettyprint">&gt;&gt;&gt; p = psutil.Process(1694)
-&gt;&gt;&gt; p.name
-'firefox'
-&gt;&gt;&gt; p.get_connections()
-[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776), remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
- connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761), remote_address=('72.14.234.100', 80), status='CLOSING'),
- connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759), remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
- connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314), remote_address=('72.14.234.83', 443), status='SYN_SENT')]</pre>On <strong>FreeBSD</strong> this is implemented by parsing <a href="http://en.wikipedia.org/wiki/Lsof" rel="nofollow">lsof</a> command output. If lsof is not installed on the system <a href="http://docs.python.org/library/exceptions.html?highlight=notimplementederror#exceptions.NotImplementedError" rel="nofollow">NotImplementedError</a> exception is raised and for third party processes (different than <tt>os.getpid()</tt>) results can differ depending on user privileges.<br>
-</blockquote><blockquote><i><strong>New in 0.2.0</strong></i><br>
-<i><strong>Changed in 0.2.1:</strong> OSX implementation rewritten in C; no longer requiring lsof.</i>
-</blockquote><ul><li><strong>is_running</strong><font size="3"><strong><tt>()</tt></strong></font><br>Return whether the current process is running in the current process list. </li></ul><ul><li><strong>send_signal</strong><font size="3"><strong><tt>(</tt></strong></font><i>signal</i><font size="3"><strong><tt>)</tt></strong></font><br>Send a signal to process (see <a href="http://docs.python.org/library/signal.html" rel="nofollow">signal module</a> constants). On Windows only <tt>SIGTERM</tt> is valid and is treated as an alias for <tt>kill()</tt>. </li></ul><blockquote><i><strong>New in 0.2.0</strong></i>
-</blockquote><ul><li><strong>suspend</strong><font size="3"><strong><tt>()</tt></strong></font><br>Suspend process execution with <tt>SIGSTOP</tt> signal. On Windows this is done by suspending all process threads execution. </li></ul><ul><li><strong>resume</strong><font size="3"><strong><tt>()</tt></strong></font><br>Resume process execution with <tt>SIGCONT</tt> signal. On Windows this is done by resuming all process threads execution. </li></ul><ul><li><strong>terminate</strong><font size="3"><strong><tt>()</tt></strong></font><br>Terminate the process with <tt>SIGTERM</tt> signal. On Windows this is an alias for <tt>kill()</tt>. </li></ul><blockquote><i><strong>New in 0.2.0</strong></i>
-</blockquote><ul><li><strong>kill</strong><font size="3"><strong><tt>()</tt></strong></font><br>Kill the current process by using <tt>SIGKILL</tt> signal. </li></ul><blockquote><i><strong>Changed in 0.2.0:</strong> no longer accepts <tt>sig</tt> keyword argument - use <tt>send_signal()</tt> instead. </i>
-</blockquote><ul><li><strong>wait</strong><font size="3"><strong><tt>(</tt></strong></font><i>timeout=None</i><font size="3"><strong><tt>)</tt></strong></font><br>Wait for process termination and if the process is a children of the current one also return the exit code, else <tt>None</tt>. On Windows there's no such limitation (exit code is always returned). If the process is already terminated does not raise <tt>NoSuchProcess</tt> exception but just return <tt>None</tt> immediately. If <i>timeout</i> is specified and process is still alive raises <tt>TimeoutExpired</tt> exception. </li></ul><blockquote><i><strong>New in 0.2.1</strong></i>
-</blockquote><p><br><br> psutil.<strong>Popen</strong><font size="3"><strong><tt>(</tt></strong></font><tt>*args, **kwargs</tt><font size="3"><strong><tt>)</tt></strong></font> </p><blockquote>A more convenient interface to stdlib <a href="http://docs.python.org/library/subprocess.html#subprocess.Popen" rel="nofollow">subprocess.Popen</a>. It starts a sub process and deals with it exactly as when using subprocess.Popen class but in addition also provides all the properties and methods of psutil.Process class in a unique interface. For method names common to both classes such as <i>kill()</i> and <i>terminate()</i>, psutil.Process implementation takes precedence. For a complete documentation refers to <a href="http://docs.python.org/library/subprocess.html" rel="nofollow">subprocess module documentation</a>.
-</blockquote><blockquote><i><strong>New in 0.2.1</strong></i>
-</blockquote><hr><h2><a name="Functions"></a>Functions<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#Functions" class="section_anchor"></a></h2><p>psutil.<strong>get_pid_list</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return a list of current running PIDs.
-</blockquote><p></p><p>psutil.<strong>pid_exists</strong><font size="3"><strong><tt>(</tt></strong></font><i>pid</i><font size="3"><strong><tt>)</tt></strong></font><br> </p><blockquote>Check whether the given PID exists in the current process list. This is faster than doing <tt>pid in psutil.get_pid_list()</tt> and should be preferred.
-</blockquote><p></p><p>psutil.<strong>process_iter</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return an iterator yielding a Process class instances for all running processes on the local machine. This should be preferred over doing <tt>for pid in psutil.get_pid_list(): psutil.Process(pid)</tt> as it safe from race conditions.
-</blockquote><p></p><hr><h2><a name="System_related_objects"></a>System related objects<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#System_related_objects" class="section_anchor"></a></h2><p>psutil.<strong>cpu_percent</strong><font size="3"><strong><tt>(</tt></strong></font><i>interval=0.1</i><font size="3"><strong><tt>)</tt></strong></font><br> </p><blockquote>Return a float representing the current system-wide CPU utilization as a percentage. When interval is &gt; 0.0 compares system CPU times elapsed before and after the interval (blocking). When interval is 0.0 or None compares system CPU times elapsed since last call or module import, returning immediately. In this case is recommended for accuracy that this function be called with at least 0.1 seconds between calls.
-</blockquote><p></p><blockquote><i><strong>Changed in 0.2.0:</strong> interval parameter was added</i>
-</blockquote><p>psutil.<strong>cpu_times</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return system CPU times as a namedtuple. Every CPU time is accessible in form of a <tt>CPUTimes</tt> attribute and represents the time CPU has spent in the given mode.<br>The attributes availability varies depending on the platform.  Here follows a list of all available attributes:
-</blockquote><p></p><blockquote>- <strong>user</strong><br>
-- <strong>system</strong><br>
-- <strong>idle</strong><br>
-- <strong>nice</strong> <i>(UNIX)</i><br>
-- <strong>iowait</strong> <i>(Linux)</i><br>
-- <strong>irq</strong> <i>(Linux, FreeBSD)</i><br>
-- <strong>softirq</strong> <i>(Linux)</i><br>
-</blockquote><p>psutil.<strong>avail_phymem</strong><font size="3"><strong><tt>()</tt></strong></font><br> psutil.<strong>used_phymem</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return the amount of available and used physical memory on the system, in bytes. For total physical memory use <tt>psutil.BOOT_TIME</tt> constant.
-</blockquote><p></p><p>psutil.<strong>total_virtmem</strong><font size="3"><strong><tt>()</tt></strong></font><br> psutil.<strong>avail_virtmem</strong><font size="3"><strong><tt>()</tt></strong></font><br> psutil.<strong>used_virtmem</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return the amount of total, available and used virtual memory on the system, in bytes.<br>On Linux they match the values returned by <tt>free</tt> command line utility. On OS X and FreeBSD they represent the same values as returned by <tt>sysctl vm.vmtotal</tt>. On Windows they are determined by reading the <tt>*PageFile</tt> values of <a href="http://msdn.microsoft.com/en-us/library/aa366770(VS.85).aspx" rel="nofollow">MEMORYSTATUSEX</a> structure.
-</blockquote><p></p><p>psutil.<strong>cached_phymem</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return the amount of cached memory on the system, in bytes. This reflects the "cached" column of free command line utility on Linux.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.0</strong></i><strong><br><i>Availability:</i></strong><i> Linux</i>
-</blockquote><p>psutil.<strong>phymem_buffers</strong><font size="3"><strong><tt>()</tt></strong></font><br> </p><blockquote>Return the amount of physical memory buffers used by the kernel in bytes. This reflects the "buffers" column of free command line utility on Linux.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.0</strong></i><br><strong><i>Availability:</i></strong><i> Linux</i>
-</blockquote><hr><h2><a name="Constants"></a>Constants<a href="http://code.google.com/p/psutil/wiki/DocumentationDev?show=content#Constants" class="section_anchor"></a></h2><p>psutil.<strong>TOTAL_PHYMEM</strong><br> </p><blockquote>The amount of total physical memory on the system, in bytes.
-</blockquote><p></p><p>psutil.<strong>NUM_CPUS</strong><br> </p><blockquote>The number of CPUs on the system. This is preferable than using <tt>os.environ['NUMBER_OF_PROCESSORS']</tt> as it is more accurate and always available.
-</blockquote><p></p><p>psutil.<strong>BOOT_TIME</strong><br> </p><blockquote>A number indicating the system boot time expressed in seconds since the epoch.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.1</strong></i>
-</blockquote><p>psutil.<strong>ABOVE_NORMAL_PRIORITY_CLASS</strong><br> psutil.<strong>BELOW_NORMAL_PRIORITY_CLASS</strong><br> psutil.<strong>HIGH_PRIORITY_CLASS</strong><br> psutil.<strong>IDLE_PRIORITY_CLASS</strong><br> psutil.<strong>NORMAL_PRIORITY_CLASS</strong><br> psutil.<strong>REALTIME_PRIORITY_CLASS</strong><br> </p><blockquote>A set of integers representing the priority of a process on Windows (see <a href="http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx" rel="nofollow">MSDN documentation</a>). They can be used in conjunction with <tt>psutil.Process.nice</tt> to get or set process priority.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.1</strong></i><br><i><strong>Availability:</strong> Windows</i>
-</blockquote><p>psutil.<strong>IOPRIO_CLASS_NONE</strong><br> psutil.<strong>IOPRIO_CLASS_RT</strong><br> psutil.<strong>IOPRIO_CLASS_BE</strong><br> psutil.<strong>IOPRIO_CLASS_IDLE</strong><br> </p><blockquote>A set of integers representing the I/O priority of a process on Linux. They can be used in conjunction with <tt>psutil.Process.get_ionice()</tt> and <tt>psutil.Process.set_ionice()</tt> to get or set process I/O priority. For further information refer to <a href="http://linux.die.net/man/1/ionice" rel="nofollow">ionice</a> command line utility or <a href="http://linux.die.net/man/2/ioprio_get" rel="nofollow">ioprio_get</a> system call.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.1</strong></i><br><i><strong>Availability:</strong> Linux</i>
-</blockquote><p>psutil.<strong>STATUS_RUNNING</strong><br> psutil.<strong>STATUS_SLEEPING</strong><br> psutil.<strong>STATUS_DISK_SLEEP</strong><br> psutil.<strong>STATUS_STOPPED</strong><br> psutil.<strong>STATUS_TRACING_STOP</strong><br> psutil.<strong>STATUS_ZOMBIE</strong><br> psutil.<strong>STATUS_DEAD</strong><br> psutil.<strong>STATUS_WAKE_KILL</strong><br> psutil.<strong>STATUS_WAKING</strong><br> psutil.<strong>STATUS_IDLE</strong><br> psutil.<strong>STATUS_LOCKED</strong><br> psutil.<strong>STATUS_WAITING</strong><br> </p><blockquote>A set of integers representing the status of a process. To be used in conjunction with <tt>psutil.Process.status</tt> property. If used with str() return a human-readable status string.
-</blockquote><p></p><blockquote><i><strong>New in 0.2.1</strong></i><br><i><strong>
-</strong></i></blockquote>
- </div>
- </div>
- </td></tr><tr>
-</tr></tbody></table>
- </div>
-
-</body></html>
diff --git a/contrib/psutil-0.2.1/docs/index.html b/contrib/psutil-0.2.1/docs/index.html
deleted file mode 100644
index 8395837..0000000
--- a/contrib/psutil-0.2.1/docs/index.html
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-<html>
- <head>
- <title>psutil</title>
- </head>
- <body>
-
-
-
-
- <div id="wikicontent">
- <table width="100%" border="0" cellspacing="0" cellpadding="0">
- <tr>
-
- <td class="vt" id="wikimaincol" width="100%">
-
- <div id="wikiheader" style="margin-bottom:1em">
-
-
- </div>
- <h1><a name="Summary"></a>Summary<a href="#Summary" class="section_anchor"></a></h1><p>psutil is a module providing an interface for retrieving information on running processes and system utilization (CPU, memory) in a portable way by using Python, implementing many functionalities offered by command line tools like <strong>ps</strong>, <strong>top</strong>, <strong>kill</strong> and Windows <strong>task manager</strong>. </p><p>It currently supports <strong>Linux</strong>, <strong>OS X</strong>, <strong>FreeBSD</strong> and <strong>Windows</strong> with Python versions from <strong>2.4</strong> to <strong>3.1</strong> by using a unique code base. </p><h1><a name="Example_usage"></a>Example usage<a href="#Example_usage" class="section_anchor"></a></h1><h3><a name="process_management"></a>process management<a href="#process_management" class="section_anchor"></a></h3><pre class="prettyprint">&gt;&gt;&gt; import psutil
-&gt;&gt;&gt; psutil.get_pid_list()
-[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
-268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
-2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245,
-4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358,
-4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235,
-5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
-&gt;&gt;&gt; p = psutil.Process(7055)
-&gt;&gt;&gt; p.name
-&#x27;python&#x27;
-&gt;&gt;&gt; p.path
-&#x27;/usr/bin&#x27;
-&gt;&gt;&gt; p.cmdline
-[&#x27;/usr/bin/python&#x27;, &#x27;-O&#x27;, &#x27;run.py&#x27;]
-&gt;&gt;&gt; p.uid
-1000
-&gt;&gt;&gt; p.gid
-1000
-&gt;&gt;&gt; p.username
-&#x27;jake&#x27;
-&gt;&gt;&gt; p.create_time
-1267551141.5019531
-&gt;&gt;&gt; p.get_cpu_percent()
-12.31243
-&gt;&gt;&gt; p.get_memory_percent()
-0.63423
-&gt;&gt;&gt; rss, vms =  p.get_memory_info()
-&gt;&gt;&gt; &quot;Resident memory: %s KB&quot; %(rss / 1024)
-&#x27;Resident memory: 3768 KB&#x27;
-&gt;&gt;&gt; &quot;Virtual memory: %s KB&quot; %(vms / 1024)
-&#x27;Virtual memory: 6176 KB&#x27;
-&gt;&gt;&gt;
-&gt;&gt;&gt; p.suspend()
-&gt;&gt;&gt; p.resume()
-&gt;&gt;&gt; psutil.test()
-UID       PID %CPU %MEM     VSZ     RSS START     TIME COMMAND
-0           0  0.0  0.0       0       0 00:12    00:00 [sched]
-0           1  0.0  0.3    1740     600 00:12    00:04 /sbin/init
-0           2  0.0  0.0       0       0 00:12    00:00 [kthreadd]
-0           3  0.0  0.0       0       0 00:12    00:00 [migration/0]
-...
-0       13239  0.0  2.6    13604   1044 00:38    00:00 /usr/sbin/smbd -D
-1000    23648  0.0  2.4    12512   2008 14:43    00:06 sshd: user@pts/2
-1000    23649  0.0  1.2    5944    3340 14:43    00:00 -bash
-0       25926  0.0  1.1    5432    3072 17:55    00:00 -su
-0       28655  0.0  1.0    4932    3204 21:58    00:00 python _psutil.py
-&gt;&gt;&gt;</pre><h3><a name="System_monitoring_(CPU_and_memory)"></a>System monitoring (CPU and memory)<a href="#System_monitoring_(CPU_and_memory)" class="section_anchor"></a></h3><pre class="prettyprint">&gt;&gt;&gt; import psutil, time
-&gt;&gt;&gt; print psutil.cpu_times()
-softirq=50.87; iowait=39.63; system=1130.67; idle=164171.41; user=965.15; irq=7.08; nice=0.0
-&gt;&gt;&gt;
-&gt;&gt;&gt; while 1:
-...     print round(psutil.cpu_percent(), 1)
-...     time.sleep(1)
-...
-5.4
-3.2
-7.3
-7.1
-2.5
-Traceback (most recent call last):
-  File &quot;&lt;stdin&gt;&quot;, line 3, in &lt;module&gt;
-KeyboardInterrupt
-&gt;&gt;&gt;
-&gt;&gt;&gt; psutil.TOTAL_PHYMEM
-526458880
-&gt;&gt;&gt; psutil.avail_phymem()
-153530368
-&gt;&gt;&gt; psutil.total_virtmem()
-197365760
-&gt;&gt;&gt; psutil.avail_virtmem()
-194277376</pre><h1><a name="Mailing_lists"></a>Mailing lists<a href="#Mailing_lists" class="section_anchor"></a></h1><p><strong>Users</strong><br><a href="http://groups.google.com/group/psutil/topics" rel="nofollow">http://groups.google.com/group/psutil/topics</a> </p><p><strong>Developers</strong><br><a href="http://groups.google.com/group/psutil-dev/topics" rel="nofollow">http://groups.google.com/group/psutil-dev/topics</a> </p><p><strong>SVN commits and issue tracker changes</strong><br><a href="http://groups.google.com/group/psutil-commits/topics" rel="nofollow">http://groups.google.com/group/psutil-commits/topics</a> </p><h1><a name="Contribute"></a>Contribute<a href="#Contribute" class="section_anchor"></a></h1><p>If you want to help or just give us suggestions about the project and other related things,  subscribe to the <a href="http://groups.google.com/group/psutil" rel="nofollow">discussion mailing list</a>. If you want to talk with project team members about psutil and other related things feel free to contact us at the following addresses: </p><p><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <strong>Name</strong> </td><td style="border: 1px solid #aaa; padding: 5px;"> <strong>Country</strong> </td><td style="border: 1px solid #aaa; padding: 5px;"> <strong>E-mail</strong> </td></tr> <tr><td style="border: 1px solid #aaa; padding: 5px;"> Jay Loden </td><td style="border: 1px solid #aaa; padding: 5px;"> New Jersey (USA) </td><td style="border: 1px solid #aaa; padding: 5px;"> jloden at gmail dot com  </td></tr> <tr><td style="border: 1px solid #aaa; padding: 5px;"> Giampaolo Rodola&#x27; </td><td style="border: 1px solid #aaa; padding: 5px;"> Turin (Italy) </td><td style="border: 1px solid #aaa; padding: 5px;"> g.rodola at gmail dot com </td></tr> </table></p><p>Feedbacks and suggestions are greatly appreciated as well as new testers and coders willing to join the development.<br> For any bug report, patch proposal or feature request, add an entry into the <a href="http://code.google.com/p/psutil/issues/list" rel="nofollow">Issue Tracker</a>.<br> </p><p>Thank you. </p>
-
-
- </body>
-</html>
-
diff --git a/contrib/psutil-0.2.1/docs/milestones.lnk.html b/contrib/psutil-0.2.1/docs/milestones.lnk.html
deleted file mode 100644
index 83904c8..0000000
--- a/contrib/psutil-0.2.1/docs/milestones.lnk.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<html>
-<head>
- <meta http-equiv="refresh" content="2; http://code.google.com/p/psutil/wiki/Milestones">
- <title>Redirecting to Milestones...</title>
-</head>
-
-<body>
-<p>Redirecting to: <a href="http://code.google.com/p/psutil/wiki/Milestones">http://code.google.com/p/psutil/wiki/Milestones</a><br></p>
-<p>You'll be redirected in 2 seconds...</p>
-
-</body>
-</html>
diff --git a/contrib/psutil-0.2.1/psutil/__init__.py b/contrib/psutil-0.2.1/psutil/__init__.py
deleted file mode 100644
index 40115f7..0000000
--- a/contrib/psutil-0.2.1/psutil/__init__.py
+++ /dev/null
@@ -1,661 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: __init__.py 954 2011-03-20 20:42:26Z g.rodola $
-#
-
-"""psutil is a module providing convenience functions for managing
-processes in a portable way by using Python.
-"""
-
-__version__ = "0.2.1"
-version_info = tuple([int(num) for num in __version__.split('.')])
-
-__all__ = [
-    # exceptions
-    "Error", "NoSuchProcess", "AccessDenied", "TimeoutExpired",
-    # constants
-    "NUM_CPUS", "TOTAL_PHYMEM", "BOOT_TIME",
-    "version_info", "__version__",
-    "STATUS_RUNNING", "STATUS_IDLE", "STATUS_SLEEPING", "STATUS_DISK_SLEEP",
-    "STATUS_STOPPED", "STATUS_TRACING_STOP", "STATUS_ZOMBIE", "STATUS_DEAD",
-    "STATUS_WAKING", "STATUS_LOCKED",
-    # classes
-    "Process", "Popen",
-    # functions
-    "test", "pid_exists", "get_pid_list", "process_iter", "get_process_list",
-    "avail_phymem", "used_phymem", "total_virtmem", "avail_virtmem",
-    "used_virtmem", "cpu_times", "cpu_percent",
-    ]
-
-import sys
-import os
-import time
-import signal
-import warnings
-import errno
-import subprocess
-try:
-    import pwd
-except ImportError:
-    pwd = None
-
-from psutil.error import Error, NoSuchProcess, AccessDenied, TimeoutExpired
-from psutil._compat import property
-from psutil._common import (STATUS_RUNNING, STATUS_IDLE, STATUS_SLEEPING,
-                            STATUS_DISK_SLEEP, STATUS_STOPPED,
-                            STATUS_TRACING_STOP, STATUS_ZOMBIE, STATUS_DEAD,
-                            STATUS_WAKING, STATUS_LOCKED)
-
-# import the appropriate module for our platform only
-if sys.platform.lower().startswith("linux"):
-    from psutil._pslinux import *
-    __all__.extend(["cached_phymem", "phymem_buffers"])
-
-elif sys.platform.lower().startswith("win32"):
-    from psutil._psmswindows import *
-    __all__.extend(["ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
-                    "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
-                    "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS"])
-
-elif sys.platform.lower().startswith("darwin"):
-    from psutil._psosx import *
-
-elif sys.platform.lower().startswith("freebsd"):
-    from psutil._psbsd import *
-
-else:
-    raise NotImplementedError('platform %s is not supported' % sys.platform)
-
-
-class Process(object):
-    """Represents an OS process."""
-
-    def __init__(self, pid):
-        """Create a new Process object, raises NoSuchProcess if the PID
-        does not exist, and ValueError if the parameter is not an
-        integer PID."""
-        if not isinstance(pid, int):
-            raise ValueError("An integer is required")
-        if not pid_exists(pid):
-            raise NoSuchProcess(pid, None, "no process found with PID %s" % pid)
-        self._pid = pid
-        # platform-specific modules define an PlatformProcess
-        # implementation class
-        self._platform_impl = PlatformProcess(pid)
-        self._last_sys_cpu_times = None
-        self._last_proc_cpu_times = None
-
-    def __str__(self):
-        try:
-            pid = self.pid
-            name = repr(self.name)
-            cmdline = self.cmdline and repr(' '.join(self.cmdline))
-        except NoSuchProcess:
-            details = "(pid=%s (terminated))" % self.pid
-        except AccessDenied:
-            details = "(pid=%s)" % (self.pid)
-        else:
-            if cmdline:
-                details = "(pid=%s, name=%s, cmdline=%s)" % (pid, name, cmdline)
-            else:
-                details = "(pid=%s, name=%s)" % (pid, name)
-        return "%s.%s%s" % (self.__class__.__module__,
-                            self.__class__.__name__, details)
-
-    def __repr__(self):
-        return "<%s at %s>" % (self.__str__(), id(self))
-
-    def __eq__(self, other):
-        """Test for equality with another Process object based on pid
-        and creation time.
-        """
-        h1 = (self.pid, self.create_time)
-        try:
-            h2 = (other.pid, other.create_time)
-        except AttributeError:
-            return False
-        else:
-            return h1 == h2
-
-    @property
-    def pid(self):
-        """The process pid."""
-        return self._pid
-
-    @property
-    def ppid(self):
-        """The process parent pid."""
-        return self._platform_impl.get_process_ppid()
-
-    @property
-    def parent(self):
-        """Return the parent process as a Process object. If no parent
-        pid is known return None.
-        """
-        ppid = self.ppid
-        if ppid is not None:
-            try:
-                return Process(ppid)
-            except NoSuchProcess:
-                pass
-
-    @property
-    def name(self):
-        """The process name."""
-        name = self._platform_impl.get_process_name()
-        if os.name == 'posix':
-            # On UNIX the name gets truncated to the first 15 characters.
-            # If it matches the first part of the cmdline we return that
-            # one instead because it's usually more explicative.
-            # Examples are "gnome-keyring-d" vs. "gnome-keyring-daemon".
-            cmdline = self.cmdline
-            if cmdline:
-                extended_name = os.path.basename(cmdline[0])
-                if extended_name.startswith(name):
-                    name = extended_name
-        # XXX - perhaps needs refactoring
-        self._platform_impl._process_name = name
-        return name
-
-    @property
-    def exe(self):
-        """The process executable as an absolute path name."""
-        exe = self._platform_impl.get_process_exe()
-        # if we have the cmdline but not the exe, figure it out from argv[0]
-        if not exe:
-            cmdline = self.cmdline
-            if cmdline and hasattr(os, 'access') and hasattr(os, 'X_OK'):
-                _exe = os.path.realpath(cmdline[0])
-                if os.path.isfile(_exe) and os.access(_exe, os.X_OK):
-                    return _exe
-        if not exe:
-            raise AccessDenied(self.pid, self._platform_impl._process_name)
-        return exe
-
-    @property
-    def path(self):
-        msg = "'path' property is deprecated; use 'os.path.dirname(exe)' instead"
-        warnings.warn(msg, DeprecationWarning)
-        return os.path.dirname(self.exe)
-
-    @property
-    def cmdline(self):
-        """The command line process has been called with."""
-        return self._platform_impl.get_process_cmdline()
-
-    @property
-    def status(self):
-        """The process current status as a STATUS_* constant."""
-        return self._platform_impl.get_process_status()
-
-    @property
-    def nice(self):
-        """Get or set process niceness (priority)."""
-        return self._platform_impl.get_process_nice()
-
-    @nice.setter
-    def nice(self, value):
-        # invoked on "p.nice = num"; change process niceness
-        return self._platform_impl.set_process_nice(value)
-
-    if os.name == 'posix':
-
-        @property
-        def uids(self):
-            """Return a named tuple denoting the process real,
-            effective, and saved user ids.
-            """
-            return self._platform_impl.get_process_uids()
-
-        @property
-        def gids(self):
-            """Return a named tuple denoting the process real,
-            effective, and saved group ids.
-            """
-            return self._platform_impl.get_process_gids()
-
-    @property
-    def uid(self):
-        """The real user id of the current process (deprecated)."""
-        warnings.warn("'uid' property is deprecated; use 'uids.real' instead",
-                      DeprecationWarning)
-        if os.name != 'posix':
-            return -1
-        return self.uids.real
-
-    @property
-    def gid(self):
-        """The real group id of the current process (deprecated)."""
-        warnings.warn("'gid' property is deprecated; use 'uids.real' instead",
-                      DeprecationWarning)
-        if os.name != 'posix':
-            return -1
-        return self.gids.real
-
-    @property
-    def username(self):
-        """The name of the user that owns the process.
-        On UNIX this is calculated by using *real* process uid.
-        """
-        if os.name == 'posix':
-            if pwd is None:
-                # might happen if python was installed from sources
-                raise ImportError("requires pwd module shipped with standard python")
-            return pwd.getpwuid(self.uids.real).pw_name
-        else:
-            return self._platform_impl.get_process_username()
-
-    @property
-    def create_time(self):
-        """The process creation time as a floating point number
-        expressed in seconds since the epoch, in UTC.
-        """
-        return self._platform_impl.get_process_create_time()
-
-    # available for Windows and Linux only
-    if hasattr(PlatformProcess, "get_process_cwd"):
-
-        def getcwd(self):
-            """Return a string representing the process current working
-            directory.
-            """
-            return self._platform_impl.get_process_cwd()
-
-    # Linux, BSD and Windows only
-    if hasattr(PlatformProcess, "get_process_io_counters"):
-
-        def get_io_counters(self):
-            """Return process I/O statistics as a namedtuple including
-            the number of read/write calls performed and the amount of
-            bytes read and written by the process.
-            """
-            return self._platform_impl.get_process_io_counters()
-
-    # available only on Linux
-    if hasattr(PlatformProcess, "get_process_ionice"):
-
-        def get_ionice(self):
-            """Return process I/O niceness (priority) as a namedtuple."""
-            return self._platform_impl.get_process_ionice()
-
-        def set_ionice(self, ioclass, value=None):
-            """Set process I/O niceness (priority).
-            ioclass is one of the IOPRIO_CLASS_* constants.
-            iodata is a number which goes from 0 to 7. The higher the
-            value, the lower the I/O priority of the process.
-            """
-            return self._platform_impl.set_process_ionice(ioclass, value)
-
-    def get_num_threads(self):
-        """Return the number of threads used by this process."""
-        return self._platform_impl.get_process_num_threads()
-
-    def get_threads(self):
-        """Return threads opened by process as a list of namedtuples
-        including thread id and thread CPU times (user/system).
-        """
-        return self._platform_impl.get_process_threads()
-
-    def get_children(self):
-        """Return the children of this process as a list of Process
-        objects.
-        """
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        retlist = []
-        for proc in process_iter():
-            try:
-                if proc.ppid == self.pid:
-                    retlist.append(proc)
-            except NoSuchProcess:
-                pass
-        return retlist
-
-    def get_cpu_percent(self, interval=0.1):
-        """Return a float representing the current process CPU
-        utilization as a percentage.
-
-        When interval is > 0.0 compares process times to system CPU
-        times elapsed before and after the interval (blocking).
-
-        When interval is 0.0 or None compares process times to system CPU
-        times elapsed since last call, returning immediately.
-        In this case is recommended for accuracy that this function be
-        called with at least 0.1 seconds between calls.
-        """
-        blocking = interval is not None and interval > 0.0
-        if blocking:
-            st1 = sum(cpu_times())
-            pt1 = self._platform_impl.get_cpu_times()
-            time.sleep(interval)
-            st2 = sum(cpu_times())
-            pt2 = self._platform_impl.get_cpu_times()
-        else:
-            st1 = self._last_sys_cpu_times
-            pt1 = self._last_proc_cpu_times
-            st2 = sum(cpu_times())
-            pt2 = self._platform_impl.get_cpu_times()
-            if st1 is None or pt1 is None:
-                self._last_sys_cpu_times = st2
-                self._last_proc_cpu_times = pt2
-                return 0.0
-
-        delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system)
-        delta_time = st2 - st1
-        # reset values for next call in case of interval == None
-        self._last_sys_cpu_times = st2
-        self._last_proc_cpu_times = pt2
-
-        try:
-            # the utilization split between all CPUs
-            overall_percent = (delta_proc / delta_time) * 100
-        except ZeroDivisionError:
-            # interval was too low
-            return 0.0
-        # the utilization of a single CPU
-        single_cpu_percent = overall_percent * NUM_CPUS
-        # ugly hack to avoid troubles with float precision issues
-        if single_cpu_percent > 100.0:
-            return 100.0
-        return round(single_cpu_percent, 1)
-
-    def get_cpu_times(self):
-        """Return a tuple whose values are process CPU user and system
-        times. The same as os.times() but per-process.
-        """
-        return self._platform_impl.get_cpu_times()
-
-    def get_memory_info(self):
-        """Return a tuple representing RSS (Resident Set Size) and VMS
-        (Virtual Memory Size) in bytes.
-
-        On UNIX RSS and VMS are the same values shown by ps.
-
-        On Windows RSS and VMS refer to "Mem Usage" and "VM Size" columns
-        of taskmgr.exe.
-        """
-        return self._platform_impl.get_memory_info()
-
-    def get_memory_percent(self):
-        """Compare physical system memory to process resident memory and
-        calculate process memory utilization as a percentage.
-        """
-        rss = self._platform_impl.get_memory_info()[0]
-        try:
-            return (rss / float(TOTAL_PHYMEM)) * 100
-        except ZeroDivisionError:
-            return 0.0
-
-    def get_open_files(self):
-        """Return files opened by process as a list of namedtuples
-        including absolute file name and file descriptor number.
-        """
-        return self._platform_impl.get_open_files()
-
-    def get_connections(self):
-        """Return TCP and UPD connections opened by process as a list
-        of namedtuples.
-        On BSD and OSX results for third party processes (!= os.getpid())
-        can differ depending on user privileges.
-        """
-        return self._platform_impl.get_connections()
-
-    def is_running(self):
-        """Return whether the current process is running in the current
-        process list.
-        """
-        try:
-            newproc = Process(self.pid)
-            return self == newproc
-        except NoSuchProcess:
-            return False
-
-    def send_signal(self, sig):
-        """Send a signal to process (see signal module constants).
-        On Windows only SIGTERM is valid and is treated as an alias
-        for kill().
-        """
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        if os.name == 'posix':
-            try:
-                os.kill(self.pid, sig)
-            except OSError, err:
-                name = self._platform_impl._process_name
-                if err.errno == errno.ESRCH:
-                    raise NoSuchProcess(self.pid, name)
-                if err.errno == errno.EPERM:
-                    raise AccessDenied(self.pid, name)
-                raise
-        else:
-            if sig == signal.SIGTERM:
-                self._platform_impl.kill_process()
-            else:
-                raise ValueError("only SIGTERM is supported on Windows")
-
-    def suspend(self):
-        """Suspend process execution."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        # windows
-        if hasattr(self._platform_impl, "suspend_process"):
-            self._platform_impl.suspend_process()
-        else:
-            # posix
-            self.send_signal(signal.SIGSTOP)
-
-    def resume(self):
-        """Resume process execution."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        # windows
-        if hasattr(self._platform_impl, "resume_process"):
-            self._platform_impl.resume_process()
-        else:
-            # posix
-            self.send_signal(signal.SIGCONT)
-
-    def terminate(self):
-        """Terminate the process with SIGTERM.
-        On Windows this is an alias for kill().
-        """
-        self.send_signal(signal.SIGTERM)
-
-    def kill(self):
-        """Kill the current process."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        if os.name == 'posix':
-            self.send_signal(signal.SIGKILL)
-        else:
-            self._platform_impl.kill_process()
-
-    def wait(self, timeout=None):
-        """Wait for process to terminate and, if process is a children
-        of the current one also return its exit code, else None.
-        """
-        return self._platform_impl.process_wait(timeout)
-
-
-class Popen(Process):
-    """A more convenient interface to stdlib subprocess module.
-    It starts a sub process and deals with it exactly as when using
-    subprocess.Popen class but in addition also provides all the
-    property and methods of psutil.Process class in a unique interface:
-
-      >>> import psutil
-      >>> from subprocess import PIPE
-      >>> p = psutil.Popen(["/usr/bin/python", "-c", "print 'hi'"], stdout=PIPE)
-      >>> p.name
-      'python'
-      >>> p.uids
-      user(real=1000, effective=1000, saved=1000)
-      >>> p.username
-      'giampaolo'
-      >>> p.communicate()
-      ('hi\n', None)
-      >>> p.terminate()
-      >>> p.wait(timeout=2)
-      0
-      >>>
-
-    For method names common to both classes such as kill(), terminate()
-    and wait(), psutil.Process implementation takes precedence.
-
-    For a complete documentation refers to:
-    http://docs.python.org/library/subprocess.html
-    """
-
-    def __init__(self, *args, **kwargs):
-        self.__subproc = subprocess.Popen(*args, **kwargs)
-        Process.__init__(self, self.__subproc.pid)
-
-    def __dir__(self):
-        return list(set(dir(Popen) + dir(subprocess.Popen)))
-
-    def __getattribute__(self, name):
-        try:
-            return object.__getattribute__(self, name)
-        except AttributeError:
-            try:
-                return object.__getattribute__(self.__subproc, name)
-            except AttributeError:
-                raise AttributeError("%s instance has no attribute '%s'"
-                                      %(self.__class__.__name__, name))
-
-
-def process_iter():
-    """Return an iterator yielding a Process class instances for all
-    running processes on the local machine.
-    """
-    pids = get_pid_list()
-    for pid in pids:
-        try:
-            yield Process(pid)
-        except (NoSuchProcess, AccessDenied):
-            continue
-
-def get_process_list():
-    """Return a list of Process class instances for all running
-    processes on the local machine.
-    """
-    return list(process_iter())
-
-def cpu_times():
-    """Return system CPU times as a namedtuple object.
-    Every CPU time represents the time CPU has spent in the given mode.
-    The attributes availability varies depending on the platform.
-    Here follows a list of all available attributes:
-     - user
-     - system
-     - idle
-     - nice (UNIX)
-     - iowait (Linux)
-     - irq (Linux, FreeBSD)
-     - softirq (Linux)
-    """
-    return get_system_cpu_times()
-
-
-_last_cpu_times = cpu_times()
-
-def cpu_percent(interval=0.1):
-    """Return a float representing the current system-wide CPU
-    utilization as a percentage.
-
-    When interval is > 0.0 compares system CPU times elapsed before
-    and after the interval (blocking).
-
-    When interval is 0.0 or None compares system CPU times elapsed
-    since last call or module import, returning immediately.
-    In this case is recommended for accuracy that this function be
-    called with at least 0.1 seconds between calls.
-    """
-    global _last_cpu_times
-
-    blocking = interval is not None and interval > 0.0
-    if blocking:
-        t1 = cpu_times()
-        time.sleep(interval)
-    else:
-        t1 = _last_cpu_times
-
-    t1_all = sum(t1)
-    t1_busy = t1_all - t1.idle
-
-    t2 = cpu_times()
-    t2_all = sum(t2)
-    t2_busy = t2_all - t2.idle
-
-    _last_cpu_times = t1
-    # this usually indicates a float precision issue
-    if t2_busy <= t1_busy:
-        return 0.0
-
-    busy_delta = t2_busy - t1_busy
-    all_delta = t2_all - t1_all
-    busy_perc = (busy_delta / all_delta) * 100
-    return round(busy_perc, 1)
-
-
-def test():
-    """List info of all currently running processes emulating a
-    ps -aux output.
-    """
-    import datetime
-    today_day = datetime.date.today()
-
-    def get_process_info(pid):
-        proc = Process(pid)
-        user = proc.username
-        if os.name == 'nt' and '\\' in user:
-            user = user.split('\\')[1]
-        pid = proc.pid
-        cpu = round(proc.get_cpu_percent(interval=None), 1)
-        mem = round(proc.get_memory_percent(), 1)
-        rss, vsz = [x / 1024 for x in proc.get_memory_info()]
-
-        # If process has been created today print H:M, else MonthDay
-        start = datetime.datetime.fromtimestamp(proc.create_time)
-        if start.date() == today_day:
-            start = start.strftime("%H:%M")
-        else:
-            start = start.strftime("%b%d")
-
-        cputime = time.strftime("%M:%S", time.localtime(sum(proc.get_cpu_times())))
-        cmd = ' '.join(proc.cmdline)
-        # where cmdline is not available UNIX shows process name between
-        # [] parentheses
-        if not cmd:
-            cmd = "[%s]" % proc.name
-        return "%-9s %-5s %-4s %4s %7s %7s %5s %8s %s" \
-                % (user, pid, cpu, mem, vsz, rss, start, cputime, cmd)
-
-    print "%-9s %-5s %-4s %4s %7s %7s %5s %7s  %s" \
-      % ("USER", "PID", "%CPU", "%MEM", "VSZ", "RSS", "START", "TIME", "COMMAND")
-    pids = get_pid_list()
-    pids.sort()
-    for pid in pids:
-        try:
-            line = get_process_info(pid)
-        except (AccessDenied, NoSuchProcess):
-            pass
-        else:
-            print line
-
-if __name__ == "__main__":
-    test()
-
diff --git a/contrib/psutil-0.2.1/psutil/_common.py b/contrib/psutil-0.2.1/psutil/_common.py
deleted file mode 100644
index a43c5dd..0000000
--- a/contrib/psutil-0.2.1/psutil/_common.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#/usr/bin/env python
-#
-#$Id: _common.py 953 2011-03-20 20:29:45Z g.rodola $
-#
-
-"""Common objects shared by all _ps* modules."""
-
-from psutil._compat import namedtuple
-
-class constant(int):
-    """A constant type; overrides base int to provide a useful name on str()."""
-
-    def __new__(cls, value, name, doc=None):
-        inst = super(constant, cls).__new__(cls, value)
-        inst._name = name
-        if doc is not None:
-            inst.__doc__ = doc
-        return inst
-
-    def __str__(self):
-        return self._name
-
-STATUS_RUNNING = constant(0, "running")
-STATUS_SLEEPING = constant(1, "sleeping")
-STATUS_DISK_SLEEP = constant(2, "disk sleep")
-STATUS_STOPPED = constant(3, "stopped")
-STATUS_TRACING_STOP = constant(4, "tracing stop")
-STATUS_ZOMBIE = constant(5, "zombie")
-STATUS_DEAD = constant(6, "dead")
-STATUS_WAKE_KILL = constant(7, "wake kill")
-STATUS_WAKING = constant(8, "waking")
-STATUS_IDLE = constant(9, "idle")  # BSD
-STATUS_LOCKED = constant(10, "locked")  # BSD
-STATUS_WAITING = constant(11, "waiting")  # BSD
-
-
-# system
-ntuple_sys_cputimes = namedtuple('cputimes', 'user nice system idle iowait irq softirq')
-
-# processes
-ntuple_meminfo = namedtuple('meminfo', 'rss vms')
-ntuple_cputimes = namedtuple('cputimes', 'user system')
-ntuple_openfile = namedtuple('openfile', 'path fd')
-ntuple_connection = namedtuple('connection', 'fd family type local_address remote_address status')
-ntuple_thread = namedtuple('thread', 'id user_time system_time')
-ntuple_uids = namedtuple('user', 'real effective saved')
-ntuple_gids = namedtuple('group', 'real effective saved')
-ntuple_io = namedtuple('io', 'read_count write_count read_bytes write_bytes')
-ntuple_ionice = namedtuple('ionice', 'ioclass value')
-
-# the __all__ namespace common to all _ps*.py platform modules
-base_module_namespace = [
-    # constants
-    "NUM_CPUS", "TOTAL_PHYMEM", "BOOT_TIME",
-    # classes
-    "PlatformProcess",
-    # functions
-    "avail_phymem", "used_phymem", "total_virtmem", "avail_virtmem",
-    "used_virtmem", "get_system_cpu_times", "pid_exists", "get_pid_list",
-    ]
-
diff --git a/contrib/psutil-0.2.1/psutil/_compat.py b/contrib/psutil-0.2.1/psutil/_compat.py
deleted file mode 100644
index 5235d0e..0000000
--- a/contrib/psutil-0.2.1/psutil/_compat.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _compat.py 910 2011-02-15 13:33:06Z g.rodola $
-#
-
-"""Module which provides compatibility with older Python versions."""
-
-__all__ = ["namedtuple", "property"]
-
-from operator import itemgetter as _itemgetter
-from keyword import iskeyword as _iskeyword
-import sys as _sys
-
-try:
-    from collections import namedtuple
-except ImportError:
-    def namedtuple(typename, field_names, verbose=False, rename=False):
-        """A collections.namedtuple implementation written in Python
-        to support Python versions < 2.6.
-
-        Taken from: http://code.activestate.com/recipes/500261/
-        """
-        # Parse and validate the field names.  Validation serves two
-        # purposes, generating informative error messages and preventing
-        # template injection attacks.
-        if isinstance(field_names, basestring):
-             # names separated by whitespace and/or commas
-            field_names = field_names.replace(',', ' ').split()
-        field_names = tuple(map(str, field_names))
-        if rename:
-            names = list(field_names)
-            seen = set()
-            for i, name in enumerate(names):
-                if (not min(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
-                    or not name or name[0].isdigit() or name.startswith('_')
-                    or name in seen):
-                        names[i] = '_%d' % i
-                seen.add(name)
-            field_names = tuple(names)
-        for name in (typename,) + field_names:
-            if not min(c.isalnum() or c=='_' for c in name):
-                raise ValueError('Type names and field names can only contain ' \
-                                 'alphanumeric characters and underscores: %r'
-                                 % name)
-            if _iskeyword(name):
-                raise ValueError('Type names and field names cannot be a keyword: %r' \
-                                 % name)
-            if name[0].isdigit():
-                raise ValueError('Type names and field names cannot start with a ' \
-                                 'number: %r' % name)
-        seen_names = set()
-        for name in field_names:
-            if name.startswith('_') and not rename:
-                raise ValueError('Field names cannot start with an underscore: %r'
-                                 % name)
-            if name in seen_names:
-                raise ValueError('Encountered duplicate field name: %r' % name)
-            seen_names.add(name)
-
-        # Create and fill-in the class template
-        numfields = len(field_names)
-        # tuple repr without parens or quotes
-        argtxt = repr(field_names).replace("'", "")[1:-1]
-        reprtxt = ', '.join('%s=%%r' % name for name in field_names)
-        template = '''class %(typename)s(tuple):
-        '%(typename)s(%(argtxt)s)' \n
-        __slots__ = () \n
-        _fields = %(field_names)r \n
-        def __new__(_cls, %(argtxt)s):
-            return _tuple.__new__(_cls, (%(argtxt)s)) \n
-        @classmethod
-        def _make(cls, iterable, new=tuple.__new__, len=len):
-            'Make a new %(typename)s object from a sequence or iterable'
-            result = new(cls, iterable)
-            if len(result) != %(numfields)d:
-                raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result))
-            return result \n
-        def __repr__(self):
-            return '%(typename)s(%(reprtxt)s)' %% self \n
-        def _asdict(self):
-            'Return a new dict which maps field names to their values'
-            return dict(zip(self._fields, self)) \n
-        def _replace(_self, **kwds):
-            'Return a new %(typename)s object replacing specified fields with new values'
-            result = _self._make(map(kwds.pop, %(field_names)r, _self))
-            if kwds:
-                raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
-            return result \n
-        def __getnewargs__(self):
-            return tuple(self) \n\n''' % locals()
-        for i, name in enumerate(field_names):
-            template += '        %s = _property(_itemgetter(%d))\n' % (name, i)
-        if verbose:
-            print template
-
-        # Execute the template string in a temporary namespace
-        namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename,
-                         _property=property, _tuple=tuple)
-        try:
-            exec template in namespace
-        except SyntaxError, e:
-            raise SyntaxError(e.message + ':\n' + template)
-        result = namespace[typename]
-
-        # For pickling to work, the __module__ variable needs to be set
-        # to the frame where the named tuple is created.  Bypass this
-        # step in enviroments where sys._getframe is not defined (Jython
-        # for example) or sys._getframe is not defined for arguments
-        # greater than 0 (IronPython).
-        try:
-            result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
-        except (AttributeError, ValueError):
-            pass
-
-        return result
-
-# dirty hack to support property.setter on python < 2.6
-property = property
-
-if not hasattr(property, "setter"):
-    class property(property):
-        def setter(self, value):
-            cls_ns = _sys._getframe(1).f_locals
-            for k, v in cls_ns.iteritems():
-                if v == self:
-                    name = k
-                    break
-            cls_ns[name] = property(self.fget, value, self.fdel, self.__doc__)
-            return cls_ns[name]
-
diff --git a/contrib/psutil-0.2.1/psutil/_psbsd.py b/contrib/psutil-0.2.1/psutil/_psbsd.py
deleted file mode 100644
index 984759f..0000000
--- a/contrib/psutil-0.2.1/psutil/_psbsd.py
+++ /dev/null
@@ -1,204 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psbsd.py 944 2011-03-04 17:05:24Z g.rodola $
-#
-
-import errno
-import os
-
-import _psutil_bsd
-import _psutil_posix
-import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-__all__ = base_module_namespace[:]
-
-# --- constants
-
-NUM_CPUS = _psutil_bsd.get_num_cpus()
-TOTAL_PHYMEM = _psutil_bsd.get_total_phymem()
-BOOT_TIME = _psutil_bsd.get_system_boot_time()
-
-# --- public functions
-
-def avail_phymem():
-    "Return the amount of physical memory available on the system, in bytes."
-    return _psutil_bsd.get_avail_phymem()
-
-def used_phymem():
-    "Return the amount of physical memory currently in use on the system, in bytes."
-    return TOTAL_PHYMEM - _psutil_bsd.get_avail_phymem()
-
-def total_virtmem():
-    "Return the amount of total virtual memory available on the system, in bytes."
-    return _psutil_bsd.get_total_virtmem()
-
-def avail_virtmem():
-    "Return the amount of virtual memory currently in use on the system, in bytes."
-    return _psutil_bsd.get_avail_virtmem()
-
-def used_virtmem():
-    """Return the amount of used memory currently in use on the system, in bytes."""
-    return _psutil_bsd.get_total_virtmem() - _psutil_bsd.get_avail_virtmem()
-
-_cputimes_ntuple = namedtuple('cputimes', 'user nice system idle irq')
-def get_system_cpu_times():
-    """Return system CPU times as a named tuple"""
-    user, nice, system, idle, irq = _psutil_bsd.get_system_cpu_times()
-    return _cputimes_ntuple(user, nice, system, idle, irq)
-
-def get_pid_list():
-    """Returns a list of PIDs currently running on the system."""
-    return _psutil_bsd.get_pid_list()
-
-def pid_exists(pid):
-    """Check For the existence of a unix pid."""
-    return _psposix.pid_exists(pid)
-
-
-def wrap_exceptions(method):
-    """Call method(self, pid) into a try/except clause so that if an
-    OSError "No such process" exception is raised we assume the process
-    has died and raise psutil.NoSuchProcess instead.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return method(self, *args, **kwargs)
-        except OSError, err:
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-_status_map = {
-    _psutil_bsd.SSTOP : STATUS_STOPPED,
-    _psutil_bsd.SSLEEP : STATUS_SLEEPING,
-    _psutil_bsd.SRUN : STATUS_RUNNING,
-    _psutil_bsd.SIDL : STATUS_IDLE,
-    _psutil_bsd.SWAIT : STATUS_WAITING,
-    _psutil_bsd.SLOCK : STATUS_LOCKED,
-    _psutil_bsd.SZOMB : STATUS_ZOMBIE,
-}
-
-
-class BSDProcess(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_bsd.get_process_name(self.pid)
-
-    @wrap_exceptions
-    def get_process_exe(self):
-        """Return process executable pathname."""
-        return _psutil_bsd.get_process_exe(self.pid)
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        return _psutil_bsd.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_bsd.get_process_ppid(self.pid)
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        """Return real, effective and saved user ids."""
-        real, effective, saved = _psutil_bsd.get_process_uids(self.pid)
-        return ntuple_uids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        """Return real, effective and saved group ids."""
-        real, effective, saved = _psutil_bsd.get_process_gids(self.pid)
-        return ntuple_gids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        """return a tuple containing process user/kernel time."""
-        user, system = _psutil_bsd.get_cpu_times(self.pid)
-        return ntuple_cputimes(user, system)
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Return a tuple with the process' RSS and VMS size."""
-        rss, vms = _psutil_bsd.get_memory_info(self.pid)
-        return ntuple_meminfo(rss, vms)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        """Return the start time of the process as a number of seconds since
-        the epoch."""
-        return _psutil_bsd.get_process_create_time(self.pid)
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        """Return the number of threads belonging to the process."""
-        return _psutil_bsd.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        """Return the number of threads belonging to the process."""
-        rawlist = _psutil_bsd.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = ntuple_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-
-    def get_open_files(self):
-        """Return files opened by process by parsing lsof output."""
-        lsof = _psposix.LsofParser(self.pid, self._process_name)
-        return lsof.get_process_open_files()
-
-    def get_connections(self):
-        """Return network connections opened by a process as a list of
-        namedtuples by parsing lsof output.
-        """
-        lsof = _psposix.LsofParser(self.pid, self._process_name)
-        return lsof.get_process_connections()
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        code = _psutil_bsd.get_process_status(self.pid)
-        if code in _status_map:
-            return _status_map[code]
-        return constant(-1, "?")
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        rc, wc, rb, wb = _psutil_bsd.get_process_io_counters(self.pid)
-        return ntuple_io(rc, wc, rb, wb)
-
-
-PlatformProcess = BSDProcess
-
diff --git a/contrib/psutil-0.2.1/psutil/_pslinux.py b/contrib/psutil-0.2.1/psutil/_pslinux.py
deleted file mode 100755
index 7e6f553..0000000
--- a/contrib/psutil-0.2.1/psutil/_pslinux.py
+++ /dev/null
@@ -1,586 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _pslinux.py 953 2011-03-20 20:29:45Z g.rodola $
-#
-
-import os
-import errno
-import socket
-import struct
-import sys
-import base64
-
-import _psutil_posix
-import _psutil_linux
-from psutil import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-# Linux specific extended namespace
-__all__ = base_module_namespace[:]
-__all__.extend([
-    "IOPRIO_CLASS_NONE", "IOPRIO_CLASS_RT", "IOPRIO_CLASS_BE", "IOPRIO_CLASS_IDLE",
-    "phymem_buffers", "cached_phymem",
-    ])
-
-
-def _get_boot_time():
-    """Return system boot time (epoch in seconds)"""
-    f = open('/proc/stat', 'r')
-    for line in f:
-        if line.startswith('btime'):
-            f.close()
-            return float(line.strip().split()[1])
-
-def _get_num_cpus():
-    """Return the number of CPUs on the system"""
-    num = 0
-    f = open('/proc/cpuinfo', 'r')
-    for line in f:
-        if line.startswith('processor'):
-            num += 1
-    f.close()
-    return num
-
-def _get_total_phymem():
-    """Return the total amount of physical memory, in bytes"""
-    f = open('/proc/meminfo', 'r')
-    for line in f:
-        if line.startswith('MemTotal:'):
-            f.close()
-            return int(line.split()[1]) * 1024
-
-
-# Number of clock ticks per second
-_CLOCK_TICKS = os.sysconf(os.sysconf_names["SC_CLK_TCK"])
-BOOT_TIME = _get_boot_time()
-NUM_CPUS = _get_num_cpus()
-TOTAL_PHYMEM = _get_total_phymem()
-# ioprio_* constants http://linux.die.net/man/2/ioprio_get
-IOPRIO_CLASS_NONE = 0
-IOPRIO_CLASS_RT = 1
-IOPRIO_CLASS_BE = 2
-IOPRIO_CLASS_IDLE = 3
-
-del _get_boot_time, _get_num_cpus, _get_total_phymem
-
-# http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
-_TCP_STATES_TABLE = {"01" : "ESTABLISHED",
-                     "02" : "SYN_SENT",
-                     "03" : "SYN_RECV",
-                     "04" : "FIN_WAIT1",
-                     "05" : "FIN_WAIT2",
-                     "06" : "TIME_WAIT",
-                     "07" : "CLOSE",
-                     "08" : "CLOSE_WAIT",
-                     "09" : "LAST_ACK",
-                     "0A" : "LISTEN",
-                     "0B" : "CLOSING"
-                     }
-
-def avail_phymem():
-    """Return the amount of physical memory available, in bytes."""
-    f = open('/proc/meminfo', 'r')
-    free = None
-    _flag = False
-    for line in f:
-        if line.startswith('MemFree:'):
-            free = int(line.split()[1]) * 1024
-            break
-    f.close()
-    return free
-
-def used_phymem():
-    """"Return the amount of physical memory used, in bytes."""
-    return (TOTAL_PHYMEM - avail_phymem())
-
-def total_virtmem():
-    """"Return the total amount of virtual memory, in bytes."""
-    f = open('/proc/meminfo', 'r')
-    for line in f:
-        if line.startswith('SwapTotal:'):
-            f.close()
-            return int(line.split()[1]) * 1024
-
-def avail_virtmem():
-    """Return the amount of virtual memory currently in use on the
-    system, in bytes.
-    """
-    f = open('/proc/meminfo', 'r')
-    for line in f:
-        if line.startswith('SwapFree:'):
-            f.close()
-            return int(line.split()[1]) * 1024
-
-def used_virtmem():
-    """Return the amount of used memory currently in use on the system,
-    in bytes.
-    """
-    return total_virtmem() - avail_virtmem()
-
-def cached_phymem():
-    """Return the amount of cached memory on the system, in bytes.
-    This reflects the "cached" column of free command line utility.
-    """
-    f = open('/proc/meminfo', 'r')
-    for line in f:
-        if line.startswith('Cached:'):
-            f.close()
-            return int(line.split()[1]) * 1024
-
-def phymem_buffers():
-    """Return the amount of physical memory buffers used by the
-    kernel in bytes.
-    This reflects the "buffers" column of free command line utility.
-    """
-    f = open('/proc/meminfo', 'r')
-    for line in f:
-        if line.startswith('Buffers:'):
-            f.close()
-            return int(line.split()[1]) * 1024
-
-def get_system_cpu_times():
-    """Return a dict representing the following CPU times:
-    user, nice, system, idle, iowait, irq, softirq.
-    """
-    f = open('/proc/stat', 'r')
-    values = f.readline().split()
-    f.close()
-
-    values = values[1:8]
-    values = tuple([float(x) / _CLOCK_TICKS for x in values])
-    return ntuple_sys_cputimes(*values[:7])
-
-def get_pid_list():
-    """Returns a list of PIDs currently running on the system."""
-    pids = [int(x) for x in os.listdir('/proc') if x.isdigit()]
-    # special case for 0 (kernel process) PID
-    pids.insert(0, 0)
-    return pids
-
-def pid_exists(pid):
-    """Check For the existence of a unix pid."""
-    return _psposix.pid_exists(pid)
-
-
-# taken from /fs/proc/array.c
-_status_map = {"R" : STATUS_RUNNING,
-               "S" : STATUS_SLEEPING,
-               "D" : STATUS_DISK_SLEEP,
-               "T" : STATUS_STOPPED,
-               "t" : STATUS_TRACING_STOP,
-               "Z" : STATUS_ZOMBIE,
-               "X" : STATUS_DEAD,
-               "x" : STATUS_DEAD,
-               "K" : STATUS_WAKE_KILL,
-               "W" : STATUS_WAKING}
-
-# --- decorators
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause and translate ENOENT,
-    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except (OSError, IOError), err:
-            # ENOENT (no such file or directory) gets raised on open().
-            # ESRCH (no such process) can get raised on read() if
-            # process is gone in meantime.
-            if err.errno in (errno.ENOENT, errno.ESRCH):
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-class LinuxProcess(object):
-    """Linux process implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        if self.pid == 0:
-            return 'sched'  # special case for kernel process
-        f = open("/proc/%s/stat" % self.pid)
-        try:
-            name = f.read().split(' ')[1].replace('(', '').replace(')', '')
-        finally:
-            f.close()
-        # XXX - gets changed later and probably needs refactoring
-        return name
-
-    def get_process_exe(self):
-        if self.pid in (0, 2):
-            raise AccessDenied(self.pid, self._process_name)
-        try:
-            exe = os.readlink("/proc/%s/exe" % self.pid)
-        except (OSError, IOError), err:
-            if err.errno == errno.ENOENT:
-                # no such file error; might be raised also if the
-                # path actually exists for system processes with
-                # low pids (about 0-20)
-                if os.path.lexists("/proc/%s/exe" % self.pid):
-                    return ""
-                else:
-                    # ok, it is a process which has gone away
-                    raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-
-        # readlink() might return paths containing null bytes causing
-        # problems when used with other fs-related functions (os.*,
-        # open(), ...)
-        exe = exe.replace('\x00', '')
-        # It seems symlinks can point to a deleted/invalid location
-        # (this usually  happens with "pulseaudio" process).
-        # However, if we had permissions to execute readlink() it's
-        # likely that we'll be able to figure out exe from argv[0]
-        # later on.
-        if exe.endswith(" (deleted)") and not os.path.isfile(exe):
-            return ""
-        return exe
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        if self.pid == 0:
-            return []   # special case for kernel process
-        f = open("/proc/%s/cmdline" % self.pid)
-        try:
-            # return the args as a list
-            return [x for x in f.read().split('\x00') if x]
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        # special case for 0 (kernel process) PID
-        if self.pid == 0:
-            return ntuple_io(0, 0, 0, 0)
-        f = open("/proc/%s/io" % self.pid)
-        for line in f:
-            if line.startswith("rchar"):
-                read_count = int(line.split()[1])
-            elif line.startswith("wchar"):
-                write_count = int(line.split()[1])
-            elif line.startswith("read_bytes"):
-                read_bytes = int(line.split()[1])
-            elif line.startswith("write_bytes"):
-                write_bytes = int(line.split()[1])
-        return ntuple_io(read_count, write_count, read_bytes, write_bytes)
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        # special case for 0 (kernel process) PID
-        if self.pid == 0:
-            return ntuple_cputimes(0.0, 0.0)
-        f = open("/proc/%s/stat" % self.pid)
-        st = f.read().strip()
-        f.close()
-        # ignore the first two values ("pid (exe)")
-        st = st[st.find(')') + 2:]
-        values = st.split(' ')
-        utime = float(values[11]) / _CLOCK_TICKS
-        stime = float(values[12]) / _CLOCK_TICKS
-        return ntuple_cputimes(utime, stime)
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        # special case for 0 (kernel processes) PID; return system uptime
-        if self.pid == 0:
-            return BOOT_TIME
-        f = open("/proc/%s/stat" % self.pid)
-        st = f.read().strip()
-        f.close()
-        # ignore the first two values ("pid (exe)")
-        st = st[st.find(')') + 2:]
-        values = st.split(' ')
-        # According to documentation, starttime is in field 21 and the
-        # unit is jiffies (clock ticks).
-        # We first divide it for clock ticks and then add uptime returning
-        # seconds since the epoch, in UTC.
-        starttime = (float(values[19]) / _CLOCK_TICKS) + BOOT_TIME
-        return starttime
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        # special case for 0 (kernel processes) PID
-        if self.pid == 0:
-            return ntuple_meminfo(0, 0)
-        f = open("/proc/%s/status" % self.pid)
-        virtual_size = 0
-        resident_size = 0
-        _flag = False
-        for line in f:
-            if (not _flag) and line.startswith("VmSize:"):
-                virtual_size = int(line.split()[1]) * 1024
-                _flag = True
-            elif line.startswith("VmRSS"):
-                resident_size = int(line.split()[1]) * 1024
-                break
-        f.close()
-        return ntuple_meminfo(resident_size, virtual_size)
-
-    @wrap_exceptions
-    def get_process_cwd(self):
-        if self.pid == 0:
-            raise AccessDenied(self.pid, self._process_name)
-        # readlink() might return paths containing null bytes causing
-        # problems when used with other fs-related functions (os.*,
-        # open(), ...)
-        path = os.readlink("/proc/%s/cwd" % self.pid)
-        return path.replace('\x00', '')
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        if self.pid == 0:
-            return 0
-        f = open("/proc/%s/status" % self.pid)
-        for line in f:
-            if line.startswith("Threads:"):
-                f.close()
-                return int(line.split()[1])
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        if self.pid == 0:
-            return []
-        thread_ids = os.listdir("/proc/%s/task" % self.pid)
-        thread_ids.sort()
-        retlist = []
-        for thread_id in thread_ids:
-            try:
-                f = open("/proc/%s/task/%s/stat" % (self.pid, thread_id))
-            except (OSError, IOError), err:
-                if err.errno == errno.ENOENT:
-                    # no such file or directory; it means thread
-                    # disappeared on us
-                    continue
-                raise
-            st = f.read().strip()
-            f.close()
-            # ignore the first two values ("pid (exe)")
-            st = st[st.find(')') + 2:]
-            values = st.split(' ')
-            utime = float(values[11]) / _CLOCK_TICKS
-            stime = float(values[12]) / _CLOCK_TICKS
-            ntuple = ntuple_thread(int(thread_id), utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        #f = open('/proc/%s/stat' % self.pid, 'r')
-        #data = f.read()
-        #f.close()
-        #return int(data.split()[18])
-
-        # Use C implementation
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    # only starting from kernel 2.6.13
-    if hasattr(_psutil_linux, "ioprio_get"):
-
-        @wrap_exceptions
-        def get_process_ionice(self):
-            ioclass, value = _psutil_linux.ioprio_get(self.pid)
-            return ntuple_ionice(ioclass, value)
-
-        @wrap_exceptions
-        def set_process_ionice(self, ioclass, value):
-            if ioclass in (IOPRIO_CLASS_NONE, None):
-                if value:
-                    raise ValueError("can't specify value with IOPRIO_CLASS_NONE")
-                ioclass = IOPRIO_CLASS_NONE
-                value = 0
-            if ioclass in (IOPRIO_CLASS_RT, IOPRIO_CLASS_BE):
-                if value is None:
-                    value = 4
-            elif ioclass == IOPRIO_CLASS_IDLE:
-                if value:
-                    raise ValueError("can't specify value with IOPRIO_CLASS_IDLE")
-                value = 0
-            else:
-                value = 0
-            if not 0 <= value <= 8:
-                raise ValueError("value argument range expected is between 0 and 8")
-            return _psutil_linux.ioprio_set(self.pid, ioclass, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        if self.pid == 0:
-            return 0
-        f = open("/proc/%s/status" % self.pid)
-        for line in f:
-            if line.startswith("State:"):
-                f.close()
-                letter = line.split()[1]
-                if letter in _status_map:
-                    return _status_map[letter]
-                return constant(-1, '?')
-
-    @wrap_exceptions
-    def get_open_files(self):
-        retlist = []
-        files = os.listdir("/proc/%s/fd" % self.pid)
-        for fd in files:
-            file = "/proc/%s/fd/%s" % (self.pid, fd)
-            if os.path.islink(file):
-                file = os.readlink(file)
-                if file.startswith("socket:["):
-                    continue
-                if file.startswith("pipe:["):
-                    continue
-                if file == "[]":
-                    continue
-                if os.path.isfile(file) and not file in retlist:
-                    ntuple = ntuple_openfile(file, int(fd))
-                    retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_connections(self):
-        if self.pid == 0:
-            return []
-        inodes = {}
-        # os.listdir() is gonna raise a lot of access denied
-        # exceptions in case of unprivileged user; that's fine:
-        # lsof does the same so it's unlikely that we can to better.
-        for fd in os.listdir("/proc/%s/fd" % self.pid):
-            try:
-                inode = os.readlink("/proc/%s/fd/%s" % (self.pid, fd))
-            except OSError:
-                continue
-            if inode.startswith('socket:['):
-                # the process is using a socket
-                inode = inode[8:][:-1]
-                inodes[inode] = fd
-
-        if not inodes:
-            # no connections for this process
-            return []
-
-        def process(file, family, _type):
-            retlist = []
-            f = open(file)
-            f.readline()  # skip the first line
-            for line in f:
-                _, laddr, raddr, status, _, _, _, _, _, inode = line.split()[:10]
-                if inode in inodes:
-                    laddr = self._decode_address(laddr, family)
-                    raddr = self._decode_address(raddr, family)
-                    if _type == socket.SOCK_STREAM:
-                        status = _TCP_STATES_TABLE[status]
-                    else:
-                        status = ""
-                    fd = int(inodes[inode])
-                    conn = ntuple_connection(fd, family, _type, laddr,
-                                             raddr, status)
-                    retlist.append(conn)
-            f.close()
-            return retlist
-
-        tcp4 = process("/proc/net/tcp", socket.AF_INET, socket.SOCK_STREAM)
-        tcp6 = process("/proc/net/tcp6", socket.AF_INET6, socket.SOCK_STREAM)
-        udp4 = process("/proc/net/udp", socket.AF_INET, socket.SOCK_DGRAM)
-        udp6 = process("/proc/net/udp6", socket.AF_INET6, socket.SOCK_DGRAM)
-        return tcp4 + tcp6 + udp4 + udp6
-
-#    --- lsof implementation
-#
-#    def get_connections(self):
-#        lsof = _psposix.LsofParser(self.pid, self._process_name)
-#        return lsof.get_process_connections()
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        if self.pid == 0:
-            return 0
-        f = open("/proc/%s/status" % self.pid)
-        for line in f:
-            if line.startswith("PPid:"):
-                # PPid: nnnn
-                f.close()
-                return int(line.split()[1])
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        if self.pid == 0:
-            return ntuple_uids(0, 0, 0)
-        f = open("/proc/%s/status" % self.pid)
-        for line in f:
-            if line.startswith('Uid:'):
-                f.close()
-                _, real, effective, saved, fs = line.split()
-                return ntuple_uids(int(real), int(effective), int(saved))
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        if self.pid == 0:
-            return ntuple_uids(0, 0, 0)
-        f = open("/proc/%s/status" % self.pid)
-        for line in f:
-            if line.startswith('Gid:'):
-                f.close()
-                _, real, effective, saved, fs = line.split()
-                return ntuple_gids(int(real), int(effective), int(saved))
-
-    @staticmethod
-    def _decode_address(addr, family):
-        """Accept an "ip:port" address as displayed in /proc/net/*
-        and convert it into a human readable form, like:
-
-        "0500000A:0016" -> ("10.0.0.5", 22)
-        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)
-
-        The IPv4 address portion is a little-endian four-byte hexadecimal
-        number; that is, the least significant byte is listed first,
-        so we need to reverse the order of the bytes to convert it
-        to an IP address.
-        The port is represented as a two-byte hexadecimal number.
-
-        Reference:
-        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
-        """
-        ip, port = addr.split(':')
-        port = int(port, 16)
-        if sys.version_info >= (3,):
-            ip = ip.encode('ascii')
-        # this usually refers to a local socket in listen mode with
-        # no end-points connected
-        if not port:
-            return ()
-        if family == socket.AF_INET:
-            ip = socket.inet_ntop(family, base64.b16decode(ip)[::-1])
-        else:  # IPv6
-            # old version - let's keep it, just in case...
-            #ip = ip.decode('hex')
-            #return socket.inet_ntop(socket.AF_INET6,
-            #          ''.join(ip[i:i+4][::-1] for i in xrange(0, 16, 4)))
-            ip = base64.b16decode(ip)
-            ip = socket.inet_ntop(socket.AF_INET6,
-                                struct.pack('>4I', *struct.unpack('<4I', ip)))
-        return (ip, port)
-
-PlatformProcess = LinuxProcess
-
diff --git a/contrib/psutil-0.2.1/psutil/_psmswindows.py b/contrib/psutil-0.2.1/psutil/_psmswindows.py
deleted file mode 100644
index ff21d2f..0000000
--- a/contrib/psutil-0.2.1/psutil/_psmswindows.py
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psmswindows.py 934 2011-02-22 05:52:06Z g.rodola $
-#
-
-import errno
-import os
-import subprocess
-import socket
-import re
-import sys
-import platform
-
-import _psutil_mswindows
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-# Windows specific extended namespace
-__all__ = base_module_namespace[:]
-__all__.extend(["ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
-                "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
-                "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS"
-               ])
-
-
-# --- module level constants (gets pushed up to psutil module)
-
-NUM_CPUS = _psutil_mswindows.get_num_cpus()
-TOTAL_PHYMEM = _psutil_mswindows.get_total_phymem()
-BOOT_TIME = _psutil_mswindows.get_system_uptime()
-_WIN2000 = platform.win32_ver()[0] == '2000'
-ERROR_ACCESS_DENIED = 5
-
-# process priority constants:
-# http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx
-from _psutil_mswindows import (ABOVE_NORMAL_PRIORITY_CLASS,
-                               BELOW_NORMAL_PRIORITY_CLASS,
-                               HIGH_PRIORITY_CLASS,
-                               IDLE_PRIORITY_CLASS,
-                               NORMAL_PRIORITY_CLASS,
-                               REALTIME_PRIORITY_CLASS)
-
-
-# --- public functions
-
-def avail_phymem():
-    "Return the amount of physical memory available on the system, in bytes."
-    return _psutil_mswindows.get_avail_phymem()
-
-def used_phymem():
-    "Return the amount of physical memory currently in use on the system, in bytes."
-    return TOTAL_PHYMEM - _psutil_mswindows.get_avail_phymem()
-
-def total_virtmem():
-    "Return the amount of total virtual memory available on the system, in bytes."
-    return _psutil_mswindows.get_total_virtmem()
-
-def avail_virtmem():
-    "Return the amount of virtual memory currently in use on the system, in bytes."
-    return _psutil_mswindows.get_avail_virtmem()
-
-def used_virtmem():
-    """Return the amount of used memory currently in use on the system, in bytes."""
-    return _psutil_mswindows.get_total_virtmem() - _psutil_mswindows.get_avail_virtmem()
-
-_cputimes_ntuple = namedtuple('cputimes', 'user system idle')
-def get_system_cpu_times():
-    """Return system CPU times as a named tuple."""
-    user, system, idle = _psutil_mswindows.get_system_cpu_times()
-    return _cputimes_ntuple(user, system, idle)
-
-def get_pid_list():
-    """Returns a list of PIDs currently running on the system."""
-    return _psutil_mswindows.get_pid_list()
-
-def pid_exists(pid):
-    return _psutil_mswindows.pid_exists(pid)
-
-
-# --- decorator
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause so that if a
-    WindowsError 5 AccessDenied exception is raised we translate it
-    into psutil.AccessDenied
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except OSError, err:
-            if err.errno in (errno.EPERM, errno.EACCES, ERROR_ACCESS_DENIED):
-                raise AccessDenied(self.pid, self._process_name)
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-class WindowsProcess(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_mswindows.get_process_name(self.pid)
-
-    def get_process_exe(self):
-        # no such thing as "exe" on Windows; it will maybe be determined
-        # later from cmdline[0]
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        if self.pid in (0, 4):
-            raise AccessDenied(self.pid, self._process_name)
-        return ""
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        return _psutil_mswindows.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_mswindows.get_process_ppid(self.pid)
-
-    def get_process_uid(self):
-        # no such thing as uid on Windows
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        return -1
-
-    def get_process_gid(self):
-        # no such thing as gid on Windows
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        return -1
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Returns a tuple or RSS/VMS memory usage in bytes."""
-        # special case for 0 (kernel processes) PID
-        if self.pid == 0:
-            return ntuple_meminfo(0, 0)
-        rss, vms = _psutil_mswindows.get_memory_info(self.pid)
-        return ntuple_meminfo(rss, vms)
-
-    @wrap_exceptions
-    def kill_process(self):
-        """Terminates the process with the given PID."""
-        return _psutil_mswindows.kill_process(self.pid)
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        if not timeout:
-            timeout = 0
-        else:
-            # WaitForSingleObject() expects time in milliseconds
-            timeout = int(timeout * 1000)
-        ret = _psutil_mswindows.process_wait(self.pid, timeout)
-        if ret == -1:
-            raise TimeoutExpired(self.pid, self._process_name)
-        return ret
-
-    @wrap_exceptions
-    def get_process_username(self):
-        """Return the name of the user that owns the process"""
-        if self.pid in (0, 4) or self.pid == 8 and _WIN2000:
-            return 'NT AUTHORITY\\SYSTEM'
-        return _psutil_mswindows.get_process_username(self.pid);
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        # special case for kernel process PIDs; return system boot time
-        if self.pid in (0, 4) or self.pid == 8 and _WIN2000:
-            return BOOT_TIME
-        return _psutil_mswindows.get_process_create_time(self.pid)
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        return _psutil_mswindows.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        rawlist = _psutil_mswindows.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = ntuple_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        user, system = _psutil_mswindows.get_process_cpu_times(self.pid)
-        return ntuple_cputimes(user, system)
-
-    @wrap_exceptions
-    def suspend_process(self):
-        return _psutil_mswindows.suspend_process(self.pid)
-
-    @wrap_exceptions
-    def resume_process(self):
-        return _psutil_mswindows.resume_process(self.pid)
-
-    @wrap_exceptions
-    def get_process_cwd(self):
-        if self.pid in (0, 4) or self.pid == 8 and _WIN2000:
-            raise AccessDenied(self.pid, self._process_name)
-        # return a normalized pathname since the native C function appends
-        # "\\" at the and of the path
-        path = _psutil_mswindows.get_process_cwd(self.pid)
-        return os.path.normpath(path)
-
-    @wrap_exceptions
-    def get_open_files(self):
-        if self.pid in (0, 4) or self.pid == 8 and _WIN2000:
-            return []
-        retlist = []
-        # Filenames come in in native format like:
-        # "\Device\HarddiskVolume1\Windows\systemew\file.txt"
-        # Convert the first part in the corresponding drive letter
-        # (e.g. "C:\") by using Windows's QueryDosDevice()
-        raw_file_names = _psutil_mswindows.get_process_open_files(self.pid)
-        for file in raw_file_names:
-            if sys.version_info >= (3,):
-                file = file.decode('utf8')
-            if file.startswith('\\Device\\'):
-                rawdrive = '\\'.join(file.split('\\')[:3])
-                driveletter = _psutil_mswindows._QueryDosDevice(rawdrive)
-                file = file.replace(rawdrive, driveletter)
-                if os.path.isfile(file) and file not in retlist:
-                    ntuple = ntuple_openfile(file, -1)
-                    retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_connections(self):
-        retlist = _psutil_mswindows.get_process_connections(self.pid)
-        return [ntuple_connection(*conn) for conn in retlist]
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_mswindows.get_process_priority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_mswindows.set_process_priority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        rc, wc, rb, wb =_psutil_mswindows.get_process_io_counters(self.pid)
-        return ntuple_io(rc, wc, rb, wb)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        suspended = _psutil_mswindows.is_process_suspended(self.pid)
-        if suspended:
-            return STATUS_STOPPED
-        else:
-            return STATUS_RUNNING
-
-PlatformProcess = WindowsProcess
-
diff --git a/contrib/psutil-0.2.1/psutil/_psosx.py b/contrib/psutil-0.2.1/psutil/_psosx.py
deleted file mode 100644
index 609a880..0000000
--- a/contrib/psutil-0.2.1/psutil/_psosx.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psosx.py 940 2011-02-24 19:19:58Z g.rodola $
-#
-
-import errno
-import os
-
-import _psutil_osx
-import _psutil_posix
-import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-__all__ = base_module_namespace[:]
-
-# --- constants
-
-NUM_CPUS = _psutil_osx.get_num_cpus()
-TOTAL_PHYMEM = _psutil_osx.get_total_phymem()
-BOOT_TIME = _psutil_osx.get_system_boot_time()
-
-# --- functions
-
-def avail_phymem():
-    "Return the amount of physical memory available on the system, in bytes."
-    return _psutil_osx.get_avail_phymem()
-
-def used_phymem():
-    "Return the amount of physical memory currently in use on the system, in bytes."
-    return TOTAL_PHYMEM - _psutil_osx.get_avail_phymem()
-
-def total_virtmem():
-    "Return the amount of total virtual memory available on the system, in bytes."
-    return _psutil_osx.get_total_virtmem()
-
-def avail_virtmem():
-    "Return the amount of virtual memory currently in use on the system, in bytes."
-    return _psutil_osx.get_avail_virtmem()
-
-def used_virtmem():
-    """Return the amount of used memory currently in use on the system, in bytes."""
-    return _psutil_osx.get_total_virtmem() - _psutil_osx.get_avail_virtmem()
-
-_cputimes_ntuple = namedtuple('cputimes', 'user nice system idle')
-def get_system_cpu_times():
-    """Return system CPU times as a namedtuple."""
-    user, nice, system, idle = _psutil_osx.get_system_cpu_times()
-    return _cputimes_ntuple(user, nice, system, idle)
-
-def get_pid_list():
-    """Returns a list of PIDs currently running on the system."""
-    return _psutil_osx.get_pid_list()
-
-def pid_exists(pid):
-    """Check For the existence of a unix pid."""
-    return _psposix.pid_exists(pid)
-
-# --- decorator
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause so that if an
-    OSError EPERM exception is raised we translate it into
-    psutil.AccessDenied.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except OSError, err:
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-_status_map = {
-    _psutil_osx.SIDL : STATUS_IDLE,
-    _psutil_osx.SRUN : STATUS_RUNNING,
-    _psutil_osx.SSLEEP : STATUS_SLEEPING,
-    _psutil_osx.SSTOP : STATUS_STOPPED,
-    _psutil_osx.SZOMB : STATUS_ZOMBIE,
-}
-
-class OSXProcess(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_osx.get_process_name(self.pid)
-
-    def get_process_exe(self):
-        # no such thing as "exe" on OS X; it will maybe be determined
-        # later from cmdline[0]
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        return ""
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        return _psutil_osx.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_osx.get_process_ppid(self.pid)
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        real, effective, saved = _psutil_osx.get_process_uids(self.pid)
-        return ntuple_uids(real, effective, saved)
-
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        real, effective, saved = _psutil_osx.get_process_gids(self.pid)
-        return ntuple_gids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Return a tuple with the process' RSS and VMS size."""
-        rss, vms = _psutil_osx.get_memory_info(self.pid)
-        return ntuple_meminfo(rss, vms)
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        user, system = _psutil_osx.get_cpu_times(self.pid)
-        return ntuple_cputimes(user, system)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        """Return the start time of the process as a number of seconds since
-        the epoch."""
-        return _psutil_osx.get_process_create_time(self.pid)
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        """Return the number of threads belonging to the process."""
-        return _psutil_osx.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_open_files(self):
-        """Return files opened by process."""
-        if self.pid == 0:
-            raise AccessDenied(self.pid, self._process_name)
-        files = []
-        rawlist = _psutil_osx.get_process_open_files(self.pid)
-        for path, fd in rawlist:
-            if os.path.isfile(path):
-                ntuple = ntuple_openfile(path, fd)
-                files.append(ntuple)
-        return files
-
-    @wrap_exceptions
-    def get_connections(self):
-        """Return etwork connections opened by a process as a list of
-        namedtuples."""
-        retlist = _psutil_osx.get_process_connections(self.pid)
-        return [ntuple_connection(*conn) for conn in retlist]
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        code = _psutil_osx.get_process_status(self.pid)
-        if code in _status_map:
-            return _status_map[code]
-        return constant(-1, "?")
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        """Return the number of threads belonging to the process."""
-        rawlist = _psutil_osx.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = ntuple_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-
-
-PlatformProcess = OSXProcess
-
diff --git a/contrib/psutil-0.2.1/psutil/_psposix.py b/contrib/psutil-0.2.1/psutil/_psposix.py
deleted file mode 100644
index 5e45024..0000000
--- a/contrib/psutil-0.2.1/psutil/_psposix.py
+++ /dev/null
@@ -1,293 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psposix.py 924 2011-02-18 00:17:55Z g.rodola $
-#
-
-"""Routines common to all posix systems."""
-
-import os
-import errno
-import subprocess
-import psutil
-import socket
-import re
-import sys
-import warnings
-import time
-
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-
-
-def pid_exists(pid):
-    """Check whether pid exists in the current process table."""
-    if pid < 0:
-        return False
-    try:
-        os.kill(pid, 0)
-    except OSError, e:
-        return e.errno == errno.EPERM
-    else:
-        return True
-
-def wait_pid(pid, timeout=None):
-    """Wait for process with pid 'pid' to terminate and return its
-    exit status code as an integer.
-
-    If pid is not a children of os.getpid() (current process) just
-    waits until the process disappears and return None.
-
-    If pid does not exist at all return None immediately.
-
-    Raise TimeoutExpired on timeout expired.
-    """
-    def check_timeout():
-        if timeout:
-            if time.time() >= stop_at:
-                raise TimeoutExpired
-            time.sleep(0.001)
-
-    if timeout:
-        waitcall = lambda: os.waitpid(pid, os.WNOHANG)
-        stop_at = time.time() + timeout
-    else:
-        waitcall = lambda: os.waitpid(pid, 0)
-
-    while 1:
-        try:
-            retpid, status = waitcall()
-        except OSError, err:
-            if err.errno == errno.EINTR:
-                check_timeout()
-                continue
-            elif err.errno == errno.ECHILD:
-                # not a child of os.getpid(): poll until pid has
-                # disappeared and return None instead
-                while 1:
-                    if pid_exists(pid):
-                        check_timeout()
-                    else:
-                        return
-            else:
-                raise
-        else:
-            if retpid == 0:
-                check_timeout()
-                continue
-            # process exited due to a signal; return the integer of
-            # that signal
-            if os.WIFSIGNALED(status):
-                return os.WTERMSIG(status)
-            # process exited using exit(2) system call; return the
-            # integer exit(2) system call has been called with
-            elif os.WIFEXITED(status):
-                return os.WEXITSTATUS(status)
-            else:
-                # should never happen
-                raise RuntimeError("unknown process exit status")
-
-
-class LsofParser:
-    """A wrapper for lsof command line utility.
-    Executes lsof in subprocess and parses its output.
-    """
-    socket_table = {'TCP' : socket.SOCK_STREAM,
-                    'UDP' : socket.SOCK_DGRAM,
-                    'IPv4' : socket.AF_INET,
-                    'IPv6' : socket.AF_INET6}
-    _openfile_ntuple = namedtuple('openfile', 'path fd')
-    _connection_ntuple = namedtuple('connection', 'fd family type local_address '
-                                                  'remote_address status')
-
-    def __init__(self, pid, name):
-        self.pid = pid
-        self.process_name = name
-
-    def get_process_open_files(self):
-        """Return files opened by process by parsing lsof output."""
-        # Options:
-        # -i == network files only
-        # -a == ANDing of all options
-        # -p == process with given PID only
-        # -n == do not resolve IP addresses
-        # -P == do not resolve port numbers
-        # -w == suppresses warnings
-        # -F0nPt == (0) separate lines with "\x00"
-        #           (n) file name
-        #           (t) file type
-        #           (f) file descriptr
-        cmd = "lsof -a -p %s -n -P -F0ftn" % self.pid
-        stdout = self.runcmd(cmd)
-        if not stdout:
-            return []
-        files = []
-        lines = stdout.split("\n")
-        del lines[0]  # first line contains the PID
-        for line in lines:
-            if not line:
-                continue
-            line = line.strip("\x00")
-            fields = {}
-            for field in line.split("\x00"):
-                key, value = field[0], field[1:]
-                fields[key] = value
-            if not 't' in fields:
-                continue
-            _type = fields['t']
-            fd = fields['f']
-            name = fields['n']
-            if 'REG' in _type and fd.isdigit():
-                if not os.path.isfile(os.path.realpath(name)):
-                    continue
-                ntuple = self._openfile_ntuple(name, int(fd))
-                files.append(ntuple)
-        return files
-
-    def get_process_connections(self):
-        """Return connections opened by a process by parsing lsof output."""
-        # Options:
-        # -i == network files only
-        # -a == ANDing of all options
-        # -p == process with given PID only
-        # -n == do not resolve IP addresses
-        # -P == do not resolve port numbers
-        # -w == suppresses warnings
-        # -F0nPt == (0) separate lines with "\x00"
-        #           (n) and show internet addresses only
-        #           (P) protocol type (TCP, UPD, Unix)
-        #           (t) socket family (IPv4, IPv6)
-        #           (T) connection status
-        #           (f) file descriptors
-        cmd = "lsof -p %s -i -a -F0nPtTf -n -P" % self.pid
-        stdout = self.runcmd(cmd)
-        if not stdout:
-            return []
-        connections = []
-        lines = stdout.split()
-        del lines[0]  # first line contains the PID
-        for line in lines:
-            line = line.strip("\x00")
-            fields = {}
-            for field in line.split("\x00"):
-                if field.startswith('T'):
-                    key, value = field.split('=')
-                else:
-                    key, value = field[0], field[1:]
-                fields[key] = value
-
-            # XXX - might trow execption; needs "continue on unsupported
-            # family or type" (e.g. unix sockets)
-            # we consider TCP and UDP sockets only
-            stype = fields['P']
-            if stype not in self.socket_table:
-                continue
-            else:
-                _type = self.socket_table[fields['P']]
-            family = self.socket_table[fields['t']]
-            peers = fields['n']
-            fd = int(fields['f'])
-            if _type == socket.SOCK_STREAM:
-                status = fields['TST']
-                # OS X shows "CLOSED" instead of "CLOSE" so translate them
-                if status == "CLOSED":
-                    status = "CLOSE"
-            else:
-                status = ""
-            if not '->' in peers:
-                local_addr = self._normaddress(peers, family)
-                remote_addr = ()
-                # OS X processes e.g. SystemUIServer can return *:* for local
-                # address, so we return 0 and move on
-                if local_addr == 0:
-                    continue
-            else:
-                local_addr, remote_addr = peers.split("->")
-                local_addr = self._normaddress(local_addr, family)
-                remote_addr = self._normaddress(remote_addr, family)
-
-            conn = self._connection_ntuple(fd, family, _type, local_addr,
-                                           remote_addr, status)
-            connections.append(conn)
-
-        return connections
-
-    def runcmd(self, cmd):
-        """Expects an lsof-related command line, execute it in a
-        subprocess and return its output.
-        If something goes bad stderr is parsed and proper exceptions
-        raised as necessary.
-        """
-        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
-                                              stderr=subprocess.PIPE)
-        stdout, stderr = p.communicate()
-        if sys.version_info >= (3,):
-            stdout, stderr = map(lambda x: x.decode(sys.stdout.encoding),
-                                 (stdout, stderr))
-        if stderr:
-            utility = cmd.split(' ')[0]
-            if self._which(utility) is None:
-                msg = "this functionnality requires %s command line utility " \
-                      "to be installed on the system" % utility
-                raise NotImplementedError(msg)
-            elif "permission denied" in stderr.lower():
-                # "permission denied" can be found also in case of zombie
-                # processes;
-                p = psutil.Process(self.pid)
-                if not p.is_running():
-                    raise NoSuchProcess(self.pid, self.process_name)
-                raise AccessDenied(self.pid, self.process_name)
-            elif "lsof: warning:" in stderr.lower():
-                # usually appears when lsof is run for the first time and
-                # complains about missing cache file in user home
-                warnings.warn(stderr, RuntimeWarning)
-            else:
-                # this must be considered an application bug
-                raise RuntimeError(stderr)
-        if not stdout:
-            p = psutil.Process(self.pid)
-            if not p.is_running():
-                raise NoSuchProcess(self.pid, self.process_name)
-            return ""
-        return stdout
-
-    @staticmethod
-    def _which(program):
-        """Same as UNIX which command. Return None on command not found."""
-        def is_exe(fpath):
-            return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
-
-        fpath, fname = os.path.split(program)
-        if fpath:
-            if is_exe(program):
-                return program
-        else:
-            for path in os.environ["PATH"].split(os.pathsep):
-                exe_file = os.path.join(path, program)
-                if is_exe(exe_file):
-                    return exe_file
-        return None
-
-    @staticmethod
-    def _normaddress(addr, family):
-        """Normalize an IP address."""
-        assert family in (socket.AF_INET, socket.AF_INET6), "unsupported family"
-        if family == socket.AF_INET:
-            ip, port = addr.split(':')
-        else:
-            if "]" in addr:
-                ip, port = re.findall('\[([^]]+)\]:([0-9]+)', addr)[0]
-            else:
-                ip, port = addr.split(':')
-        if ip == '*':
-            if family == socket.AF_INET:
-                ip = "0.0.0.0"
-            elif family == socket.AF_INET6:
-                ip = "::"
-            # OS X can have some procs e.g. SystemUIServer listening on *:*
-            else:
-                raise ValueError("invalid IP %s" %addr)
-            if port == "*":
-                return 0
-        return (ip, int(port))
-
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_bsd.c b/contrib/psutil-0.2.1/psutil/_psutil_bsd.c
deleted file mode 100644
index 326e77c..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_bsd.c
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- * $Id: _psutil_bsd.c 944 2011-03-04 17:05:24Z g.rodola $
- *
- * FreeBSD platform-specific module methods for _psutil_bsd
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <sys/proc.h>
-#include <sys/vmmeter.h>  /* needed for vmtotal struct */
-
-#include "_psutil_bsd.h"
-#include "_psutil_common.h"
-#include "arch/bsd/process_info.h"
-
-
-// convert a timeval struct to a double
-#define TV2DOUBLE(t)    ((t).tv_sec + (t).tv_usec / 1000000.0)
-
-
-/*
- * Utility function which fills a kinfo_proc struct based on process pid
- */
-static int
-get_kinfo_proc(const pid_t pid, struct kinfo_proc *proc)
-{
-    int mib[4];
-    size_t size;
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID;
-    mib[3] = pid;
-
-    size = sizeof(struct kinfo_proc);
-
-    if (sysctl((int*)mib, 4, proc, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return -1;
-    }
-
-    /*
-     * sysctl stores 0 in the size if we can't find the process information.
-     */
-    if (size == 0) {
-        NoSuchProcess();
-        return -1;
-    }
-    return 0;
-}
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    kinfo_proc *proclist = NULL;
-    kinfo_proc *orig_address = NULL;
-    size_t num_processes;
-    size_t idx;
-    PyObject* retlist = PyList_New(0);
-    PyObject* pid;
-
-    if (get_proc_list(&proclist, &num_processes) != 0) {
-        Py_DECREF(retlist);
-        PyErr_SetString(PyExc_RuntimeError, "failed to retrieve process list.");
-        return NULL;
-    }
-
-    if (num_processes > 0) {
-        orig_address = proclist; // save so we can free it after we're done
-        for (idx=0; idx < num_processes; idx++) {
-            pid = Py_BuildValue("i", proclist->ki_pid);
-            PyList_Append(retlist, pid);
-            Py_XDECREF(pid);
-            proclist++;
-        }
-        free(orig_address);
-    }
-
-    return retlist;
-}
-
-
-/*
- * Return a Python float indicating the system boot time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_system_boot_time(PyObject* self, PyObject* args)
-{
-    /* fetch sysctl "kern.boottime" */
-    static int request[2] = { CTL_KERN, KERN_BOOTTIME };
-    struct timeval result;
-    size_t result_len = sizeof result;
-    time_t boot_time = 0;
-
-    if (sysctl(request, 2, &result, &result_len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    boot_time = result.tv_sec;
-    return Py_BuildValue("f", (float)boot_time);
-}
-
-
-/*
- * Return process name from kinfo_proc as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("s", kp.ki_comm);
-}
-
-
-/*
- * Return process pathname executable.
- * Thanks to Robert N. M. Watson:
- * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_bin.c?v=8-CURRENT
- */
-static PyObject*
-get_process_exe(PyObject* self, PyObject* args)
-{
-    long pid;
-    char pathname[PATH_MAX];
-    int error;
-    int mib[4];
-    size_t size;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PATHNAME;
-    mib[3] = pid;
-
-    size = sizeof(pathname);
-    error = sysctl(mib, 4, pathname, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-    }
-    if (size == 0 || strlen(pathname) == 0) {
-        if (pid_exists(pid) == 0) {
-            return NoSuchProcess();
-        }
-        else {
-            strcpy(pathname, "");
-        }
-    }
-    return Py_BuildValue("s", pathname);
-}
-
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args)
-{
-    long pid;
-    PyObject* arglist = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // get the commandline, defined in arch/bsd/process_info.c
-    arglist = get_arg_list(pid);
-
-    // get_arg_list() returns NULL only if getcmdargs failed with ESRCH
-    // (no process with that PID)
-    if (NULL == arglist) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("N", arglist);
-}
-
-
-/*
- * Return process parent pid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.ki_ppid);
-}
-
-
-/*
- * Return process status as a Python integer.
- */
-static PyObject*
-get_process_status(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", (int)kp.ki_stat);
-}
-
-
-/*
- * Return process real, effective and saved user ids from kinfo_proc
- * as a Python tuple.
- */
-static PyObject*
-get_process_uids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.ki_ruid,
-                                (long)kp.ki_uid,
-                                (long)kp.ki_svuid);
-}
-
-
-/*
- * Return process real, effective and saved group ids from kinfo_proc
- * as a Python tuple.
- */
-static PyObject*
-get_process_gids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.ki_rgid,
-                                (long)kp.ki_groups[0],
-                                (long)kp.ki_svuid);
-}
-
-
-/*
- * Return number of threads used by process as a Python integer.
- */
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.ki_numthreads);
-}
-
-
-/*
- * Retrieves all threads used by process returning a list of tuples
- * including thread id, user time and system time.
- * Thanks to Robert N. M. Watson:
- * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_threads.c?v=8-CURRENT
- */
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int mib[4];
-    struct kinfo_proc *kip;
-    struct kinfo_proc *kipp;
-    int error;
-    unsigned int i;
-    size_t size;
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    /*
-     * We need to re-query for thread information, so don't use *kipp.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
-    mib[3] = pid;
-
-    size = 0;
-    error = sysctl(mib, 4, NULL, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-	}
-    if (size == 0) {
-        return NoSuchProcess();
-    }
-
-    kip = malloc(size);
-    if (kip == NULL) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-    }
-
-    error = sysctl(mib, 4, kip, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-    }
-    if (size == 0) {
-        return NoSuchProcess();
-    }
-
-    for (i = 0; i < size / sizeof(*kipp); i++) {
-        kipp = &kip[i];
-        pyTuple = Py_BuildValue("Idd", kipp->ki_tid,
-                                       TV2DOUBLE(kipp->ki_rusage.ru_utime),
-                                       TV2DOUBLE(kipp->ki_rusage.ru_stime)
-                                );
-        PyList_Append(retList, pyTuple);
-        Py_XDECREF(pyTuple);
-    }
-    free(kip);
-    return retList;
-}
-
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_cpu_times(PyObject* self, PyObject* args)
-{
-    long pid;
-    double user_t, sys_t;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    // convert from microseconds to seconds
-    user_t = TV2DOUBLE(kp.ki_rusage.ru_utime);
-    sys_t = TV2DOUBLE(kp.ki_rusage.ru_stime);
-    return Py_BuildValue("(dd)", user_t, sys_t);
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    int ncpu;
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_NCPU;
-    len = sizeof(ncpu);
-
-    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("i", ncpu);
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("d", TV2DOUBLE(kp.ki_start));
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_io_counters(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    // there's apparently no way to determine bytes count, hence return -1.
-    return Py_BuildValue("(llll)", kp.ki_rusage.ru_inblock,
-                                   kp.ki_rusage.ru_oublock,
-                                   -1, -1);
-}
-
-
-
-/*
- * Return the RSS and VMS as a Python tuple.
- */
-static PyObject*
-get_memory_info(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("(ll)", ptoa(kp.ki_rssize), (long)kp.ki_size);
-}
-
-
-/*
- * Return a Python integer indicating the total amount of physical memory
- * in bytes.
- */
-static PyObject*
-get_total_phymem(PyObject* self, PyObject* args)
-{
-    long total_phymem;
-    int mib[2];
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_PHYSMEM;
-    len = sizeof(total_phymem);
-
-    if (sysctl(mib, 2, &total_phymem, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("l", total_phymem);
-}
-
-
-/*
- * Return a Python long indicating the amount of available physical memory in
- * bytes.
- */
-static PyObject*
-get_avail_phymem(PyObject* self, PyObject* args)
-{
-    unsigned long v_inactive_count = 0;
-    unsigned long v_cache_count = 0;
-    unsigned long v_free_count = 0;
-    long total_mem = 0;
-    long long avail_mem = 0;
-    size_t size = sizeof(unsigned long);
-    size_t psize = sizeof(total_mem);
-    int pagesize = getpagesize();
-
-    if (sysctlbyname("hw.physmem", &total_mem, &psize, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    if (sysctlbyname("vm.stats.vm.v_inactive_count", &v_inactive_count,
-                     &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    if (sysctlbyname("vm.stats.vm.v_cache_count",
-                     &v_cache_count, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    if (sysctlbyname("vm.stats.vm.v_free_count",
-                     &v_free_count, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    avail_mem = (v_inactive_count + v_cache_count + v_free_count) * pagesize;
-    // used_mem = total_mem - avail_mem;
-
-    return Py_BuildValue("L", avail_mem);
-}
-
-
-/*
- * Return a Python long indicating the total amount of virtual memory
- * in bytes.
- */
-static PyObject*
-get_total_virtmem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    struct vmtotal vm;
-    size_t size;
-    long long total_vmem;
-
-    mib[0] = CTL_VM;
-    mib[1] = VM_METER;
-    size = sizeof(vm);
-    sysctl(mib, 2, &vm, &size, NULL, 0);
-
-    // vmtotal struct:
-    // http://fxr.watson.org/fxr/source/sys/vmmeter.h?v=FREEBSD54
-    // note: value is returned in page, so we must multiply by size of a page
-    total_vmem = (long long)vm.t_vm * (long long)getpagesize();
-    return Py_BuildValue("L", total_vmem);
-}
-
-
-/*
- * Return a Python long indicating the avail amount of virtual memory
- * in bytes.
- */
-static PyObject*
-get_avail_virtmem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    struct vmtotal vm;
-    size_t size;
-    long long total_vmem;
-    long long avail_vmem;
-
-    mib[0] = CTL_VM;
-    mib[1] = VM_METER;
-    size = sizeof(vm);
-    sysctl(mib, 2, &vm, &size, NULL, 0);
-
-    // vmtotal struct:
-    // http://fxr.watson.org/fxr/source/sys/vmmeter.h?v=FREEBSD54
-    // note: value is returned in page, so we must multiply by size of a page
-    total_vmem = (long long)vm.t_vm * (long long)getpagesize();
-    avail_vmem = total_vmem - ((long long)vm.t_avm * (long long)getpagesize());
-    return Py_BuildValue("L", avail_vmem);
-}
-
-
-/*
- * Return a Python tuple representing user, kernel and idle CPU times
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    long cpu_time[CPUSTATES];
-    size_t size;
-
-    size = sizeof(cpu_time);
-
-    if (sysctlbyname("kern.cp_time", &cpu_time, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    /*
-        #define CP_USER     0
-        #define CP_NICE     1
-        #define CP_SYS      2
-        #define CP_INTR     3
-        #define CP_IDLE     4
-        #define CPUSTATES   5
-    */
-    //user, nice, system, idle, iowait, irqm, softirq
-    return Py_BuildValue("(ddddd)",
-                         (double)cpu_time[CP_USER] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_NICE] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_SYS] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_IDLE] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_INTR] / CLOCKS_PER_SEC
-    );
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     // --- per-process functions
-
-     {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-     {"get_process_exe", get_process_exe, METH_VARARGS,
-        "Return process pathname executable"},
-     {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-     {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-     {"get_process_uids", get_process_uids, METH_VARARGS,
-        "Return process real effective and saved user ids as a Python tuple"},
-     {"get_process_gids", get_process_gids, METH_VARARGS,
-        "Return process real effective and saved group ids as a Python tuple"},
-     {"get_cpu_times", get_cpu_times, METH_VARARGS,
-           "Return tuple of user/kern time for the given PID"},
-     {"get_process_create_time", get_process_create_time, METH_VARARGS,
-         "Return a float indicating the process create time expressed in "
-         "seconds since the epoch"},
-     {"get_memory_info", get_memory_info, METH_VARARGS,
-         "Return a tuple of RSS/VMS memory information"},
-     {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-         "Return number of threads used by process"},
-     {"get_process_threads", get_process_threads, METH_VARARGS,
-         "Return process threads"},
-     {"get_process_status", get_process_status, METH_VARARGS,
-         "Return process status as an integer"},
-     {"get_process_io_counters", get_process_io_counters, METH_VARARGS,
-         "Return process IO counters"},
-
-
-     // --- system-related functions
-
-     {"get_pid_list", get_pid_list, METH_VARARGS,
-         "Returns a list of PIDs currently running on the system"},
-     {"get_num_cpus", get_num_cpus, METH_VARARGS,
-           "Return number of CPUs on the system"},
-     {"get_total_phymem", get_total_phymem, METH_VARARGS,
-         "Return the total amount of physical memory, in bytes"},
-     {"get_avail_phymem", get_avail_phymem, METH_VARARGS,
-         "Return the amount of available physical memory, in bytes"},
-     {"get_total_virtmem", get_total_virtmem, METH_VARARGS,
-         "Return the total amount of virtual memory, in bytes"},
-     {"get_avail_virtmem", get_avail_virtmem, METH_VARARGS,
-         "Return the amount of available virtual memory, in bytes"},
-     {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-         "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
-     {"get_system_boot_time", get_system_boot_time, METH_VARARGS,
-         "Return a float indicating the system boot time expressed in "
-         "seconds since the epoch"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_bsd_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_bsd_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_bsd",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_bsd_traverse,
-        psutil_bsd_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_bsd(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_bsd(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_bsd", PsutilMethods);
-#endif
-    PyModule_AddIntConstant(module, "SSTOP", SSTOP);
-    PyModule_AddIntConstant(module, "SSLEEP", SSLEEP);
-    PyModule_AddIntConstant(module, "SRUN", SRUN);
-    PyModule_AddIntConstant(module, "SIDL", SIDL);
-    PyModule_AddIntConstant(module, "SWAIT", SWAIT);
-    PyModule_AddIntConstant(module, "SLOCK", SLOCK);
-    PyModule_AddIntConstant(module, "SZOMB", SZOMB);
-
-    if (module == NULL) {
-        INITERROR;
-    }
-    struct module_state *st = GETSTATE(module);
-
-    st->error = PyErr_NewException("_psutil_bsd.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_bsd.h b/contrib/psutil-0.2.1/psutil/_psutil_bsd.h
deleted file mode 100644
index 0d46925..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_bsd.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * $Id: _psutil_bsd.h 944 2011-03-04 17:05:24Z g.rodola $
- *
- * BSD platform-specific module methods for _psutil_bsd
- */
-
-#include <Python.h>
-
-// --- per-process functions
-
-static PyObject* get_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_exe(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_uids(PyObject* self, PyObject* args);
-static PyObject* get_process_gids(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_status(PyObject* self, PyObject* args);
-static PyObject* get_process_io_counters(PyObject* self, PyObject* args);
-
-// --- system-related functions
-
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_total_phymem(PyObject* self, PyObject* args);
-static PyObject* get_avail_phymem(PyObject* self, PyObject* args);
-static PyObject* get_total_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_avail_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_system_boot_time(PyObject* self, PyObject* args);
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_common.c b/contrib/psutil-0.2.1/psutil/_psutil_common.c
deleted file mode 100644
index aa31dc5..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_common.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * $Id: _psutil_common.c 831 2010-11-20 21:53:59Z g.rodola $
- *
- * Routines common to all platforms.
- */
-
-#include <Python.h>
-
-
-/*
- * Set OSError(errno=ESRCH, strerror="No such process") Python exception.
- */
-PyObject *
-NoSuchProcess(void) {
-    PyObject *exc;
-    char *msg = strerror(ESRCH);
-    exc = PyObject_CallFunction(PyExc_OSError, "(is)", ESRCH, msg);
-    PyErr_SetObject(PyExc_OSError, exc);
-    Py_XDECREF(exc);
-    return NULL;
-}
-
-/*
- * Set OSError(errno=EACCES, strerror="Permission denied") Python exception.
- */
-PyObject *
-AccessDenied(void) {
-    PyObject *exc;
-    char *msg = strerror(EACCES);
-    exc = PyObject_CallFunction(PyExc_OSError, "(is)", EACCES, msg);
-    PyErr_SetObject(PyExc_OSError, exc);
-    Py_XDECREF(exc);
-    return NULL;
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_common.h b/contrib/psutil-0.2.1/psutil/_psutil_common.h
deleted file mode 100644
index 33ab3e2..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_common.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * $Id: _psutil_common.h 831 2010-11-20 21:53:59Z g.rodola $
- */
-
-#include <Python.h>
-
-PyObject* NoSuchProcess(void);
-PyObject* AccessDenied(void);
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_linux.c b/contrib/psutil-0.2.1/psutil/_psutil_linux.c
deleted file mode 100644
index 75d2b0c..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_linux.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * $Id: _psutil_linux.c 892 2011-01-13 21:42:53Z g.rodola $
- *
- * Linux-specific functions.
- */
-
-#include <Python.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/syscall.h>
-#include <linux/unistd.h>
-
-#include "_psutil_linux.h"
-
-
-#define HAS_IOPRIO defined(__NR_ioprio_get) && defined(__NR_ioprio_set)
-
-#if HAS_IOPRIO
-enum {
-	IOPRIO_WHO_PROCESS = 1,
-};
-
-static inline int
-ioprio_get(int which, int who)
-{
-	return syscall(__NR_ioprio_get, which, who);
-}
-
-static inline int
-ioprio_set(int which, int who, int ioprio)
-{
-	return syscall(__NR_ioprio_set, which, who, ioprio);
-}
-
-#define IOPRIO_CLASS_SHIFT	13
-#define IOPRIO_PRIO_MASK  ((1UL << IOPRIO_CLASS_SHIFT) - 1)
-
-#define IOPRIO_PRIO_CLASS(mask)  ((mask) >> IOPRIO_CLASS_SHIFT)
-#define IOPRIO_PRIO_DATA(mask)  ((mask) & IOPRIO_PRIO_MASK)
-#define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)
-
-
-/*
- * Return a (ioclass, iodata) Python tuple representing process I/O priority.
- */
-static PyObject*
-linux_ioprio_get(PyObject* self, PyObject* args)
-{
-    long pid;
-	int ioprio, ioclass, iodata;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid);
-    if (ioprio == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-	ioclass = IOPRIO_PRIO_CLASS(ioprio);
-	iodata = IOPRIO_PRIO_DATA(ioprio);
-    return Py_BuildValue("ii", ioclass, iodata);
-}
-
-
-/*
- * A wrapper around ioprio_set(); sets process I/O priority.
- * ioclass can be either IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE
- * or 0. iodata goes from 0 to 7 depending on ioclass specified.
- */
-static PyObject*
-linux_ioprio_set(PyObject* self, PyObject* args)
-{
-    long pid;
-    int ioprio, ioclass, iodata;
-    int retval;
-
-    if (! PyArg_ParseTuple(args, "lii", &pid, &ioclass, &iodata)) {
-        return NULL;
-    }
-    ioprio = IOPRIO_PRIO_VALUE(ioclass, iodata);
-	retval = ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio);
-	if (retval == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-/*
- * Define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-#if HAS_IOPRIO
-     {"ioprio_get", linux_ioprio_get, METH_VARARGS,
-        "Get process I/O priority"},
-     {"ioprio_set", linux_ioprio_set, METH_VARARGS,
-        "Set process I/O priority"},
-#endif
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_linux_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_linux_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_linux",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_linux_traverse,
-        psutil_linux_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_linux(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_linux(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_linux", PsutilMethods);
-#endif
-    if (module == NULL) {
-        INITERROR;
-    }
-    struct module_state *st = GETSTATE(module);
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_linux.h b/contrib/psutil-0.2.1/psutil/_psutil_linux.h
deleted file mode 100644
index d74378e..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_linux.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * $Id: _psutil_linux.h 892 2011-01-13 21:42:53Z g.rodola $
- *
- * LINUX specific module methods for _psutil_linux
- */
-
-#include <Python.h>
-
-static PyObject* linux_ioprio_get(PyObject* self, PyObject* args);
-static PyObject* linux_ioprio_set(PyObject* self, PyObject* args);
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_mswindows.c b/contrib/psutil-0.2.1/psutil/_psutil_mswindows.c
deleted file mode 100644
index de77f10..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_mswindows.c
+++ /dev/null
@@ -1,1938 +0,0 @@
-/*
- * $Id: _psutil_mswindows.c 952 2011-03-20 20:06:20Z g.rodola $
- *
- * Windows platform-specific module methods for _psutil_mswindows
- */
-
-#include <Python.h>
-#include <windows.h>
-#include <Psapi.h>
-#include <time.h>
-#include <lm.h>
-#include <tchar.h>
-#include <tlhelp32.h>
-#include <iphlpapi.h>
-
-#include "_psutil_mswindows.h"
-#include "_psutil_common.h"
-#include "arch/mswindows/security.h"
-#include "arch/mswindows/process_info.h"
-#include "arch/mswindows/process_handles.h"
-#include "arch/mswindows/ntextapi.h"
-
-
-/*
- * Return a Python float representing the system uptime expressed in seconds
- * since the epoch.
- */
-static PyObject*
-get_system_uptime(PyObject* self, PyObject* args)
-{
-    double uptime;
-    time_t pt;
-    FILETIME fileTime;
-    long long ll;
-
-    GetSystemTimeAsFileTime(&fileTime);
-
-    /*
-    HUGE thanks to:
-    http://johnstewien.spaces.live.com/blog/cns!E6885DB5CEBABBC8!831.entry
-
-    This function converts the FILETIME structure to the 32 bit
-    Unix time structure.
-    The time_t is a 32-bit value for the number of seconds since
-    January 1, 1970. A FILETIME is a 64-bit for the number of
-    100-nanosecond periods since January 1, 1601. Convert by
-    subtracting the number of 100-nanosecond period betwee 01-01-1970
-    and 01-01-1601, from time_t the divide by 1e+7 to get to the same
-    base granularity.
-    */
-    ll = (((LONGLONG)(fileTime.dwHighDateTime)) << 32) + fileTime.dwLowDateTime;
-    pt = (time_t)((ll - 116444736000000000ull) / 10000000ull);
-
-    // XXX - By using GetTickCount() time will wrap around to zero if the
-    // system is run continuously for 49.7 days.
-    uptime = GetTickCount() / 1000.00f;
-    return Py_BuildValue("d", (double)pt - uptime);
-}
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-static PyObject*
-pid_exists(PyObject* self, PyObject* args)
-{
-    long pid;
-    int status;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    status = pid_is_running(pid);
-    if (-1 == status) {
-        return NULL; // exception raised in pid_is_running()
-    }
-    return PyBool_FromLong(status);
-}
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    DWORD *proclist = NULL;
-    DWORD numberOfReturnedPIDs;
-    DWORD i;
-    PyObject* pid = NULL;
-    PyObject* retlist = PyList_New(0);
-
-    proclist = get_pids(&numberOfReturnedPIDs);
-    if (NULL == proclist) {
-        Py_DECREF(retlist);
-        return NULL;
-    }
-
-    for (i = 0; i < numberOfReturnedPIDs; i++) {
-        pid = Py_BuildValue("I", proclist[i]);
-        PyList_Append(retlist, pid);
-        Py_XDECREF(pid);
-    }
-
-    // free C array allocated for PIDs
-    free(proclist);
-
-    return retlist;
-}
-
-
-/*
- * Kill a process given its PID.
- */
-static PyObject*
-kill_process(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    long pid;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if (pid == 0)
-        return AccessDenied();
-
-    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            // see http://code.google.com/p/psutil/issues/detail?id=24
-            NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        return NULL;
-    }
-
-    // kill the process
-    if (! TerminateProcess(hProcess, 0)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-    CloseHandle(hProcess);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Wait for process to terminate and return its exit code.
- */
-static PyObject*
-process_wait(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    DWORD ExitCode;
-    DWORD retVal;
-    long pid;
-    long timeout;
-
-    if (! PyArg_ParseTuple(args, "ll", &pid, &timeout))
-        return NULL;
-    if (pid == 0)
-        return AccessDenied();
-    if (timeout == 0)
-        timeout = INFINITE;
-
-    hProcess = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            // no such process; we do not want to raise NSP but
-            // return None instead.
-            Py_INCREF(Py_None);
-            return Py_None;
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    }
-
-    // wait until the process has terminated
-    Py_BEGIN_ALLOW_THREADS
-    retVal = WaitForSingleObject(hProcess, timeout);
-    Py_END_ALLOW_THREADS
-
-    if (retVal == WAIT_FAILED) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(GetLastError());
-    }
-    if (retVal == WAIT_TIMEOUT) {
-        CloseHandle(hProcess);
-        return Py_BuildValue("i", -1);
-    }
-
-    // get the exit code; note: subprocess module (erroneously?) uses
-    // what returned by WaitForSingleObject
-    if (GetExitCodeProcess(hProcess, &ExitCode) == 0) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(GetLastError());
-    }
-    CloseHandle(hProcess);
-#if PY_MAJOR_VERSION >= 3
-    return PyLong_FromLong((int) ExitCode);
-#else
-    return PyInt_FromLong((int) ExitCode);
-#endif
-}
-
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_process_cpu_times(PyObject* self, PyObject* args)
-{
-    long        pid;
-    HANDLE      hProcess;
-    FILETIME    ftCreate, ftExit, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // special case for PID 0
-    if (0 == pid){
-       return Py_BuildValue("(dd)", 0.0, 0.0);
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    if (! GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser)) {
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            // usually means the process has died so we throw a NoSuchProcess
-            // here
-            CloseHandle(hProcess);
-            return NoSuchProcess();
-        }
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-    CloseHandle(hProcess);
-
-    /*
-    user and kernel times are represented as a FILETIME structure wich contains
-    a 64-bit value representing the number of 100-nanosecond intervals since
-    January 1, 1601 (UTC).
-    http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx
-
-    To convert it into a float representing the seconds that the process has
-    executed in user/kernel mode I borrowed the code below from Python's
-    Modules/posixmodule.c
-    */
-
-    return Py_BuildValue(
-        "(dd)",
-        (double)(ftUser.dwHighDateTime*429.4967296 + \
-                 ftUser.dwLowDateTime*1e-7),
-        (double)(ftKernel.dwHighDateTime*429.4967296 + \
-                 ftKernel.dwLowDateTime*1e-7)
-        );
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long        pid;
-    long long unix_time;
-    HANDLE      hProcess;
-    FILETIME    ftCreate, ftExit, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // special case for PIDs 0 and 4
-    if ( (0 == pid) || (4 == pid) ){
-       return Py_BuildValue("d", 0.0);
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    if (! GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser)) {
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            // usually means the process has died so we throw a NoSuchProcess here
-            return NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-    CloseHandle(hProcess);
-
-    /*
-    Convert the FILETIME structure to a Unix time.
-    It's the best I could find by googling and borrowing code here and there.
-    The time returned has a precision of 1 second.
-    */
-    unix_time = ((LONGLONG)ftCreate.dwHighDateTime) << 32;
-    unix_time += ftCreate.dwLowDateTime - 116444736000000000LL;
-    unix_time /= 10000000;
-    return Py_BuildValue("d", (double)unix_time);
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system.
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-    SYSTEM_INFO system_info;
-    system_info.dwNumberOfProcessors = 0;
-
-    GetSystemInfo(&system_info);
-    if (system_info.dwNumberOfProcessors == 0){
-        // GetSystemInfo failed for some reason; return 1 as default
-        return Py_BuildValue("I", 1);
-    }
-    return Py_BuildValue("I", system_info.dwNumberOfProcessors);
-}
-
-/*
- * Return process name as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* name;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-
-    if (pid == 0) {
-        return Py_BuildValue("s", "System Idle Process");
-    }
-    else if (pid == 4) {
-        return Py_BuildValue("s", "System");
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    name = get_name(pid);
-    if (name == NULL)
-        return NULL;  // exception set in get_name()
-    return name;
-}
-
-
-/*
- * Return process parent pid as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* ppid;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if ((pid == 0) || (pid == 4))
-        return Py_BuildValue("l", 0);
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    ppid = get_ppid(pid);
-    if (ppid == NULL)
-        return NULL;  // exception set in get_ppid()
-    return ppid;
-}
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* arglist;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if ((pid == 0) || (pid == 4))
-        return Py_BuildValue("[]");
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    // May fail any of several ReadProcessMemory calls etc. and not indicate
-    // a real problem so we ignore any errors and just live without commandline
-    arglist = get_arg_list(pid);
-    if ( NULL == arglist ) {
-        // carry on anyway, clear any exceptions too
-        PyErr_Clear();
-        return Py_BuildValue("[]");
-    }
-
-    return arglist;
-}
-
-
-/*
- * Return the RSS and VMS as a Python tuple.
- */
-static PyObject*
-get_memory_info(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    PROCESS_MEMORY_COUNTERS counters;
-    DWORD pid;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-
-    if (! GetProcessMemoryInfo(hProcess, &counters, sizeof(counters)) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return Py_BuildValue("(nn)", counters.WorkingSetSize, counters.PagefileUsage);
-}
-
-
-/*
- * Return a Python integer indicating the total amount of physical memory
- * in bytes.
- */
-static PyObject*
-get_total_phymem(PyObject* self, PyObject* args)
-{
-    MEMORYSTATUSEX memInfo;
-    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
-
-    if (! GlobalMemoryStatusEx(&memInfo) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return Py_BuildValue("L", memInfo.ullTotalPhys);
-}
-
-
-/*
- * Return a Python integer indicating the total amount of virtual memory
- * in bytes.
- */
-static PyObject*
-get_total_virtmem(PyObject* self, PyObject* args)
-{
-    MEMORYSTATUSEX memInfo;
-    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
-
-    if (! GlobalMemoryStatusEx(&memInfo) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return Py_BuildValue("L", memInfo.ullTotalPageFile);
-}
-
-
-/*
- * Return a Python integer indicating the amount of available physical memory
- * in bytes.
- */
-static PyObject*
-get_avail_phymem(PyObject* self, PyObject* args)
-{
-    MEMORYSTATUSEX memInfo;
-    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
-    if (! GlobalMemoryStatusEx(&memInfo) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-    return Py_BuildValue("L", memInfo.ullAvailPhys);
-}
-
-
-/*
- * Return a Python integer indicating the amount of available virtual memory
- * in bytes.
- */
-static PyObject*
-get_avail_virtmem(PyObject* self, PyObject* args)
-{
-    MEMORYSTATUSEX memInfo;
-    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
-
-    if (! GlobalMemoryStatusEx(&memInfo) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-    return Py_BuildValue("L", memInfo.ullAvailPageFile);
-}
-
-
-#define LO_T ((float)1e-7)
-#define HI_T (LO_T*4294967296.0)
-
-
-/*
- * Return a Python tuple representing user, kernel and idle CPU times
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    typedef BOOL (_stdcall *GST_PROC) (LPFILETIME, LPFILETIME, LPFILETIME);
-    static GST_PROC GetSystemTimes;
-    static BOOL bFirstCall = TRUE;
-    float idle, kernel, user;
-
-    // Improves performance calling GetProcAddress only the first time
-    if (bFirstCall) {
-        // retrieves GetSystemTimes address in Kernel32
-        GetSystemTimes=(GST_PROC)GetProcAddress(GetModuleHandle
-                                               (TEXT("Kernel32.dll")),
-                                               "GetSystemTimes");
-        bFirstCall = FALSE;
-    }
-
-
-     // Uses GetSystemTimes if supported (winXP sp1+)
-    if (NULL!=GetSystemTimes) {
-        // GetSystemTimes supported
-
-        FILETIME idle_time;
-        FILETIME kernel_time;
-        FILETIME user_time;
-
-        if (!GetSystemTimes(&idle_time, &kernel_time, &user_time)) {
-            return PyErr_SetFromWindowsErr(0);
-        }
-
-        idle = (float)((HI_T * idle_time.dwHighDateTime) + \
-                       (LO_T * idle_time.dwLowDateTime));
-        user = (float)((HI_T * user_time.dwHighDateTime) + \
-                       (LO_T * user_time.dwLowDateTime));
-        kernel = (float)((HI_T * kernel_time.dwHighDateTime) + \
-                         (LO_T * kernel_time.dwLowDateTime));
-
-        // kernel time includes idle time on windows
-        // we return only busy kernel time subtracting idle time from kernel time
-        return Py_BuildValue("(fff)", user,
-                                      kernel - idle,
-                                      idle);
-
-    }
-
-    else {
-        // GetSystemTimes NOT supported, use NtQuerySystemInformation instead
-
-        typedef DWORD (_stdcall *NTQSI_PROC) (int, PVOID, ULONG, PULONG);
-        NTQSI_PROC NtQuerySystemInformation;
-        HINSTANCE hNtDll;
-        SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *sppi = NULL;
-        SYSTEM_INFO si;
-        UINT i;
-
-        // dynamic linking is mandatory to use NtQuerySystemInformation
-        hNtDll = LoadLibrary(TEXT("ntdll.dll"));
-        if (hNtDll != NULL) {
-            // gets NtQuerySystemInformation address
-            NtQuerySystemInformation = (NTQSI_PROC)GetProcAddress(
-                                        hNtDll, "NtQuerySystemInformation");
-
-            if (NtQuerySystemInformation != NULL)
-            {
-                // retrives number of processors
-                GetSystemInfo(&si);
-
-                // allocates an array of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
-                // structures, one per processor
-                sppi=(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *) \
-                      malloc(si.dwNumberOfProcessors * \
-                             sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
-                if (sppi != NULL)
-                {
-                    // gets cpu time informations
-                    if (0 == NtQuerySystemInformation(
-                                SystemProcessorPerformanceInformation,
-                                sppi,
-                                si.dwNumberOfProcessors * sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION),
-                                NULL))
-                    {
-                        // computes system global times summing each processor value
-                        idle = user = kernel = 0;
-                        for (i=0; i<si.dwNumberOfProcessors; i++) {
-                            idle += (float)((HI_T * sppi[i].IdleTime.HighPart) + \
-                                            (LO_T * sppi[i].IdleTime.LowPart));
-                            user += (float)((HI_T * sppi[i].UserTime.HighPart) + \
-                                            (LO_T * sppi[i].UserTime.LowPart));
-                            kernel += (float)((HI_T * sppi[i].KernelTime.HighPart) + \
-                                              (LO_T * sppi[i].KernelTime.LowPart));
-                        }
-
-                        // kernel time includes idle time on windows
-                        // we return only busy kernel time subtracting idle
-                        // time from kernel time
-                        return Py_BuildValue("(ddd)", user,
-                                                      kernel - idle,
-                                                      idle
-                                             );
-
-                    } // END NtQuerySystemInformation
-
-                } // END malloc SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
-
-            } // END GetProcAddress
-
-        } // END LoadLibrary
-
-        PyErr_SetFromWindowsErr(0);
-        if (sppi) {
-            free(sppi);
-        }
-        if (hNtDll) {
-            FreeLibrary(hNtDll);
-        }
-        return 0;
-
-    } // END GetSystemTimes NOT supported
-}
-
-
-/*
- * Sid to User convertion
- */
-BOOL SidToUser(PSID pSid, LPTSTR szUser, DWORD dwUserLen, LPTSTR szDomain, DWORD
-dwDomainLen, DWORD pid)
-{
-    SID_NAME_USE snuSIDNameUse;
-    DWORD dwULen;
-    DWORD dwDLen;
-
-    dwULen = dwUserLen;
-    dwDLen = dwDomainLen;
-
-    if ( IsValidSid( pSid ) ) {
-        // Get user and domain name based on SID
-        if ( LookupAccountSid( NULL, pSid, szUser, &dwULen, szDomain, &dwDLen, &snuSIDNameUse) ) {
-            // LocalSystem processes are incorrectly reported as owned
-            // by BUILTIN\Administrators We modify that behavior to
-            // conform to standard taskmanager only if the process is
-            // actually a System process
-            if (is_system_proc(pid) == 1) {
-                // default to *not* changing the data if we fail to
-                // check for local system privileges, so only look for
-                // definite confirmed system processes and ignore errors
-                if ( lstrcmpi(szDomain, TEXT("builtin")) == 0 && lstrcmpi(szUser, TEXT("administrators")) == 0) {
-                    strncpy  (szUser, "SYSTEM", dwUserLen);
-                    strncpy  (szDomain, "NT AUTHORITY", dwDomainLen);
-                }
-            }
-
-            return TRUE;
-        }
-    }
-
-    return FALSE;
-}
-
-
-/*
- * Return process current working directory as a Python string.
- */
-
-static PyObject*
-get_process_cwd(PyObject* self, PyObject* args)
-{
-    long pid;
-    HANDLE processHandle;
-    PVOID pebAddress;
-    PVOID rtlUserProcParamsAddress;
-    UNICODE_STRING currentDirectory;
-    WCHAR *currentDirectoryContent;
-    PyObject *returnPyObj = NULL;
-    PyObject *cwd_from_wchar = NULL;
-    PyObject *cwd = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid(pid);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    pebAddress = GetPebAddress(processHandle);
-
-    /* get the address of ProcessParameters */
-#ifdef _WIN64
-    if (!ReadProcessMemory(processHandle, (PCHAR)pebAddress + 32,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#else
-    if (!ReadProcessMemory(processHandle, (PCHAR)pebAddress + 0x10,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#endif
-    {
-            CloseHandle(processHandle);
-
-            if (GetLastError() == ERROR_PARTIAL_COPY) {
-                /* Usually means the process has gone in the meantime */
-                return NoSuchProcess();
-            }
-            else {
-                return PyErr_SetFromWindowsErr(0);
-            }
-
-    }
-
-    /* read the currentDirectory UNICODE_STRING structure.
-       0x24 refers to "CurrentDirectoryPath" of RTL_USER_PROCESS_PARAMETERS
-       structure (http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/)
-     */
-#ifdef _WIN64
-    if (!ReadProcessMemory(processHandle, (PCHAR)rtlUserProcParamsAddress + 56,
-        &currentDirectory, sizeof(currentDirectory), NULL))
-#else
-    if (!ReadProcessMemory(processHandle, (PCHAR)rtlUserProcParamsAddress + 0x24,
-        &currentDirectory, sizeof(currentDirectory), NULL))
-#endif
-    {
-        CloseHandle(processHandle);
-        if (GetLastError() == ERROR_PARTIAL_COPY) {
-            /* Usually means the process has gone in the meantime */
-            return NoSuchProcess();
-        }
-        else {
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    /* allocate memory to hold the command line */
-    currentDirectoryContent = (WCHAR *)malloc(currentDirectory.Length+1);
-
-    /* read the command line */
-    if (!ReadProcessMemory(processHandle, currentDirectory.Buffer,
-        currentDirectoryContent, currentDirectory.Length, NULL))
-    {
-        CloseHandle(processHandle);
-        free(currentDirectoryContent);
-
-        if (GetLastError() == ERROR_PARTIAL_COPY) {
-            /* Usually means the process has gone in the meantime */
-            return NoSuchProcess();
-        }
-        else {
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    // null-terminate the string to prevent wcslen from returning incorrect length
-    // the length specifier is in characters, but commandLine.Length is in bytes
-    currentDirectoryContent[(currentDirectory.Length/sizeof(WCHAR))] = '\0';
-
-    // convert wchar array to a Python unicode string, and then to UTF8
-    cwd_from_wchar = PyUnicode_FromWideChar(currentDirectoryContent,
-                                            wcslen(currentDirectoryContent));
-
-    #if PY_MAJOR_VERSION >= 3
-        cwd = PyUnicode_FromObject(cwd_from_wchar);
-    #else
-        cwd = PyUnicode_AsUTF8String(cwd_from_wchar);
-    #endif
-
-    // decrement the reference count on our temp unicode str to avoid mem leak
-    Py_XDECREF(cwd_from_wchar);
-    returnPyObj = Py_BuildValue("N", cwd);
-
-    CloseHandle(processHandle);
-    free(currentDirectoryContent);
-    return returnPyObj;
-}
-
-
-/*
- * Resume or suspends a process
- */
-int
-suspend_resume_process(DWORD pid, int suspend)
-{
-    // a huge thanks to http://www.codeproject.com/KB/threads/pausep.aspx
-    HANDLE hThreadSnap = NULL;
-    THREADENTRY32  te32 = {0};
-
-    if (pid == 0) {
-        AccessDenied();
-        return FALSE;
-    }
-
-    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
-    if (hThreadSnap == INVALID_HANDLE_VALUE) {
-        PyErr_SetFromWindowsErr(0);
-        return FALSE;
-    }
-
-    // Fill in the size of the structure before using it
-    te32.dwSize = sizeof(THREADENTRY32);
-
-    if (! Thread32First(hThreadSnap, &te32)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hThreadSnap);
-        return FALSE;
-    }
-
-    // Walk the thread snapshot to find all threads of the process.
-    // If the thread belongs to the process, add its information
-    // to the display list.
-    do
-    {
-        if (te32.th32OwnerProcessID == pid)
-        {
-            HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE,
-                                        te32.th32ThreadID);
-            if (hThread == NULL) {
-                PyErr_SetFromWindowsErr(0);
-                CloseHandle(hThread);
-                CloseHandle(hThreadSnap);
-                return FALSE;
-            }
-            if (suspend == 1)
-            {
-                if (SuspendThread(hThread) == (DWORD)-1) {
-                    PyErr_SetFromWindowsErr(0);
-                    CloseHandle(hThread);
-                    CloseHandle(hThreadSnap);
-                    return FALSE;
-                }
-            }
-            else
-            {
-                if (ResumeThread(hThread) == (DWORD)-1) {
-                    PyErr_SetFromWindowsErr(0);
-                    CloseHandle(hThread);
-                    CloseHandle(hThreadSnap);
-                    return FALSE;
-                }
-            }
-            CloseHandle(hThread);
-        }
-    } while (Thread32Next(hThreadSnap, &te32));
-
-    return TRUE;
-}
-
-
-static PyObject*
-suspend_process(PyObject* self, PyObject* args)
-{
-    long pid;
-    int suspend = 1;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (! suspend_resume_process(pid, suspend)) {
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-static PyObject*
-resume_process(PyObject* self, PyObject* args)
-{
-    long pid;
-    int suspend = 0;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (! suspend_resume_process(pid, suspend)) {
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pid_return;
-    long nthreads = 0;
-    HANDLE hThreadSnap = NULL;
-    THREADENTRY32 te32 = {0};
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if (pid == 0) {
-        // raise AD instead of returning 0 as procexp is able to
-        // retrieve useful information somehow
-        return AccessDenied();
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
-    if (hThreadSnap == INVALID_HANDLE_VALUE) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-
-    // Fill in the size of the structure before using it
-    te32.dwSize = sizeof(THREADENTRY32);
-
-    if (! Thread32First(hThreadSnap, &te32)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hThreadSnap);
-        return NULL;
-    }
-
-    // Walk the thread snapshot to find all threads of the process.
-    // If the thread belongs to the process, increase the counter.
-    do
-    {
-        if (te32.th32OwnerProcessID == pid)
-        {
-            HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION,
-                                        FALSE, te32.th32ThreadID);
-            if (hThread == NULL) {
-                if (GetLastError() == ERROR_INVALID_PARAMETER) {
-                    NoSuchProcess();
-                }
-                else {
-                    PyErr_SetFromWindowsErr(0);
-                }
-                CloseHandle(hThread);
-                CloseHandle(hThreadSnap);
-                return NULL;
-            }
-            nthreads += 1;
-            CloseHandle(hThread);
-        }
-    } while (Thread32Next(hThreadSnap, &te32));
-
-    // every process should be supposed to have at least one thread
-    if (nthreads == 0) {
-        return NoSuchProcess();
-    }
-
-    return Py_BuildValue("l", nthreads);
-}
-
-
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-    HANDLE hThreadSnap = NULL;
-    THREADENTRY32 te32 = {0};
-    long pid;
-    int pid_return;
-    int rc;
-    FILETIME ftDummy, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if (pid == 0) {
-        // raise AD instead of returning 0 as procexp is able to
-        // retrieve useful information somehow
-        return AccessDenied();
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
-    if (hThreadSnap == INVALID_HANDLE_VALUE) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-
-    // Fill in the size of the structure before using it
-    te32.dwSize = sizeof(THREADENTRY32);
-
-    if (! Thread32First(hThreadSnap, &te32)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hThreadSnap);
-        return NULL;
-    }
-
-    // Walk the thread snapshot to find all threads of the process.
-    // If the thread belongs to the process, increase the counter.
-    do
-    {
-        if (te32.th32OwnerProcessID == pid)
-        {
-            HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION,
-                                        FALSE, te32.th32ThreadID);
-            if (hThread == NULL) {
-                if (GetLastError() == ERROR_INVALID_PARAMETER) {
-                    NoSuchProcess();
-                }
-                else {
-                    PyErr_SetFromWindowsErr(0);
-                }
-                CloseHandle(hThread);
-                CloseHandle(hThreadSnap);
-                return NULL;
-            }
-
-            rc = GetThreadTimes(hThread, &ftDummy, &ftDummy, &ftKernel, &ftUser);
-            if (rc == 0) {
-                PyErr_SetFromWindowsErr(0);
-                CloseHandle(hThread);
-                return NULL;
-            }
-
-            /*
-            user and kernel times are represented as a FILETIME structure
-            wich contains a 64-bit value representing the number of
-            100-nanosecond intervals since January 1, 1601 (UTC).
-            http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx
-
-            To convert it into a float representing the seconds that the
-            process has executed in user/kernel mode I borrowed the code
-            below from Python's Modules/posixmodule.c
-            */
-            pyTuple = Py_BuildValue("kdd",
-                            te32.th32ThreadID,
-                            (double)(ftUser.dwHighDateTime*429.4967296 + \
-                                     ftUser.dwLowDateTime*1e-7),
-                            (double)(ftKernel.dwHighDateTime*429.4967296 + \
-                                     ftKernel.dwLowDateTime*1e-7)
-                      );
-            PyList_Append(retList, pyTuple);
-            Py_XDECREF(pyTuple);
-
-            CloseHandle(hThread);
-        }
-    } while (Thread32Next(hThreadSnap, &te32));
-
-    return retList;
-}
-
-
-
-static PyObject*
-get_process_open_files(PyObject* self, PyObject* args)
-{
-    long       pid;
-    HANDLE     processHandle;
-    DWORD      access = PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION;
-    PyObject*  filesList;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid_waccess(pid, access);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    filesList = get_open_files(pid, processHandle);
-    if (filesList == NULL) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-    return filesList;
-}
-
-
-/*
- Accept a filename's drive in native  format like "\Device\HarddiskVolume1\"
- and return the corresponding drive letter (e.g. "C:\\").
- If no match is found return an empty string.
-*/
-static PyObject*
-_QueryDosDevice(PyObject* self, PyObject* args)
-{
-    LPCTSTR   lpDevicePath;
-    TCHAR d = TEXT('A');
-    TCHAR     szBuff[5];
-
-    if (!PyArg_ParseTuple(args, "s", &lpDevicePath)) {
-        return NULL;
-    }
-
-    while(d <= TEXT('Z'))
-    {
-        TCHAR szDeviceName[3] = {d,TEXT(':'),TEXT('\0')};
-        TCHAR szTarget[512] = {0};
-        if (QueryDosDevice(szDeviceName, szTarget, 511) != 0){
-            //_tprintf (TEXT("%c:\\   =>   %s\n"), d, szTarget);
-            if(_tcscmp(lpDevicePath, szTarget) == 0) {
-                _stprintf(szBuff, TEXT("%c:"), d);
-                return Py_BuildValue("s", szBuff);
-            }
-        }
-        d++;
-    }
-    return Py_BuildValue("s", "");
-}
-
-/*
- * Return process username as a "DOMAIN//USERNAME" string.
- */
-static PyObject*
-get_process_username(PyObject* self, PyObject* args)
-{
-    long pid;
-    HANDLE processHandle;
-    HANDLE tokenHandle;
-    PTOKEN_USER user;
-    ULONG bufferSize;
-    PTSTR name;
-    ULONG nameSize;
-    PTSTR domainName;
-    ULONG domainNameSize;
-    SID_NAME_USE nameUse;
-    PTSTR fullName;
-    PyObject* returnObject;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid_waccess(pid, PROCESS_QUERY_INFORMATION);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    if (!OpenProcessToken(processHandle, TOKEN_QUERY, &tokenHandle)) {
-        CloseHandle(processHandle);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    CloseHandle(processHandle);
-
-    /* Get the user SID. */
-
-    bufferSize = 0x100;
-    user = malloc(bufferSize);
-
-    if (!GetTokenInformation(tokenHandle,
-                             TokenUser,
-                             user,
-                             bufferSize,
-                             &bufferSize))
-    {
-        free(user);
-        user = malloc(bufferSize);
-
-        if (!GetTokenInformation(tokenHandle,
-                                 TokenUser,
-                                 user,
-                                 bufferSize,
-                                 &bufferSize))
-        {
-            free(user);
-            CloseHandle(tokenHandle);
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    CloseHandle(tokenHandle);
-
-    /* Resolve the SID to a name. */
-
-    nameSize = 0x100;
-    domainNameSize = 0x100;
-
-    name = malloc(nameSize * sizeof(TCHAR));
-    domainName = malloc(domainNameSize * sizeof(TCHAR));
-
-    if (!LookupAccountSid(NULL, user->User.Sid, name, &nameSize, domainName,
-                          &domainNameSize, &nameUse))
-    {
-        free(name);
-        free(domainName);
-        name = malloc(nameSize * sizeof(TCHAR));
-        domainName = malloc(domainNameSize * sizeof(TCHAR));
-
-        if (!LookupAccountSid(NULL, user->User.Sid, name, &nameSize, domainName,
-                              &domainNameSize, &nameUse))
-        {
-            free(name);
-            free(domainName);
-            free(user);
-
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    nameSize = _tcslen(name);
-    domainNameSize = _tcslen(domainName);
-
-    /* Build the full username string. */
-    fullName = malloc((domainNameSize + 1 + nameSize + 1) * sizeof(TCHAR));
-    memcpy(fullName, domainName, domainNameSize);
-    fullName[domainNameSize] = '\\';
-    memcpy(&fullName[domainNameSize + 1], name, nameSize);
-    fullName[domainNameSize + 1 + nameSize] = '\0';
-
-    returnObject = Py_BuildValue("s", fullName);
-
-    free(fullName);
-    free(name);
-    free(domainName);
-    free(user);
-
-    return returnObject;
-}
-
-#define BYTESWAP_USHORT(x) ((((USHORT)(x) << 8) | ((USHORT)(x) >> 8)) & 0xffff)
-
-#ifndef AF_INET6
-#define AF_INET6 23
-#endif
-
-static char *state_to_string(ULONG state)
-{
-    switch (state)
-    {
-    case MIB_TCP_STATE_CLOSED:
-        return "CLOSE";
-    case MIB_TCP_STATE_LISTEN:
-        return "LISTEN";
-    case MIB_TCP_STATE_SYN_SENT:
-        return "SYN_SENT";
-    case MIB_TCP_STATE_SYN_RCVD:
-        return "SYN_RECV";
-    case MIB_TCP_STATE_ESTAB:
-        return "ESTABLISHED";
-    case MIB_TCP_STATE_FIN_WAIT1:
-        return "FIN_WAIT1";
-    case MIB_TCP_STATE_FIN_WAIT2:
-        return "FIN_WAIT2";
-    case MIB_TCP_STATE_CLOSE_WAIT:
-        return "CLOSE_WAIT";
-    case MIB_TCP_STATE_CLOSING:
-        return "CLOSING";
-    case MIB_TCP_STATE_LAST_ACK:
-        return "LAST_ACK";
-    case MIB_TCP_STATE_TIME_WAIT:
-        return "TIME_WAIT";
-    case MIB_TCP_STATE_DELETE_TCB:
-        return "DELETE_TCB";
-    default:
-        return "";
-    }
-}
-
-/* mingw support */
-#ifndef _IPRTRMIB_H
-typedef struct _MIB_TCP6ROW_OWNER_PID
-{
-    UCHAR           ucLocalAddr[16];
-    DWORD           dwLocalScopeId;
-    DWORD           dwLocalPort;
-    UCHAR           ucRemoteAddr[16];
-    DWORD           dwRemoteScopeId;
-    DWORD           dwRemotePort;
-    DWORD           dwState;
-    DWORD           dwOwningPid;
-} MIB_TCP6ROW_OWNER_PID, *PMIB_TCP6ROW_OWNER_PID;
-
-typedef struct _MIB_TCP6TABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_TCP6ROW_OWNER_PID   table[ANY_SIZE];
-} MIB_TCP6TABLE_OWNER_PID, *PMIB_TCP6TABLE_OWNER_PID;
-#endif
-
-#ifndef __IPHLPAPI_H__
-typedef struct in6_addr {
-    union {
-        UCHAR       Byte[16];
-        USHORT      Word[8];
-    } u;
-} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;
-
-
-typedef enum _UDP_TABLE_CLASS {
-    UDP_TABLE_BASIC,
-    UDP_TABLE_OWNER_PID,
-    UDP_TABLE_OWNER_MODULE
-} UDP_TABLE_CLASS, *PUDP_TABLE_CLASS;
-
-
-typedef struct _MIB_UDPROW_OWNER_PID {
-    DWORD dwLocalAddr;
-    DWORD dwLocalPort;
-    DWORD dwOwningPid;
-} MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID;
-
-typedef struct _MIB_UDPTABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_UDPROW_OWNER_PID    table[ANY_SIZE];
-} MIB_UDPTABLE_OWNER_PID, *PMIB_UDPTABLE_OWNER_PID;
-#endif
-/* end of mingw support */
-
-typedef struct _MIB_UDP6ROW_OWNER_PID {
-    UCHAR           ucLocalAddr[16];
-    DWORD           dwLocalScopeId;
-    DWORD           dwLocalPort;
-    DWORD           dwOwningPid;
-} MIB_UDP6ROW_OWNER_PID, *PMIB_UDP6ROW_OWNER_PID;
-
-typedef struct _MIB_UDP6TABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_UDP6ROW_OWNER_PID   table[ANY_SIZE];
-} MIB_UDP6TABLE_OWNER_PID, *PMIB_UDP6TABLE_OWNER_PID;
-
-
-/*
- * Return a list of network connections opened by a process
- */
-static PyObject*
-get_process_connections(PyObject* self, PyObject* args)
-{
-    static long null_address[4] = { 0, 0, 0, 0 };
-
-    unsigned long pid;
-    PyObject* connectionsList;
-    PyObject* connectionTuple;
-    typedef PSTR (NTAPI *_RtlIpv4AddressToStringA)(struct in_addr *,
-                                                   PSTR /* __out_ecount(16) */);
-    _RtlIpv4AddressToStringA rtlIpv4AddressToStringA;
-    typedef PSTR (NTAPI *_RtlIpv6AddressToStringA)(struct in6_addr *,
-                                                   PSTR /* __out_ecount(65) */);
-    _RtlIpv6AddressToStringA rtlIpv6AddressToStringA;
-    typedef DWORD (WINAPI *_GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG,
-                                                 TCP_TABLE_CLASS, ULONG);
-    _GetExtendedTcpTable getExtendedTcpTable;
-    typedef DWORD (WINAPI *_GetExtendedUdpTable)(PVOID, PDWORD, BOOL, ULONG,
-                                                 UDP_TABLE_CLASS, ULONG);
-    _GetExtendedUdpTable getExtendedUdpTable;
-    PVOID table;
-    DWORD tableSize;
-    PMIB_TCPTABLE_OWNER_PID tcp4Table;
-    PMIB_UDPTABLE_OWNER_PID udp4Table;
-    PMIB_TCP6TABLE_OWNER_PID tcp6Table;
-    PMIB_UDP6TABLE_OWNER_PID udp6Table;
-    ULONG i;
-    CHAR addressBufferLocal[65];
-    PyObject* addressTupleLocal;
-    CHAR addressBufferRemote[65];
-    PyObject* addressTupleRemote;
-
-    if (!PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (pid_is_running(pid) == 0) {
-        return NoSuchProcess();
-    }
-
-    /* Import some functions. */
-    {
-        HMODULE ntdll;
-        HMODULE iphlpapi;
-
-        ntdll = LoadLibrary(TEXT("ntdll.dll"));
-        rtlIpv4AddressToStringA = (_RtlIpv4AddressToStringA)GetProcAddress(ntdll,
-                                                     "RtlIpv4AddressToStringA");
-        rtlIpv6AddressToStringA = (_RtlIpv6AddressToStringA)GetProcAddress(ntdll,
-                                                     "RtlIpv6AddressToStringA");
-        /* TODO: Check these two function pointers */
-
-        iphlpapi = LoadLibrary(TEXT("iphlpapi.dll"));
-        getExtendedTcpTable = (_GetExtendedTcpTable)GetProcAddress(iphlpapi,
-                                                        "GetExtendedTcpTable");
-        getExtendedUdpTable = (_GetExtendedUdpTable)GetProcAddress(iphlpapi,
-                                                        "GetExtendedUdpTable");
-    }
-
-    if ((getExtendedTcpTable == NULL) || (getExtendedUdpTable == NULL)) {
-        PyErr_SetString(PyExc_NotImplementedError,
-                        "feature not supported on this Windows version");
-        return NULL;
-    }
-
-    connectionsList = PyList_New(0);
-
-    /* TCP IPv4 */
-
-    tableSize = 0;
-    getExtendedTcpTable(NULL, &tableSize, FALSE, AF_INET,
-                        TCP_TABLE_OWNER_PID_ALL, 0);
-
-    table = malloc(tableSize);
-
-    if (getExtendedTcpTable(table, &tableSize, FALSE, AF_INET,
-                            TCP_TABLE_OWNER_PID_ALL, 0) == 0)
-    {
-        tcp4Table = table;
-
-        for (i = 0; i < tcp4Table->dwNumEntries; i++)
-        {
-            if (tcp4Table->table[i].dwOwningPid != pid)
-                continue;
-
-            if (tcp4Table->table[i].dwLocalAddr != 0 ||
-                tcp4Table->table[i].dwLocalPort != 0)
-            {
-                struct in_addr addr;
-
-                addr.S_un.S_addr = tcp4Table->table[i].dwLocalAddr;
-                rtlIpv4AddressToStringA(&addr, addressBufferLocal);
-                addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                           BYTESWAP_USHORT(tcp4Table->table[i].dwLocalPort));
-            }
-            else
-            {
-                addressTupleLocal = PyTuple_New(0);
-            }
-
-            // On Windows <= XP, remote addr is filled even if socket
-            // is in LISTEN mode in which case we just ignore it.
-            if ((tcp4Table->table[i].dwRemoteAddr != 0 ||
-                 tcp4Table->table[i].dwRemotePort != 0) &&
-                (tcp4Table->table[i].dwState != MIB_TCP_STATE_LISTEN))
-            {
-                struct in_addr addr;
-
-                addr.S_un.S_addr = tcp4Table->table[i].dwRemoteAddr;
-                rtlIpv4AddressToStringA(&addr, addressBufferRemote);
-                addressTupleRemote = Py_BuildValue("(si)", addressBufferRemote,
-                        BYTESWAP_USHORT(tcp4Table->table[i].dwRemotePort));
-            }
-            else
-            {
-                addressTupleRemote = PyTuple_New(0);
-            }
-
-            connectionTuple = Py_BuildValue("(iiiNNs)",
-                -1,
-                AF_INET,
-                SOCK_STREAM,
-                addressTupleLocal,
-                addressTupleRemote,
-                state_to_string(tcp4Table->table[i].dwState)
-                );
-            PyList_Append(connectionsList, connectionTuple);
-        }
-    }
-
-    free(table);
-
-    /* TCP IPv6 */
-
-    tableSize = 0;
-    getExtendedTcpTable(NULL, &tableSize, FALSE, AF_INET6,
-                        TCP_TABLE_OWNER_PID_ALL, 0);
-
-    table = malloc(tableSize);
-
-    if (getExtendedTcpTable(table, &tableSize, FALSE, AF_INET6,
-                            TCP_TABLE_OWNER_PID_ALL, 0) == 0)
-    {
-        tcp6Table = table;
-
-        for (i = 0; i < tcp6Table->dwNumEntries; i++)
-        {
-            if (tcp6Table->table[i].dwOwningPid != pid) {
-                continue;
-            }
-
-            if (memcmp(tcp6Table->table[i].ucLocalAddr, null_address, 16) != 0 ||
-            tcp6Table->table[i].dwLocalPort != 0)
-            {
-                struct in6_addr addr;
-
-                memcpy(&addr, tcp6Table->table[i].ucLocalAddr, 16);
-                rtlIpv6AddressToStringA(&addr, addressBufferLocal);
-                addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                         BYTESWAP_USHORT(tcp6Table->table[i].dwLocalPort));
-            }
-            else
-            {
-                addressTupleLocal = PyTuple_New(0);
-            }
-
-            // On Windows <= XP, remote addr is filled even if socket
-            // is in LISTEN mode in which case we just ignore it.
-            if ((memcmp(tcp6Table->table[i].ucRemoteAddr, null_address, 16) != 0 ||
-                tcp6Table->table[i].dwRemotePort != 0) &&
-               (tcp6Table->table[i].dwState != MIB_TCP_STATE_LISTEN))
-            {
-                struct in6_addr addr;
-
-                memcpy(&addr, tcp6Table->table[i].ucRemoteAddr, 16);
-                rtlIpv6AddressToStringA(&addr, addressBufferRemote);
-                addressTupleRemote = Py_BuildValue("(si)", addressBufferRemote,
-                        BYTESWAP_USHORT(tcp6Table->table[i].dwRemotePort));
-            }
-            else
-            {
-                addressTupleRemote = PyTuple_New(0);
-            }
-
-            connectionTuple = Py_BuildValue("(iiiNNs)",
-                -1,
-                AF_INET6,
-                SOCK_STREAM,
-                addressTupleLocal,
-                addressTupleRemote,
-                state_to_string(tcp6Table->table[i].dwState)
-                );
-            PyList_Append(connectionsList, connectionTuple);
-        }
-    }
-
-    free(table);
-
-    /* UDP IPv4 */
-
-    tableSize = 0;
-    getExtendedUdpTable(NULL, &tableSize, FALSE, AF_INET,
-                        UDP_TABLE_OWNER_PID, 0);
-
-    table = malloc(tableSize);
-
-    if (getExtendedUdpTable(table, &tableSize, FALSE, AF_INET,
-                            UDP_TABLE_OWNER_PID, 0) == 0)
-    {
-        udp4Table = table;
-
-        for (i = 0; i < udp4Table->dwNumEntries; i++)
-        {
-            if (udp4Table->table[i].dwOwningPid != pid)
-                continue;
-
-            if (udp4Table->table[i].dwLocalAddr != 0 ||
-                udp4Table->table[i].dwLocalPort != 0)
-            {
-                struct in_addr addr;
-
-                addr.S_un.S_addr = udp4Table->table[i].dwLocalAddr;
-                rtlIpv4AddressToStringA(&addr, addressBufferLocal);
-                addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                            BYTESWAP_USHORT(udp4Table->table[i].dwLocalPort));
-            }
-            else
-            {
-                addressTupleLocal = PyTuple_New(0);
-            }
-
-            connectionTuple = Py_BuildValue("(iiiNNs)",
-                -1,
-                AF_INET,
-                SOCK_DGRAM,
-                addressTupleLocal,
-                PyTuple_New(0),
-                ""
-                );
-            PyList_Append(connectionsList, connectionTuple);
-        }
-    }
-
-    free(table);
-
-    /* UDP IPv6 */
-
-    tableSize = 0;
-    getExtendedUdpTable(NULL, &tableSize, FALSE, AF_INET6, UDP_TABLE_OWNER_PID, 0);
-
-    table = malloc(tableSize);
-
-    if (getExtendedUdpTable(table, &tableSize, FALSE, AF_INET6, UDP_TABLE_OWNER_PID, 0) == 0)
-    {
-        udp6Table = table;
-
-        for (i = 0; i < udp6Table->dwNumEntries; i++)
-        {
-            if (udp6Table->table[i].dwOwningPid != pid) {
-                continue;
-            }
-
-            if (memcmp(udp6Table->table[i].ucLocalAddr, null_address, 16) != 0 ||
-                udp6Table->table[i].dwLocalPort != 0)
-            {
-                struct in6_addr addr;
-
-                memcpy(&addr, udp6Table->table[i].ucLocalAddr, 16);
-                rtlIpv6AddressToStringA(&addr, addressBufferLocal);
-                addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                          BYTESWAP_USHORT(udp6Table->table[i].dwLocalPort));
-            }
-            else
-            {
-                addressTupleLocal = PyTuple_New(0);
-            }
-
-            connectionTuple = Py_BuildValue("(iiiNNs)",
-                -1,
-                AF_INET6,
-                SOCK_DGRAM,
-                addressTupleLocal,
-                PyTuple_New(0),
-                ""
-                );
-            PyList_Append(connectionsList, connectionTuple);
-        }
-    }
-
-    free(table);
-
-    return connectionsList;
-}
-
-
-/*
- * Get process priority as a Python integer.
- */
-static PyObject*
-get_process_priority(PyObject* self, PyObject* args)
-{
-    long pid;
-    DWORD priority;
-    HANDLE hProcess;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    priority = GetPriorityClass(hProcess);
-    if (priority == 0) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-    return Py_BuildValue("i", priority);
-}
-
-
-/*
- * Set process priority.
- */
-static PyObject*
-set_process_priority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    int retval;
-    HANDLE hProcess;
-    DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION;
-    if (! PyArg_ParseTuple(args, "li", &pid, &priority)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid_waccess(pid, dwDesiredAccess);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    retval = SetPriorityClass(hProcess, priority);
-    if (retval == 0) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Return a Python tuple referencing process I/O counters.
- */
-static PyObject*
-get_process_io_counters(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess;
-    IO_COUNTERS IoCounters;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (pid == 0) {
-        return AccessDenied();
-    }
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-    if (! GetProcessIoCounters(hProcess, &IoCounters)) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-    return Py_BuildValue("(KKKK)", IoCounters.ReadOperationCount,
-                                   IoCounters.WriteOperationCount,
-                                   IoCounters.ReadTransferCount,
-                                   IoCounters.WriteTransferCount);
-}
-
-
-/*
- * Return True if one of the process threads is in a waiting or
- * suspended status.
- */
-static PyObject*
-is_process_suspended(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    ULONG i;
-    PSYSTEM_PROCESS_INFORMATION process;
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if (get_process_info(pid, &process) != 1)
-        return NULL;
-    if (pid_is_running(pid) == 0)
-        return NoSuchProcess();
-
-    for (i = 0; i < process->NumberOfThreads; i++) {
-        if (process->Threads[i].ThreadState != Waiting ||
-            process->Threads[i].WaitReason != Suspended)
-        {
-            Py_RETURN_FALSE;
-        }
-    }
-    Py_RETURN_TRUE;
-}
-
-
-
-// ------------------------ Python init ---------------------------
-
-static PyMethodDef
-PsutilMethods[] =
-{
-    // --- per-process functions
-
-     {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-     {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-     {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-     {"kill_process", kill_process, METH_VARARGS,
-         "Kill the process identified by the given PID"},
-     {"get_process_cpu_times", get_process_cpu_times, METH_VARARGS,
-        "Return tuple of user/kern time for the given PID"},
-     {"get_process_create_time", get_process_create_time, METH_VARARGS,
-         "Return a float indicating the process create time expressed in "
-         "seconds since the epoch"},
-     {"get_memory_info", get_memory_info, METH_VARARGS,
-         "Return a tuple of RSS/VMS memory information"},
-    {"get_process_cwd", get_process_cwd, METH_VARARGS,
-        "Return process current working directory"},
-    {"suspend_process", suspend_process, METH_VARARGS,
-        "Suspend a process"},
-    {"resume_process", resume_process, METH_VARARGS,
-        "Resume a process"},
-    {"get_process_open_files", get_process_open_files, METH_VARARGS,
-        "Return files opened by process"},
-    {"_QueryDosDevice", _QueryDosDevice, METH_VARARGS,
-        "QueryDosDevice binding"},
-    {"get_process_username", get_process_username, METH_VARARGS,
-        "Return the username of a process"},
-    {"get_process_connections", get_process_connections, METH_VARARGS,
-        "Return the network connections of a process"},
-    {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-        "Return the network connections of a process"},
-    {"get_process_threads", get_process_threads, METH_VARARGS,
-        "Return process threads information as a list of tuple"},
-    {"process_wait", process_wait, METH_VARARGS,
-        "Wait for process to terminate and return its exit code."},
-    {"get_process_priority", get_process_priority, METH_VARARGS,
-        "Return process priority."},
-    {"set_process_priority", set_process_priority, METH_VARARGS,
-        "Set process priority."},
-    {"get_process_io_counters", get_process_io_counters, METH_VARARGS,
-        "Get process I/O counters."},
-    {"is_process_suspended", is_process_suspended, METH_VARARGS,
-        "Return True if one of the process threads is in a suspended state"},
-
-
-    // --- system-related functions
-
-     {"get_pid_list", get_pid_list, METH_VARARGS,
-        "Returns a list of PIDs currently running on the system"},
-     {"pid_exists", pid_exists, METH_VARARGS,
-         "Determine if the process exists in the current process list."},
-     {"get_num_cpus", get_num_cpus, METH_VARARGS,
-         "Returns the number of CPUs on the system"},
-     {"get_system_uptime", get_system_uptime, METH_VARARGS,
-         "Return system uptime"},
-     {"get_total_phymem", get_total_phymem, METH_VARARGS,
-         "Return the total amount of physical memory, in bytes"},
-     {"get_total_virtmem", get_total_virtmem, METH_VARARGS,
-         "Return the total amount of virtual memory, in bytes"},
-     {"get_avail_phymem", get_avail_phymem, METH_VARARGS,
-         "Return the amount of available physical memory, in bytes"},
-     {"get_avail_virtmem", get_avail_virtmem, METH_VARARGS,
-         "Return the amount of available virtual memory, in bytes"},
-     {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-         "Return system cpu times as a tuple (user, system, idle)"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-    #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-    #define GETSTATE(m) (&_state)
-    static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-    static int psutil_mswindows_traverse(PyObject *m, visitproc visit, void *arg) {
-        Py_VISIT(GETSTATE(m)->error);
-        return 0;
-    }
-
-    static int psutil_mswindows_clear(PyObject *m) {
-        Py_CLEAR(GETSTATE(m)->error);
-        return 0;
-    }
-
-    static struct PyModuleDef moduledef = {
-            PyModuleDef_HEAD_INIT,
-            "psutil_mswindows",
-            NULL,
-            sizeof(struct module_state),
-            PsutilMethods,
-            NULL,
-            psutil_mswindows_traverse,
-            psutil_mswindows_clear,
-            NULL
-    };
-
-#define INITERROR return NULL
-
-    PyObject* PyInit__psutil_mswindows(void)
-
-#else
-    #define INITERROR return
-    void init_psutil_mswindows(void)
-#endif
-{
-    struct module_state *st = NULL;
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_mswindows", PsutilMethods);
-#endif
-
-    if (module == NULL) {
-        INITERROR;
-    }
-
-    st = GETSTATE(module);
-    st->error = PyErr_NewException("_psutil_mswindow.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-
-    // Public constants
-    // http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx
-    PyModule_AddIntConstant(module, "ABOVE_NORMAL_PRIORITY_CLASS",
-                                     ABOVE_NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "BELOW_NORMAL_PRIORITY_CLASS",
-                                     BELOW_NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "HIGH_PRIORITY_CLASS",
-                                     HIGH_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "IDLE_PRIORITY_CLASS",
-                                     IDLE_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "NORMAL_PRIORITY_CLASS",
-                                     NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "REALTIME_PRIORITY_CLASS",
-                                     REALTIME_PRIORITY_CLASS);
-    SetSeDebug();
-
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
-
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_mswindows.h b/contrib/psutil-0.2.1/psutil/_psutil_mswindows.h
deleted file mode 100644
index dc9c72f..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_mswindows.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * $Id: _psutil_mswindows.h 930 2011-02-22 03:45:38Z g.rodola $
- *
- * Windows platform-specific module methods for _psutil_mswindows
- *
- */
-
-#include <Python.h>
-#include <windows.h>
-
-// --- per-process functions
-
-static PyObject* kill_process(PyObject* self, PyObject* args);
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_cwd(PyObject* self, PyObject* args);
-static PyObject* suspend_process(PyObject* self, PyObject* args);
-static PyObject* resume_process(PyObject* self, PyObject* args);
-static PyObject* get_process_open_files(PyObject* self, PyObject* args);
-static PyObject* get_process_username(PyObject* self, PyObject* args);
-static PyObject* get_process_connections(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* process_wait(PyObject* self, PyObject* args);
-static PyObject* get_process_priority(PyObject* self, PyObject* args);
-static PyObject* set_process_priority(PyObject* self, PyObject* args);
-static PyObject* get_process_io_counters(PyObject* self, PyObject* args);
-static PyObject* is_process_suspended(PyObject* self, PyObject* args);
-
-// --- system-related functions
-
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_system_uptime(PyObject* self, PyObject* args);
-static PyObject* get_total_phymem(PyObject* self, PyObject* args);
-static PyObject* get_total_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_avail_phymem(PyObject* self, PyObject* args);
-static PyObject* get_avail_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-static PyObject* _QueryDosDevice(PyObject* self, PyObject* args);
-static PyObject* pid_exists(PyObject* self, PyObject* args);
-
-// --- others
-
-int suspend_resume_process(DWORD pid, int suspend);
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_osx.c b/contrib/psutil-0.2.1/psutil/_psutil_osx.c
deleted file mode 100644
index 5e24eb1..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_osx.c
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*
- * $Id: _psutil_osx.c 940 2011-02-24 19:19:58Z g.rodola $
- *
- * OS X platform-specific module methods for _psutil_osx
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/sysctl.h>
-#include <sys/vmmeter.h>
-#include <libproc.h>
-#include <sys/proc_info.h>
-#include <netinet/tcp_fsm.h>
-#include <arpa/inet.h>
-
-#include <mach/mach.h>
-#include <mach/task.h>
-#include <mach/mach_init.h>
-#include <mach/host_info.h>
-#include <mach/mach_host.h>
-#include <mach/mach_traps.h>
-#include <mach/shared_memory_server.h>
-
-#include "_psutil_osx.h"
-#include "_psutil_common.h"
-#include "arch/osx/process_info.h"
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    kinfo_proc *proclist = NULL;
-    kinfo_proc *orig_address = NULL;
-    size_t num_processes;
-    size_t idx;
-    PyObject *pid;
-    PyObject *retlist = PyList_New(0);
-
-    if (get_proc_list(&proclist, &num_processes) != 0) {
-        Py_DECREF(retlist);
-        PyErr_SetString(PyExc_RuntimeError, "failed to retrieve process list.");
-        return NULL;
-    }
-
-    if (num_processes > 0) {
-        // save the address of proclist so we can free it later
-        orig_address = proclist;
-        for (idx=0; idx < num_processes; idx++) {
-            pid = Py_BuildValue("i", proclist->kp_proc.p_pid);
-            PyList_Append(retlist, pid);
-            Py_XDECREF(pid);
-            proclist++;
-        }
-    }
-    free(orig_address);
-    return retlist;
-}
-
-
-/*
- * Return process name from kinfo_proc as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("s", kp.kp_proc.p_comm);
-}
-
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args)
-{
-    long pid;
-    PyObject* arglist = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // get the commandline, defined in arch/osx/process_info.c
-    arglist = get_arg_list(pid);
-    return arglist;
-}
-
-
-/*
- * Return process parent pid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.kp_eproc.e_ppid);
-}
-
-
-/*
- * Return process real uid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_uids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.kp_eproc.e_pcred.p_ruid,
-                                (long)kp.kp_eproc.e_ucred.cr_uid,
-                                (long)kp.kp_eproc.e_pcred.p_svuid);
-}
-
-
-/*
- * Return process real group id from ki_comm as a Python integer.
- */
-static PyObject*
-get_process_gids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.kp_eproc.e_pcred.p_rgid,
-                                (long)kp.kp_eproc.e_ucred.cr_groups[0],
-                                (long)kp.kp_eproc.e_pcred.p_svgid);
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system.
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-
-    int mib[2];
-    int ncpu;
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_NCPU;
-    len = sizeof(ncpu);
-
-    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("i", ncpu);
-}
-
-
-#define TV2DOUBLE(t)    ((t).tv_sec + (t).tv_usec / 1000000.0)
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_cpu_times(PyObject* self, PyObject* args)
-{
-    long pid;
-    int err;
-    unsigned int info_count = TASK_BASIC_INFO_COUNT;
-    task_port_t task;  // = (task_port_t)NULL;
-    time_value_t user_time, system_time;
-    struct task_basic_info tasks_info;
-    struct task_thread_times_info task_times;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    /*  task_for_pid() requires special privileges
-     * "This function can be called only if the process is owned by the
-     * procmod group or if the caller is root."
-     * - http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_19.html  */
-    err = task_for_pid(mach_task_self(), pid, &task);
-    if ( err == KERN_SUCCESS) {
-        info_count = TASK_BASIC_INFO_COUNT;
-        err = task_info(task, TASK_BASIC_INFO, (task_info_t)&tasks_info, &info_count);
-        if (err != KERN_SUCCESS) {
-                // errcode 4 is "invalid argument" (access denied)
-                if (err == 4) {
-                    return AccessDenied();
-                }
-
-                // otherwise throw a runtime error with appropriate error code
-                return PyErr_Format(PyExc_RuntimeError,
-                                   "task_info(TASK_BASIC_INFO) failed");
-        }
-
-        info_count = TASK_THREAD_TIMES_INFO_COUNT;
-        err = task_info(task, TASK_THREAD_TIMES_INFO,
-                        (task_info_t)&task_times, &info_count);
-        if (err != KERN_SUCCESS) {
-                // errcode 4 is "invalid argument" (access denied)
-                if (err == 4) {
-                    return AccessDenied();
-                }
-                return PyErr_Format(PyExc_RuntimeError,
-                                   "task_info(TASK_BASIC_INFO) failed");
-        }
-    }
-
-    else { // task_for_pid failed
-        if (! pid_exists(pid) ) {
-            return NoSuchProcess();
-        }
-        // pid exists, so return AccessDenied error since task_for_pid() failed
-        return AccessDenied();
-    }
-
-    float user_t = -1.0;
-    float sys_t = -1.0;
-    user_time = tasks_info.user_time;
-    system_time = tasks_info.system_time;
-
-    time_value_add(&user_time, &task_times.user_time);
-    time_value_add(&system_time, &task_times.system_time);
-
-    user_t = (float)user_time.seconds + ((float)user_time.microseconds / 1000000.0);
-    sys_t = (float)system_time.seconds + ((float)system_time.microseconds / 1000000.0);
-    return Py_BuildValue("(dd)", user_t, sys_t);
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("d", TV2DOUBLE(kp.kp_proc.p_starttime));
-}
-
-
-/*
- * Return a tuple of RSS and VMS memory usage.
- */
-static PyObject*
-get_memory_info(PyObject* self, PyObject* args)
-{
-    long pid;
-    int err;
-    unsigned int info_count = TASK_BASIC_INFO_COUNT;
-    mach_port_t task;
-    struct task_basic_info tasks_info;
-    vm_region_basic_info_data_64_t  b_info;
-    vm_address_t address = GLOBAL_SHARED_TEXT_SEGMENT;
-    vm_size_t size;
-    mach_port_t object_name;
-
-    // the argument passed should be a process id
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    /* task_for_pid() requires special privileges
-     * "This function can be called only if the process is owned by the
-     * procmod group or if the caller is root."
-     * - http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_19.html */
-    err = task_for_pid(mach_task_self(), pid, &task);
-    if ( err == KERN_SUCCESS) {
-        info_count = TASK_BASIC_INFO_COUNT;
-        err = task_info(task, TASK_BASIC_INFO, (task_info_t)&tasks_info, &info_count);
-        if (err != KERN_SUCCESS) {
-                if (err == 4) {
-                    // errcode 4 is "invalid argument" (access denied)
-                    return AccessDenied();
-                }
-                // otherwise throw a runtime error with appropriate error code
-                return PyErr_Format(PyExc_RuntimeError,
-                                    "task_info(TASK_BASIC_INFO) failed");
-        }
-
-        /* Issue #73 http://code.google.com/p/psutil/issues/detail?id=73
-         * adjust the virtual memory size down to account for
-         * shared memory that task_info.virtual_size includes w/every process
-         */
-        info_count = VM_REGION_BASIC_INFO_COUNT_64;
-        err = vm_region_64(task, &address, &size, VM_REGION_BASIC_INFO,
-            (vm_region_info_t)&b_info, &info_count, &object_name);
-        if (err == KERN_SUCCESS) {
-            if (b_info.reserved && size == (SHARED_TEXT_REGION_SIZE) &&
-                tasks_info.virtual_size > (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE))
-            {
-                tasks_info.virtual_size -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
-            }
-        }
-    }
-
-    else {
-        if (! pid_exists(pid) ) {
-            return NoSuchProcess();
-        }
-
-        // pid exists, so return AccessDenied error since task_for_pid() failed
-        return AccessDenied();
-    }
-
-    return Py_BuildValue("(ll)", tasks_info.resident_size, tasks_info.virtual_size);
-}
-
-
-/*
- * Return number of threads used by process as a Python integer.
- */
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int err;
-    unsigned int info_count = TASK_BASIC_INFO_COUNT;
-    mach_port_t task;
-    struct task_basic_info tasks_info;
-    thread_act_port_array_t thread_list;
-    mach_msg_type_number_t thread_count;
-
-    // the argument passed should be a process id
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    /* task_for_pid() requires special privileges
-     * "This function can be called only if the process is owned by the
-     * procmod group or if the caller is root."
-     * - http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_19.html
-     */
-    err = task_for_pid(mach_task_self(), pid, &task);
-    if ( err == KERN_SUCCESS) {
-        info_count = TASK_BASIC_INFO_COUNT;
-        err = task_info(task, TASK_BASIC_INFO, (task_info_t)&tasks_info, &info_count);
-        if (err != KERN_SUCCESS) {
-                // errcode 4 is "invalid argument" (access denied)
-                if (err == 4) {
-                    return AccessDenied();
-                }
-
-                // otherwise throw a runtime error with appropriate error code
-                return PyErr_Format(PyExc_RuntimeError,
-                                    "task_info(TASK_BASIC_INFO) failed");
-        }
-
-        err = task_threads(task, &thread_list, &thread_count);
-        if (err == KERN_SUCCESS) {
-            return Py_BuildValue("l", (long)thread_count);
-        }
-    }
-
-
-    else {
-        if (! pid_exists(pid) ) {
-            return NoSuchProcess();
-        }
-
-        // pid exists, so return AccessDenied error since task_for_pid() failed
-        return AccessDenied();
-    }
-    return NULL;
-}
-
-
-/*
- * Return a Python integer indicating the total amount of physical memory
- * in bytes.
- */
-static PyObject*
-get_total_phymem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    uint64_t total_phymem;
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_MEMSIZE;
-    len = sizeof(total_phymem);
-
-    if (sysctl(mib, 2, &total_phymem, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    return Py_BuildValue("L", total_phymem);
-}
-
-
-/*
- * Return a Python long indicating the amount of available physical memory in
- * bytes.
- */
-static PyObject*
-get_avail_phymem(PyObject* self, PyObject* args)
-{
-    vm_statistics_data_t vm_stat;
-    mach_msg_type_number_t count;
-    kern_return_t error;
-    unsigned long long mem_free;
-    int pagesize = getpagesize();
-    mach_port_t mport = mach_host_self();
-
-    count = sizeof(vm_stat) / sizeof(natural_t);
-    error = host_statistics(mport, HOST_VM_INFO, (host_info_t)&vm_stat, &count);
-
-    if (error != KERN_SUCCESS) {
-        return PyErr_Format(PyExc_RuntimeError,
-                    "Error in host_statistics(): %s", mach_error_string(error));
-    }
-
-    mem_free = (unsigned long long) vm_stat.free_count * pagesize;
-    return Py_BuildValue("L", mem_free);
-}
-
-
-/*
- * Return a Python integer indicating the total amount of virtual memory
- * in bytes.
- */
-static PyObject*
-get_total_virtmem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    size_t size;
-    struct xsw_usage totals;
-
-    mib[0] = CTL_VM;
-    mib[1] = VM_SWAPUSAGE;
-    size = sizeof(totals);
-
-    if (sysctl(mib, 2, &totals, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-     }
-
-    return Py_BuildValue("L", totals.xsu_total);
-}
-
-/*
- * Return a Python integer indicating the avail amount of virtual memory
- * in bytes.
- */
-static PyObject*
-get_avail_virtmem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    size_t size;
-    struct xsw_usage totals;
-
-    mib[0] = CTL_VM;
-    mib[1] = VM_SWAPUSAGE;
-    size = sizeof(totals);
-
-    if (sysctl(mib, 2, &totals, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-     }
-
-    return Py_BuildValue("L", totals.xsu_avail);
-}
-
-/*
- * Return a Python tuple representing user, kernel and idle CPU times
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    mach_msg_type_number_t  count = HOST_CPU_LOAD_INFO_COUNT;
-    kern_return_t error;
-    host_cpu_load_info_data_t r_load;
-
-    error = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&r_load, &count);
-    if (error != KERN_SUCCESS) {
-        return PyErr_Format(PyExc_RuntimeError,
-                "Error in host_statistics(): %s", mach_error_string(error));
-    }
-
-    return Py_BuildValue("(dddd)",
-                         (double)r_load.cpu_ticks[CPU_STATE_USER] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_NICE] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_SYSTEM] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_IDLE] / CLK_TCK
-                         );
-}
-
-
-/*
- * Return a Python float indicating the system boot time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_system_boot_time(PyObject* self, PyObject* args)
-{
-    /* fetch sysctl "kern.boottime" */
-    static int request[2] = { CTL_KERN, KERN_BOOTTIME };
-    struct timeval result;
-    size_t result_len = sizeof result;
-    time_t boot_time = 0;
-
-    if (sysctl(request, 2, &result, &result_len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    boot_time = result.tv_sec;
-    return Py_BuildValue("f", (float)boot_time);
-}
-
-
-/*
- * Return process status as a Python integer.
- */
-static PyObject*
-get_process_status(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", (int)kp.kp_proc.p_stat);
-}
-
-
-/*
- * Return process threads
- */
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int err, j;
-    kern_return_t kr;
-    unsigned int info_count = TASK_BASIC_INFO_COUNT;
-    mach_port_t task;
-    struct task_basic_info tasks_info;
-    thread_act_port_array_t thread_list;
-    thread_info_data_t thinfo;
-    thread_basic_info_t basic_info_th;
-    mach_msg_type_number_t thread_count, thread_info_count;
-
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-
-    // the argument passed should be a process id
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // task_for_pid() requires special privileges
-    err = task_for_pid(mach_task_self(), pid, &task);
-    if (err != KERN_SUCCESS) {
-        if (! pid_exists(pid) ) {
-            return NoSuchProcess();
-        }
-        return AccessDenied();
-    }
-
-    info_count = TASK_BASIC_INFO_COUNT;
-    err = task_info(task, TASK_BASIC_INFO, (task_info_t)&tasks_info, &info_count);
-    if (err != KERN_SUCCESS) {
-        // errcode 4 is "invalid argument" (access denied)
-        if (err == 4) {
-            return AccessDenied();
-        }
-        // otherwise throw a runtime error with appropriate error code
-        return PyErr_Format(PyExc_RuntimeError,
-                            "task_info(TASK_BASIC_INFO) failed");
-    }
-
-    err = task_threads(task, &thread_list, &thread_count);
-    if (err != KERN_SUCCESS) {
-        return PyErr_Format(PyExc_RuntimeError, "task_threads() failed");
-    }
-
-    for (j = 0; j < thread_count; j++) {
-        thread_info_count = THREAD_INFO_MAX;
-        kr = thread_info(thread_list[j], THREAD_BASIC_INFO,
-                         (thread_info_t)thinfo, &thread_info_count);
-        if (kr != KERN_SUCCESS) {
-            return PyErr_Format(PyExc_RuntimeError, "thread_info() failed");
-        }
-        basic_info_th = (thread_basic_info_t)thinfo;
-        // XXX - thread_info structure does not provide any process id;
-        // the best we can do is assigning an incremental bogus value
-        pyTuple = Py_BuildValue("Iff", j + 1,
-                    (float)basic_info_th->user_time.microseconds / 1000000.0,
-                    (float)basic_info_th->system_time.microseconds / 1000000.0
-                  );
-        PyList_Append(retList, pyTuple);
-        Py_XDECREF(pyTuple);
-    }
-
-    return retList;
-}
-
-
-/*
- * Return process open files as a Python tuple.
- * References:
- * - lsof source code: http://goo.gl/SYW79 and http://goo.gl/m78fd
- * - /usr/include/sys/proc_info.h
- */
-static PyObject*
-get_process_open_files(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pidinfo_result;
-    int iterations;
-    int i;
-    int nb;
-
-    struct proc_fdinfo *fds_pointer;
-    struct proc_fdinfo *fdp_pointer;
-    struct vnode_fdinfowithpath vi;
-
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    fds_pointer = malloc(pidinfo_result);
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer,
-                                  pidinfo_result);
-    free(fds_pointer);
-
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    iterations = (pidinfo_result / PROC_PIDLISTFD_SIZE);
-
-    for (i = 0; i < iterations; i++) {
-        fdp_pointer = &fds_pointer[i];
-
-        //
-        if (fdp_pointer->proc_fdtype == PROX_FDTYPE_VNODE)
-        {
-            nb = proc_pidfdinfo(pid,
-                                fdp_pointer->proc_fd,
-                                PROC_PIDFDVNODEPATHINFO,
-                                &vi,
-                                sizeof(vi));
-
-            // --- errors checking
-            if (nb <= 0) {
-                if ((errno == ENOENT) || (errno == EBADF)) {
-                    // no such file or directory or bad file descriptor;
-                    // let's assume the file has been closed or removed
-                    continue;
-                }
-                if (errno != 0) {
-                    return PyErr_SetFromErrno(PyExc_OSError);
-                }
-                else
-                    return PyErr_Format(PyExc_RuntimeError,
-                                "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed");
-            }
-            if (nb < sizeof(vi)) {
-                return PyErr_Format(PyExc_RuntimeError,
-                 "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed (buffer mismatch)");
-            }
-            // --- /errors checking
-
-            // --- construct python list
-            tuple = Py_BuildValue("(si)", vi.pvip.vip_path,
-                                          (int)fdp_pointer->proc_fd);
-            PyList_Append(retList, tuple);
-            Py_DECREF(tuple);
-            // --- /construct python list
-        }
-    }
-
-    return retList;
-
-error:
-    if (errno != 0)
-        return PyErr_SetFromErrno(PyExc_OSError);
-    else if (! pid_exists(pid) )
-        return NoSuchProcess();
-    else
-        return PyErr_Format(PyExc_RuntimeError,
-                            "proc_pidinfo(PROC_PIDLISTFDS) failed");
-}
-
-
-/*
- * mathes Linux net/tcp_states.h:
- * http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
- */
-static char *
-get_connection_status(int st) {
-    switch (st) {
-        case TCPS_CLOSED:
-            return "CLOSE";
-        case TCPS_CLOSING:
-            return "CLOSING";
-        case TCPS_CLOSE_WAIT:
-            return "CLOSE_WAIT";
-        case TCPS_LISTEN:
-            return "LISTEN";
-        case TCPS_ESTABLISHED:
-            return "ESTABLISHED";
-        case TCPS_SYN_SENT:
-            return "SYN_SENT";
-        case TCPS_SYN_RECEIVED:
-            return "SYN_RECV";
-        case TCPS_FIN_WAIT_1:
-            return "FIN_WAIT_1";
-        case TCPS_FIN_WAIT_2:
-            return "FIN_WAIT_2";
-        case TCPS_LAST_ACK:
-            return "LAST_ACK";
-        case TCPS_TIME_WAIT:
-            return "TIME_WAIT";
-        default:
-            return "";
-    }
-}
-
-
-/*
- * Return process TCP and UDP connections as a list of tuples.
- * References:
- * - lsof source code: http://goo.gl/SYW79 and http://goo.gl/wNrC0
- * - /usr/include/sys/proc_info.h
- */
-static PyObject*
-get_process_connections(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pidinfo_result;
-    int iterations;
-    int i;
-    int nb;
-
-    struct proc_fdinfo *fds_pointer;
-    struct proc_fdinfo *fdp_pointer;
-    struct socket_fdinfo si;
-
-
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-    PyObject *laddr = NULL;
-    PyObject *raddr = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    fds_pointer = malloc(pidinfo_result);
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer,
-                                  pidinfo_result);
-    free(fds_pointer);
-
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    iterations = (pidinfo_result / PROC_PIDLISTFD_SIZE);
-
-    for (i = 0; i < iterations; i++) {
-        errno = 0;
-        fdp_pointer = &fds_pointer[i];
-
-        //
-        if (fdp_pointer->proc_fdtype == PROX_FDTYPE_SOCKET)
-        {
-            nb = proc_pidfdinfo(pid, fdp_pointer->proc_fd, PROC_PIDFDSOCKETINFO,
-                                &si, sizeof(si));
-
-            // --- errors checking
-            if (nb <= 0) {
-                if (errno == EBADF) {
-                    // let's assume socket has been closed
-                    continue;
-                }
-                if (errno != 0) {
-                    return PyErr_SetFromErrno(PyExc_OSError);
-                }
-                else {
-                    return PyErr_Format(PyExc_RuntimeError,
-                                "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed");
-                }
-            }
-            if (nb < sizeof(si)) {
-                return PyErr_Format(PyExc_RuntimeError,
-                 "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed (buffer mismatch)");
-            }
-            // --- /errors checking
-
-            //
-            int fd, family, type, lport, rport;
-            char lip[200], rip[200];
-            char *state;
-
-            fd = (int)fdp_pointer->proc_fd;
-            family = si.psi.soi_family;
-            type = si.psi.soi_kind;
-
-            if ((family != AF_INET) && (family != AF_INET6)) {
-                continue;
-            }
-
-            if (type == 2)
-                type = SOCK_STREAM;
-            else if (type == 1)
-                type = SOCK_DGRAM;
-            else
-                continue;
-
-            if (errno != 0) {
-                printf("errno 1 = %i\n", errno);
-                return PyErr_SetFromErrno(PyExc_OSError);
-            }
-
-
-            if (family == AF_INET) {
-                inet_ntop(AF_INET,
-                          &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_46.i46a_addr4,
-                          lip,
-                          sizeof(lip));
-                inet_ntop(AF_INET,
-                          &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_46.i46a_addr4,
-                          rip,
-                          sizeof(lip));
-            }
-            else {
-                inet_ntop(AF_INET6,
-                          &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_6,
-                          lip, sizeof(lip));
-                inet_ntop(AF_INET6,
-                          &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_6,
-                          lip, sizeof(rip));
-            }
-
-            // check for inet_ntop failures
-            if (errno != 0) {
-                return PyErr_SetFromErrno(PyExc_OSError);
-            }
-
-            lport = ntohs(si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport);
-            rport = ntohs(si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_fport);
-            if (type == SOCK_STREAM)
-                state = get_connection_status((int)si.psi.soi_proto.pri_tcp.tcpsi_state);
-            else
-                state = "";
-
-            laddr = Py_BuildValue("(si)", lip, lport);
-            if (rport != 0)
-                raddr = Py_BuildValue("(si)", rip, rport);
-            else
-                raddr = PyTuple_New(0);
-
-            // --- construct python list
-            tuple = Py_BuildValue("(iiiNNs)", fd, family, type, laddr, raddr,
-                                              state);
-            PyList_Append(retList, tuple);
-            Py_DECREF(tuple);
-            // --- /construct python list
-        }
-    }
-
-    return retList;
-
-error:
-    if (errno != 0)
-        return PyErr_SetFromErrno(PyExc_OSError);
-    else if (! pid_exists(pid) )
-        return NoSuchProcess();
-    else
-        return PyErr_Format(PyExc_RuntimeError,
-                            "proc_pidinfo(PROC_PIDLISTFDS) failed");
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     // --- per-process functions
-
-     {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-     {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-     {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-     {"get_process_uids", get_process_uids, METH_VARARGS,
-        "Return process real user id as an integer"},
-     {"get_process_gids", get_process_gids, METH_VARARGS,
-        "Return process real group id as an integer"},
-     {"get_cpu_times", get_cpu_times, METH_VARARGS,
-           "Return tuple of user/kern time for the given PID"},
-     {"get_process_create_time", get_process_create_time, METH_VARARGS,
-         "Return a float indicating the process create time expressed in "
-         "seconds since the epoch"},
-     {"get_memory_info", get_memory_info, METH_VARARGS,
-         "Return a tuple of RSS/VMS memory information"},
-     {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-         "Return number of threads used by process"},
-     {"get_process_status", get_process_status, METH_VARARGS,
-         "Return process status as an integer"},
-     {"get_process_threads", get_process_threads, METH_VARARGS,
-         "Return process threads as a list of tuples"},
-     {"get_process_open_files", get_process_open_files, METH_VARARGS,
-         "Return files opened by process as a list of tuples"},
-     {"get_process_connections", get_process_connections, METH_VARARGS,
-         "Get process TCP and UDP connections as a list of tuples"},
-
-
-     // --- system-related functions
-
-     {"get_pid_list", get_pid_list, METH_VARARGS,
-         "Returns a list of PIDs currently running on the system"},
-     {"get_num_cpus", get_num_cpus, METH_VARARGS,
-           "Return number of CPUs on the system"},
-     {"get_total_phymem", get_total_phymem, METH_VARARGS,
-         "Return the total amount of physical memory, in bytes"},
-     {"get_avail_phymem", get_avail_phymem, METH_VARARGS,
-         "Return the amount of available physical memory, in bytes"},
-     {"get_total_virtmem", get_total_virtmem, METH_VARARGS,
-         "Return the total amount of virtual memory, in bytes"},
-     {"get_avail_virtmem", get_avail_virtmem, METH_VARARGS,
-         "Return the amount of available virtual memory, in bytes"},
-     {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-         "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
-     {"get_system_boot_time", get_system_boot_time, METH_VARARGS,
-         "Return a float indicating the system boot time expressed in "
-         "seconds since the epoch"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_osx_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_osx_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-
-static struct PyModuleDef
-moduledef = {
-    PyModuleDef_HEAD_INIT,
-    "psutil_osx",
-    NULL,
-    sizeof(struct module_state),
-    PsutilMethods,
-    NULL,
-    psutil_osx_traverse,
-    psutil_osx_clear,
-    NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_osx(void)
-
-#else
-#define INITERROR return
-
-void
-init_psutil_osx(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_osx", PsutilMethods);
-#endif
-    // process status constants, defined in:
-    // http://fxr.watson.org/fxr/source/bsd/sys/proc.h?v=xnu-792.6.70#L149
-    PyModule_AddIntConstant(module, "SIDL", SIDL);
-    PyModule_AddIntConstant(module, "SRUN", SRUN);
-    PyModule_AddIntConstant(module, "SSLEEP", SSLEEP);
-    PyModule_AddIntConstant(module, "SSTOP", SSTOP);
-    PyModule_AddIntConstant(module, "SZOMB", SZOMB);
-
-    if (module == NULL) {
-        INITERROR;
-    }
-    struct module_state *st = GETSTATE(module);
-
-    st->error = PyErr_NewException("_psutil_osx.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_osx.h b/contrib/psutil-0.2.1/psutil/_psutil_osx.h
deleted file mode 100644
index 429dc18..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_osx.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * $Id: _psutil_osx.h 940 2011-02-24 19:19:58Z g.rodola $
- *
- * OS X platform-specific module methods for _psutil_osx
- */
-
-#include <Python.h>
-
-// --- per-process functions
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_uids(PyObject* self, PyObject* args);
-static PyObject* get_process_gids(PyObject* self, PyObject* args);
-static PyObject* get_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_status(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_open_files(PyObject* self, PyObject* args);
-static PyObject* get_process_connections(PyObject* self, PyObject* args);
-
-// --- system-related functions
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_total_phymem(PyObject* self, PyObject* args);
-static PyObject* get_avail_phymem(PyObject* self, PyObject* args);
-static PyObject* get_total_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_avail_virtmem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_system_boot_time(PyObject* self, PyObject* args);
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_posix.c b/contrib/psutil-0.2.1/psutil/_psutil_posix.c
deleted file mode 100644
index e127176..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_posix.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * $Id: _psutil_posix.c 857 2010-12-25 21:21:07Z g.rodola $
- *
- * Functions specific to all POSIX compliant platforms.
- */
-
-#include <Python.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/resource.h>
-
-#include "_psutil_posix.h"
-
-
-/*
- * Given a PID return process priority as a Python integer.
- */
-static PyObject*
-posix_getpriority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    errno = 0;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    priority = getpriority(PRIO_PROCESS, pid);
-    if (errno != 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("i", priority);
-}
-
-/*
- * Given a PID and a value change process priority.
- */
-static PyObject*
-posix_setpriority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    int retval;
-    if (! PyArg_ParseTuple(args, "li", &pid, &priority)) {
-        return NULL;
-    }
-    retval = setpriority(PRIO_PROCESS, pid, priority);
-    if (retval == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     {"getpriority", posix_getpriority, METH_VARARGS,
-        "Return process priority"},
-     {"setpriority", posix_setpriority, METH_VARARGS,
-        "Set process priority"},
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_posix_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_posix_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_posix",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_posix_traverse,
-        psutil_posix_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_posix(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_posix(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_posix", PsutilMethods);
-#endif
-    if (module == NULL) {
-        INITERROR;
-    }
-    struct module_state *st = GETSTATE(module);
-
-    st->error = PyErr_NewException("_psutil_posix.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
-
-
diff --git a/contrib/psutil-0.2.1/psutil/_psutil_posix.h b/contrib/psutil-0.2.1/psutil/_psutil_posix.h
deleted file mode 100644
index 8d73e52..0000000
--- a/contrib/psutil-0.2.1/psutil/_psutil_posix.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * $Id: _psutil_posix.h 857 2010-12-25 21:21:07Z g.rodola $
- *
- * POSIX specific module methods for _psutil_posix
- */
-
-#include <Python.h>
-
-static PyObject* posix_getpriority(PyObject* self, PyObject* args);
-static PyObject* posix_setpriority(PyObject* self, PyObject* args);
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.c b/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.c
deleted file mode 100644
index 48a6d77..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * $Id: process_info.c 828 2010-11-20 20:52:07Z g.rodola $
- *
- * Helper functions related to fetching process information. Used by _psutil_bsd
- * module methods.
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <sys/proc.h>
-
-#include "process_info.h"
-
-
-/*
- * Returns a list of all BSD processes on the system.  This routine
- * allocates the list and puts it in *procList and a count of the
- * number of entries in *procCount.  You are responsible for freeing
- * this list (use "free" from System framework).
- * On success, the function returns 0.
- * On error, the function returns a BSD errno value.
- */
-int
-get_proc_list(struct kinfo_proc **procList, size_t *procCount)
-{
-    int err;
-    struct kinfo_proc * result;
-    int done;
-    static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PROC, 0 };
-    // Declaring name as const requires us to cast it when passing it to
-    // sysctl because the prototype doesn't include the const modifier.
-    size_t              length;
-
-    assert( procList != NULL);
-    assert(*procList == NULL);
-    assert(procCount != NULL);
-
-    *procCount = 0;
-
-    /*
-     * We start by calling sysctl with result == NULL and length == 0.
-     * That will succeed, and set length to the appropriate length.
-     * We then allocate a buffer of that size and call sysctl again
-     * with that buffer.  If that succeeds, we're done.  If that fails
-     * with ENOMEM, we have to throw away our buffer and loop.  Note
-     * that the loop causes use to call sysctl with NULL again; this
-     * is necessary because the ENOMEM failure case sets length to
-     * the amount of data returned, not the amount of data that
-     * could have been returned.
-     */
-    result = NULL;
-    done = 0;
-    do {
-        assert(result == NULL);
-        // Call sysctl with a NULL buffer.
-        length = 0;
-        err = sysctl((int *)name, (sizeof(name) / sizeof(*name)) - 1,
-                     NULL, &length, NULL, 0);
-        if (err == -1)
-            err = errno;
-
-        // Allocate an appropriately sized buffer based on the results
-        // from the previous call.
-        if (err == 0) {
-            result = malloc(length);
-            if (result == NULL)
-                err = ENOMEM;
-        }
-
-        // Call sysctl again with the new buffer.  If we get an ENOMEM
-        // error, toss away our buffer and start again.
-        if (err == 0) {
-            err = sysctl((int *) name, (sizeof(name) / sizeof(*name)) - 1,
-                          result, &length, NULL, 0);
-            if (err == -1)
-                err = errno;
-            if (err == 0) {
-                done = 1;
-            }
-            else if (err == ENOMEM) {
-                assert(result != NULL);
-                free(result);
-                result = NULL;
-                err = 0;
-            }
-        }
-    } while (err == 0 && ! done);
-
-    // Clean up and establish post conditions.
-    if (err != 0 && result != NULL) {
-        free(result);
-        result = NULL;
-    }
-
-    *procList = result;
-    *procCount = length / sizeof(struct kinfo_proc);
-
-    assert((err == 0) == (*procList != NULL));
-    return err;
-}
-
-
-char
-*getcmdpath(long pid, size_t *pathsize)
-{
-    int  mib[4];
-    char *path;
-    size_t size = 0;
-
-    /*
-     * Make a sysctl() call to get the raw argument space of the process.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PATHNAME;
-    mib[3] = pid;
-
-    // call with a null buffer first to determine if we need a buffer
-    if (sysctl(mib, 4, NULL, &size, NULL, 0) == -1) {
-        return NULL;
-    }
-
-    path = malloc(size);
-    if (path == NULL)
-        return NULL;
-
-    *pathsize = size;
-    if (sysctl(mib, 4, path, &size, NULL, 0) == -1) {
-        free(path);
-        return NULL;       /* Insufficient privileges */
-    }
-
-    return path;
-}
-
-
-
-/*
- * Borrowed from psi Python System Information project
- *
- * Get command arguments and environment variables.
- *
- * Based on code from ps.
- *
- * Returns:
- *      0 for success;
- *      -1 for failure (Exception raised);
- *      1 for insufficient privileges.
- */
-char
-*getcmdargs(long pid, size_t *argsize)
-{
-    int mib[4];
-    size_t size, argmax;
-    char *procargs = NULL;
-
-    /* Get the maximum process arguments size. */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_ARGMAX;
-
-    size = sizeof(argmax);
-    if (sysctl(mib, 2, &argmax, &size, NULL, 0) == -1)
-        return NULL;
-
-    /* Allocate space for the arguments. */
-    procargs = (char *)malloc(argmax);
-    if (procargs == NULL)
-        return NULL;
-
-    /*
-     * Make a sysctl() call to get the raw argument space of the process.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_ARGS;
-    mib[3] = pid;
-
-    size = argmax;
-    if (sysctl(mib, 4, procargs, &size, NULL, 0) == -1) {
-        free(procargs);
-        return NULL;       /* Insufficient privileges */
-    }
-
-    // return string and set the length of arguments
-    *argsize = size;
-    return procargs;
-}
-
-
-/* returns the command line as a python list object */
-PyObject*
-get_arg_list(long pid)
-{
-    char *argstr = NULL;
-    int pos = 0;
-    size_t argsize = 0;
-    PyObject *retlist = Py_BuildValue("[]");
-    PyObject *item = NULL;
-
-    if (pid < 0) {
-        return retlist;
-    }
-
-    // XXX - this leaks memory (grrr)
-    argstr = getcmdargs(pid, &argsize);
-
-    if (NULL == argstr) {
-        if (ESRCH == errno) {
-            PyErr_Format(PyExc_RuntimeError,
-                    "getcmdargs() failed - no process found with pid %lu", pid);
-            return NULL;
-        }
-
-        // ignore other errors for now, since we don't want to bail on
-        // get_process_info() if cmdline is the only thing we couldn't get.
-        // In that case, we just return an empty list return
-        // PyErr_Format(PyExc_RuntimeError, "getcmdargs() failed for pid %lu", pid);
-        return retlist;
-    }
-
-    // args are returned as a flattened string with \0 separators between
-    // arguments add each string to the list then step forward to the next
-    // separator
-    if (argsize > 0) {
-        while(pos < argsize) {
-            item = Py_BuildValue("s", &argstr[pos]);
-            PyList_Append(retlist, item);
-            Py_DECREF(item);
-            pos = pos + strlen(&argstr[pos]) + 1;
-        }
-    }
-
-    free(argstr);
-    return retlist;
-}
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-int
-pid_exists(long pid)
-{
-    int kill_ret;
-    if (pid < 0) {
-        return 0;
-    }
-
-    // if kill returns success of permission denied we know it's a valid PID
-    kill_ret = kill(pid , 0);
-    if ((0 == kill_ret) || (EPERM == errno)) {
-        return 1;
-    }
-
-    // otherwise return 0 for PID not found
-    return 0;
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.h b/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.h
deleted file mode 100644
index be6a98d..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/bsd/process_info.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * $Id: process_info.h 828 2010-11-20 20:52:07Z g.rodola $
- *
- * Helper functions related to fetching process information. Used by _psutil_bsd
- * module methods.
- */
-
-#include <Python.h>
-
-typedef struct kinfo_proc kinfo_proc;
-
-int get_proc_list(struct kinfo_proc **procList, size_t *procCount);
-char *getcmdargs(long pid, size_t *argsize);
-char *getcmdpath(long pid, size_t *pathsize);
-PyObject* get_arg_list(long pid);
-int pid_exists(long pid);
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/ntextapi.h b/contrib/psutil-0.2.1/psutil/arch/mswindows/ntextapi.h
deleted file mode 100644
index 3879e07..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/ntextapi.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * $Id$
- */
-
-typedef enum _KTHREAD_STATE
-{
-    Initialized,
-    Ready,
-    Running,
-    Standby,
-    Terminated,
-    Waiting,
-    Transition,
-    DeferredReady,
-    GateWait,
-    MaximumThreadState
-} KTHREAD_STATE, *PKTHREAD_STATE;
-
-typedef enum _KWAIT_REASON
-{
-    Executive = 0,
-    FreePage = 1,
-    PageIn = 2,
-    PoolAllocation = 3,
-    DelayExecution = 4,
-    Suspended = 5,
-    UserRequest = 6,
-    WrExecutive = 7,
-    WrFreePage = 8,
-    WrPageIn = 9,
-    WrPoolAllocation = 10,
-    WrDelayExecution = 11,
-    WrSuspended = 12,
-    WrUserRequest = 13,
-    WrEventPair = 14,
-    WrQueue = 15,
-    WrLpcReceive = 16,
-    WrLpcReply = 17,
-    WrVirtualMemory = 18,
-    WrPageOut = 19,
-    WrRendezvous = 20,
-    Spare2 = 21,
-    Spare3 = 22,
-    Spare4 = 23,
-    Spare5 = 24,
-    WrCalloutStack = 25,
-    WrKernel = 26,
-    WrResource = 27,
-    WrPushLock = 28,
-    WrMutex = 29,
-    WrQuantumEnd = 30,
-    WrDispatchInt = 31,
-    WrPreempted = 32,
-    WrYieldExecution = 33,
-    WrFastMutex = 34,
-    WrGuardedMutex = 35,
-    WrRundown = 36,
-    MaximumWaitReason = 37
-} KWAIT_REASON, *PKWAIT_REASON;
-
-
-typedef struct _CLIENT_ID
-{
-    HANDLE UniqueProcess;
-    HANDLE UniqueThread;
-} CLIENT_ID, *PCLIENT_ID;
-
-
-typedef struct _UNICODE_STRING {
-    USHORT Length;
-    USHORT MaximumLength;
-    PWSTR Buffer;
-} UNICODE_STRING, *PUNICODE_STRING;
-
-
-typedef struct _SYSTEM_TIMEOFDAY_INFORMATION
-{
-    LARGE_INTEGER BootTime;
-    LARGE_INTEGER CurrentTime;
-    LARGE_INTEGER TimeZoneBias;
-    ULONG TimeZoneId;
-    ULONG Reserved;
-    ULONGLONG BootTimeBias;
-    ULONGLONG SleepTimeBias;
-} SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
-
-typedef struct _SYSTEM_THREAD_INFORMATION
-{
-    LARGE_INTEGER KernelTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER CreateTime;
-    ULONG WaitTime;
-    PVOID StartAddress;
-    CLIENT_ID ClientId;
-    LONG Priority;
-    LONG BasePriority;
-    ULONG ContextSwitches;
-    ULONG ThreadState;
-    KWAIT_REASON WaitReason;
-} SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
-
-typedef struct _TEB *PTEB;
-
-// private
-typedef struct _SYSTEM_EXTENDED_THREAD_INFORMATION
-{
-    SYSTEM_THREAD_INFORMATION ThreadInfo;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID Win32StartAddress;
-    PTEB TebBase;
-    ULONG_PTR Reserved2;
-    ULONG_PTR Reserved3;
-    ULONG_PTR Reserved4;
-} SYSTEM_EXTENDED_THREAD_INFORMATION, *PSYSTEM_EXTENDED_THREAD_INFORMATION;
-
-typedef struct _SYSTEM_PROCESS_INFORMATION
-{
-    ULONG NextEntryOffset;
-    ULONG NumberOfThreads;
-    LARGE_INTEGER SpareLi1;
-    LARGE_INTEGER SpareLi2;
-    LARGE_INTEGER SpareLi3;
-    LARGE_INTEGER CreateTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER KernelTime;
-    UNICODE_STRING ImageName;
-    LONG BasePriority;
-    HANDLE UniqueProcessId;
-    HANDLE InheritedFromUniqueProcessId;
-    ULONG HandleCount;
-    ULONG SessionId;
-    ULONG_PTR PageDirectoryBase;
-    SIZE_T PeakVirtualSize;
-    SIZE_T VirtualSize;
-    ULONG PageFaultCount;
-    SIZE_T PeakWorkingSetSize;
-    SIZE_T WorkingSetSize;
-    SIZE_T QuotaPeakPagedPoolUsage;
-    SIZE_T QuotaPagedPoolUsage;
-    SIZE_T QuotaPeakNonPagedPoolUsage;
-    SIZE_T QuotaNonPagedPoolUsage;
-    SIZE_T PagefileUsage;
-    SIZE_T PeakPagefileUsage;
-    SIZE_T PrivatePageCount;
-    LARGE_INTEGER ReadOperationCount;
-    LARGE_INTEGER WriteOperationCount;
-    LARGE_INTEGER OtherOperationCount;
-    LARGE_INTEGER ReadTransferCount;
-    LARGE_INTEGER WriteTransferCount;
-    LARGE_INTEGER OtherTransferCount;
-    SYSTEM_THREAD_INFORMATION Threads[1];
-} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
-
-
-// structures and enums from winternl.h (not available under mingw)
-typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
-    LARGE_INTEGER IdleTime;
-    LARGE_INTEGER KernelTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER Reserved1[2];
-    ULONG Reserved2;
-} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
-
-
-typedef enum _SYSTEM_INFORMATION_CLASS {
-    SystemBasicInformation = 0,
-    SystemPerformanceInformation = 2,
-    SystemTimeOfDayInformation = 3,
-    SystemProcessInformation = 5,
-    SystemProcessorPerformanceInformation = 8,
-    SystemInterruptInformation = 23,
-    SystemExceptionInformation = 33,
-    SystemRegistryQuotaInformation = 37,
-    SystemLookasideInformation = 45
-} SYSTEM_INFORMATION_CLASS;
-
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.c b/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.c
deleted file mode 100644
index fd272f2..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.c
+++ /dev/null
@@ -1,295 +0,0 @@
-#ifndef UNICODE
-#define UNICODE
-#endif
-
-#include <Python.h>
-#include <windows.h>
-#include <stdio.h>
-#include "process_handles.h"
-
-#ifndef NT_SUCCESS
-    #define NT_SUCCESS(x) ((x) >= 0)
-#endif
-#define STATUS_INFO_LENGTH_MISMATCH 0xc0000004
-
-#define SystemHandleInformation 16
-#define ObjectBasicInformation 0
-#define ObjectNameInformation 1
-#define ObjectTypeInformation 2
-
-
-typedef LONG NTSTATUS;
-
-typedef struct _UNICODE_STRING {
-  USHORT  Length;
-  USHORT  MaximumLength;
-  PWSTR  Buffer;
-} UNICODE_STRING, *PUNICODE_STRING;
-
-typedef NTSTATUS (NTAPI *_NtQuerySystemInformation)(
-    ULONG SystemInformationClass,
-    PVOID SystemInformation,
-    ULONG SystemInformationLength,
-    PULONG ReturnLength
-    );
-
-typedef NTSTATUS (NTAPI *_NtDuplicateObject)(
-    HANDLE SourceProcessHandle,
-    HANDLE SourceHandle,
-    HANDLE TargetProcessHandle,
-    PHANDLE TargetHandle,
-    ACCESS_MASK DesiredAccess,
-    ULONG Attributes,
-    ULONG Options
-    );
-
-typedef NTSTATUS (NTAPI *_NtQueryObject)(
-    HANDLE ObjectHandle,
-    ULONG ObjectInformationClass,
-    PVOID ObjectInformation,
-    ULONG ObjectInformationLength,
-    PULONG ReturnLength
-    );
-
-typedef struct _SYSTEM_HANDLE
-{
-    ULONG ProcessId;
-    BYTE ObjectTypeNumber;
-    BYTE Flags;
-    USHORT Handle;
-    PVOID Object;
-    ACCESS_MASK GrantedAccess;
-} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
-
-typedef struct _SYSTEM_HANDLE_INFORMATION
-{
-    ULONG HandleCount;
-    SYSTEM_HANDLE Handles[1];
-} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
-
-typedef enum _POOL_TYPE
-{
-    NonPagedPool,
-    PagedPool,
-    NonPagedPoolMustSucceed,
-    DontUseThisType,
-    NonPagedPoolCacheAligned,
-    PagedPoolCacheAligned,
-    NonPagedPoolCacheAlignedMustS
-} POOL_TYPE, *PPOOL_TYPE;
-
-typedef struct _OBJECT_TYPE_INFORMATION
-{
-    UNICODE_STRING Name;
-    ULONG TotalNumberOfObjects;
-    ULONG TotalNumberOfHandles;
-    ULONG TotalPagedPoolUsage;
-    ULONG TotalNonPagedPoolUsage;
-    ULONG TotalNamePoolUsage;
-    ULONG TotalHandleTableUsage;
-    ULONG HighWaterNumberOfObjects;
-    ULONG HighWaterNumberOfHandles;
-    ULONG HighWaterPagedPoolUsage;
-    ULONG HighWaterNonPagedPoolUsage;
-    ULONG HighWaterNamePoolUsage;
-    ULONG HighWaterHandleTableUsage;
-    ULONG InvalidAttributes;
-    GENERIC_MAPPING GenericMapping;
-    ULONG ValidAccess;
-    BOOLEAN SecurityRequired;
-    BOOLEAN MaintainHandleCount;
-    USHORT MaintainTypeList;
-    POOL_TYPE PoolType;
-    ULONG PagedPoolUsage;
-    ULONG NonPagedPoolUsage;
-} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
-
-PVOID GetLibraryProcAddress(PSTR LibraryName, PSTR ProcName)
-{
-    return GetProcAddress(GetModuleHandleA(LibraryName), ProcName);
-}
-
-
-PyObject*
-get_open_files(long pid, HANDLE processHandle)
-{
-    _NtQuerySystemInformation NtQuerySystemInformation =
-        GetLibraryProcAddress("ntdll.dll", "NtQuerySystemInformation");
-    _NtDuplicateObject NtDuplicateObject =
-        GetLibraryProcAddress("ntdll.dll", "NtDuplicateObject");
-    _NtQueryObject NtQueryObject =
-        GetLibraryProcAddress("ntdll.dll", "NtQueryObject");
-
-    NTSTATUS                    status;
-    PSYSTEM_HANDLE_INFORMATION  handleInfo;
-    ULONG                       handleInfoSize = 0x10000;
-
-    ULONG                       i;
-    ULONG                       fileNameLength;
-    PyObject                    *filesList = Py_BuildValue("[]");
-    PyObject                    *arg = NULL;
-    PyObject                    *fileFromWchar = NULL;
-
-
-
-    handleInfo = (PSYSTEM_HANDLE_INFORMATION)malloc(handleInfoSize);
-
-    /* NtQuerySystemInformation won't give us the correct buffer size,
-       so we guess by doubling the buffer size. */
-    while ((status = NtQuerySystemInformation(
-        SystemHandleInformation,
-        handleInfo,
-        handleInfoSize,
-        NULL
-        )) == STATUS_INFO_LENGTH_MISMATCH)
-        handleInfo = (PSYSTEM_HANDLE_INFORMATION)realloc(handleInfo, handleInfoSize *= 2);
-
-    /* NtQuerySystemInformation stopped giving us STATUS_INFO_LENGTH_MISMATCH. */
-    if (!NT_SUCCESS(status)) {
-        //printf("NtQuerySystemInformation failed!\n");
-        return NULL;
-    }
-
-    for (i = 0; i < handleInfo->HandleCount; i++)
-    {
-        SYSTEM_HANDLE            handle = handleInfo->Handles[i];
-        HANDLE                   dupHandle = NULL;
-        POBJECT_TYPE_INFORMATION objectTypeInfo;
-        PVOID                    objectNameInfo;
-        UNICODE_STRING           objectName;
-        ULONG                    returnLength;
-
-        /* Check if this handle belongs to the PID the user specified. */
-        if (handle.ProcessId != pid)
-            continue;
-
-        /* Skip handles with the following access codes as the next call
-           to NtDuplicateObject() or NtQueryObject() might hang forever. */
-        if((handle.GrantedAccess == 0x0012019f)
-        || (handle.GrantedAccess == 0x001a019f)
-        || (handle.GrantedAccess == 0x00120189)
-        || (handle.GrantedAccess == 0x00100000)) {
-            continue;
-        }
-
-        /* Duplicate the handle so we can query it. */
-        if (!NT_SUCCESS(NtDuplicateObject(
-            processHandle,
-            handle.Handle,
-            GetCurrentProcess(),
-            &dupHandle,
-            0,
-            0,
-            0
-            )))
-        {
-            //printf("[%#x] Error!\n", handle.Handle);
-            continue;
-        }
-
-        /* Query the object type. */
-        objectTypeInfo = (POBJECT_TYPE_INFORMATION)malloc(0x1000);
-        if (!NT_SUCCESS(NtQueryObject(
-            dupHandle,
-            ObjectTypeInformation,
-            objectTypeInfo,
-            0x1000,
-            NULL
-            )))
-        {
-            //printf("[%#x] Error!\n", handle.Handle);
-            CloseHandle(dupHandle);
-            continue;
-        }
-
-        objectNameInfo = malloc(0x1000);
-        if (!NT_SUCCESS(NtQueryObject(
-            dupHandle,
-            ObjectNameInformation,
-            objectNameInfo,
-            0x1000,
-            &returnLength
-            )))
-        {
-            /* Reallocate the buffer and try again. */
-            objectNameInfo = realloc(objectNameInfo, returnLength);
-            if (!NT_SUCCESS(NtQueryObject(
-                dupHandle,
-                ObjectNameInformation,
-                objectNameInfo,
-                returnLength,
-                NULL
-                )))
-            {
-                /* We have the type name, so just display that.*/
-                /*
-                printf(
-                    "[%#x] %.*S: (could not get name)\n",
-                    handle.Handle,
-                    objectTypeInfo->Name.Length / 2,
-                    objectTypeInfo->Name.Buffer
-                    );
-                */
-                free(objectTypeInfo);
-                free(objectNameInfo);
-                CloseHandle(dupHandle);
-                continue;
-
-            }
-        }
-
-        /* Cast our buffer into an UNICODE_STRING. */
-        objectName = *(PUNICODE_STRING)objectNameInfo;
-
-        /* Print the information! */
-        if (objectName.Length)
-        {
-            /* The object has a name.  Make sure it is a file otherwise
-               ignore it */
-            fileNameLength = objectName.Length / 2;
-            if (wcscmp(objectTypeInfo->Name.Buffer, L"File") == 0) {
-                //printf("%.*S\n", objectName.Length / 2, objectName.Buffer);
-                fileFromWchar = PyUnicode_FromWideChar(objectName.Buffer,
-                                                       fileNameLength);
-                #if PY_MAJOR_VERSION >= 3
-                    arg = Py_BuildValue("N", PyUnicode_AsUTF8String(fileFromWchar));
-                #else
-                    arg = Py_BuildValue("N", PyUnicode_FromObject(fileFromWchar));
-                #endif
-                Py_XDECREF(fileFromWchar);
-                PyList_Append(filesList, arg);
-                Py_XDECREF(arg);
-            }
-            /*
-            printf(
-                "[%#x] %.*S: %.*S\n",
-                handle.Handle,
-                objectTypeInfo->Name.Length / 2,
-                objectTypeInfo->Name.Buffer,
-                objectName.Length / 2,
-                objectName.Buffer
-                );
-            */
-        }
-        else
-        {
-            /* Print something else. */
-            /*
-            printf(
-                "[%#x] %.*S: (unnamed)\n",
-                handle.Handle,
-                objectTypeInfo->Name.Length / 2,
-                objectTypeInfo->Name.Buffer
-                );
-            */
-            ;;
-        }
-        free(objectTypeInfo);
-        free(objectNameInfo);
-        CloseHandle(dupHandle);
-    }
-    free(handleInfo);
-    CloseHandle(processHandle);
-    return filesList;
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.h b/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.h
deleted file mode 100644
index bd9d39b..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_handles.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <Python.h>
-#include <windows.h>
-
-PyObject* get_open_files(long pid, HANDLE processHandle);
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.c b/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.c
deleted file mode 100644
index e1b6190..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * $Id: process_info.c 931 2011-02-22 04:10:46Z g.rodola $
- *
- * Helper functions related to fetching process information. Used by
- * _psutil_mswindows module methods.
- */
-
-#include <Python.h>
-#include <windows.h>
-#include <Psapi.h>
-#include <tlhelp32.h>
-
-#include "security.h"
-#include "process_info.h"
-#include "ntextapi.h"
-
-/*
- * NtQueryInformationProcess code taken from
- * http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/
- * typedefs needed to compile against ntdll functions not exposted in the API
- */
-typedef LONG NTSTATUS;
-
-typedef NTSTATUS (NTAPI *_NtQueryInformationProcess)(
-    HANDLE ProcessHandle,
-    DWORD ProcessInformationClass,
-    PVOID ProcessInformation,
-    DWORD ProcessInformationLength,
-    PDWORD ReturnLength
-    );
-
-typedef struct _PROCESS_BASIC_INFORMATION
-{
-    PVOID Reserved1;
-    PVOID PebBaseAddress;
-    PVOID Reserved2[2];
-    ULONG_PTR UniqueProcessId;
-    PVOID Reserved3;
-} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
-
-
-/*
- * A wrapper around OpenProcess setting NSP exception if process
- * no longer exists.
- * "pid" is the process pid, "dwDesiredAccess" is the first argument
- * exptected by OpenProcess.
- * Return a process handle or NULL.
- */
-HANDLE
-handle_from_pid_waccess(DWORD pid, DWORD dwDesiredAccess)
-{
-    HANDLE hProcess;
-    DWORD  processExitCode = 0;
-
-    hProcess = OpenProcess(dwDesiredAccess, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        return NULL;
-    }
-
-    /* make sure the process is running */
-    GetExitCodeProcess(hProcess, &processExitCode);
-    if (processExitCode == 0) {
-        NoSuchProcess();
-        CloseHandle(hProcess);
-        return NULL;
-    }
-    return hProcess;
-}
-
-
-/*
- * Same as handle_from_pid_waccess but implicitly uses
- * PROCESS_QUERY_INFORMATION | PROCESS_VM_READ as dwDesiredAccess
- * parameter for OpenProcess.
- */
-HANDLE
-handle_from_pid(DWORD pid) {
-    DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
-    return handle_from_pid_waccess(pid, dwDesiredAccess);
-}
-
-
-// fetch the PEB base address from NtQueryInformationProcess()
-PVOID
-GetPebAddress(HANDLE ProcessHandle)
-{
-    _NtQueryInformationProcess NtQueryInformationProcess =
-        (_NtQueryInformationProcess)GetProcAddress(
-        GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
-    PROCESS_BASIC_INFORMATION pbi;
-
-    NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);
-    return pbi.PebBaseAddress;
-}
-
-
-DWORD*
-get_pids(DWORD *numberOfReturnedPIDs) {
-    int procArraySz = 1024;
-
-    /* Win32 SDK says the only way to know if our process array
-     * wasn't large enough is to check the returned size and make
-     * sure that it doesn't match the size of the array.
-     * If it does we allocate a larger array and try again*/
-
-    /* Stores the actual array */
-    DWORD *procArray = NULL;
-    DWORD procArrayByteSz;
-
-    /* Stores the byte size of the returned array from enumprocesses */
-    DWORD enumReturnSz = 0;
-
-    do {
-        free(procArray);
-        procArrayByteSz = procArraySz * sizeof(DWORD);
-        procArray = malloc(procArrayByteSz);
-
-        if (! EnumProcesses(procArray, procArrayByteSz, &enumReturnSz)) {
-            free(procArray);
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-        else if (enumReturnSz == procArrayByteSz) {
-            /* Process list was too large.  Allocate more space*/
-            procArraySz += 1024;
-        }
-
-        /* else we have a good list */
-
-    } while(enumReturnSz == procArraySz * sizeof(DWORD));
-
-    /* The number of elements is the returned size / size of each element */
-    *numberOfReturnedPIDs = enumReturnSz / sizeof(DWORD);
-
-    return procArray;
-}
-
-
-int
-is_system_proc(DWORD pid) {
-    HANDLE hProcess;
-
-    // Special case for PID 0 System Idle Process
-    // and PID 4 (SYSTEM)
-    if ((pid == 0) || (pid == 4)) {
-        return 1;
-    }
-    if (pid < 0) {
-        return 0;
-    }
-
-    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
-    if (NULL == hProcess) {
-        // invalid parameter is no such process
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            return 0;
-        }
-
-        // access denied obviously means there's a process to deny access to...
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            return 1;
-        }
-
-        PyErr_SetFromWindowsErr(0);
-        return -1;
-    }
-
-    return HasSystemPrivilege(hProcess);
-}
-
-
-int
-pid_is_running(DWORD pid)
-{
-    HANDLE hProcess;
-    DWORD exitCode;
-
-    // Special case for PID 0 System Idle Process
-    if (pid == 0) {
-        return 1;
-    }
-
-    if (pid < 0) {
-        return 0;
-    }
-
-    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
-                           FALSE, pid);
-    if (NULL == hProcess) {
-        // invalid parameter is no such process
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            CloseHandle(hProcess);
-            return 0;
-        }
-
-        // access denied obviously means there's a process to deny access to...
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            CloseHandle(hProcess);
-            return 1;
-        }
-
-        CloseHandle(hProcess);
-        PyErr_SetFromWindowsErr(0);
-        return -1;
-    }
-
-    if (GetExitCodeProcess(hProcess, &exitCode)) {
-        CloseHandle(hProcess);
-        return (exitCode == STILL_ACTIVE);
-    }
-
-    // access denied means there's a process there so we'll assume it's running
-    if (GetLastError() == ERROR_ACCESS_DENIED) {
-        CloseHandle(hProcess);
-        return 1;
-    }
-
-    PyErr_SetFromWindowsErr(0);
-    CloseHandle(hProcess);
-    return -1;
-}
-
-
-int
-pid_in_proclist(DWORD pid)
-{
-    DWORD *proclist = NULL;
-    DWORD numberOfReturnedPIDs;
-    DWORD i;
-
-    proclist = get_pids(&numberOfReturnedPIDs);
-    if (NULL == proclist) {
-        return -1;
-    }
-
-    for (i = 0; i < numberOfReturnedPIDs; i++) {
-        if (pid == proclist[i]) {
-            free(proclist);
-            return 1;
-        }
-    }
-
-    free(proclist);
-    return 0;
-}
-
-
-// Check exit code from a process handle. Return FALSE on an error also
-BOOL is_running(HANDLE hProcess)
-{
-    DWORD dwCode;
-
-    if (NULL == hProcess) {
-        return FALSE;
-    }
-
-    if (GetExitCodeProcess(hProcess, &dwCode)) {
-        return (dwCode == STILL_ACTIVE);
-    }
-    return FALSE;
-}
-
-
-// Return None to represent NoSuchProcess, else return NULL for
-// other exception or the name as a Python string
-PyObject*
-get_name(long pid)
-{
-    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-    PROCESSENTRY32 pe = { 0 };
-    pe.dwSize = sizeof(PROCESSENTRY32);
-
-    if( Process32First(h, &pe)) {
-        do {
-            if (pe.th32ProcessID == pid) {
-                CloseHandle(h);
-                return Py_BuildValue("s", pe.szExeFile);
-            }
-        } while(Process32Next(h, &pe));
-
-        // the process was never found, set NoSuchProcess exception
-        NoSuchProcess();
-        CloseHandle(h);
-        return NULL;
-    }
-
-    CloseHandle(h);
-    return PyErr_SetFromWindowsErr(0);
-}
-
-
-/* returns parent pid (as a Python int) for given pid or None on failure */
-PyObject*
-get_ppid(long pid)
-{
-    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-    PROCESSENTRY32 pe = { 0 };
-    pe.dwSize = sizeof(PROCESSENTRY32);
-
-    if( Process32First(h, &pe)) {
-        do {
-            if (pe.th32ProcessID == pid) {
-                //printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
-                CloseHandle(h);
-                return Py_BuildValue("I", pe.th32ParentProcessID);
-            }
-        } while(Process32Next(h, &pe));
-
-        // the process was never found, set NoSuchProcess exception
-        NoSuchProcess();
-        CloseHandle(h);
-        return NULL;
-    }
-
-    CloseHandle(h);
-    return PyErr_SetFromWindowsErr(0);
-}
-
-
-
-/*
- * returns a Python list representing the arguments for the process
- * with given pid or NULL on error.
- */
-PyObject*
-get_arg_list(long pid)
-{
-    int nArgs, i;
-    LPWSTR *szArglist;
-    HANDLE hProcess;
-    PVOID pebAddress;
-    PVOID rtlUserProcParamsAddress;
-    UNICODE_STRING commandLine;
-    WCHAR *commandLineContents;
-    PyObject *arg = NULL;
-    PyObject *arg_from_wchar = NULL;
-    PyObject *argList = NULL;
-
-
-    hProcess = handle_from_pid(pid);
-    if(hProcess == NULL) {
-        return NULL;
-    }
-
-    pebAddress = GetPebAddress(hProcess);
-
-    /* get the address of ProcessParameters */
-#ifdef _WIN64
-    if (!ReadProcessMemory(hProcess, (PCHAR)pebAddress + 32,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#else
-    if (!ReadProcessMemory(hProcess, (PCHAR)pebAddress + 0x10,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#endif
-    {
-        //printf("Could not read the address of ProcessParameters!\n");
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-    /* read the CommandLine UNICODE_STRING structure */
-#ifdef _WIN64
-    if (!ReadProcessMemory(hProcess, (PCHAR)rtlUserProcParamsAddress + 112,
-        &commandLine, sizeof(commandLine), NULL))
-#else
-    if (!ReadProcessMemory(hProcess, (PCHAR)rtlUserProcParamsAddress + 0x40,
-        &commandLine, sizeof(commandLine), NULL))
-#endif
-    {
-        //printf("Could not read CommandLine!\n");
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-
-    /* allocate memory to hold the command line */
-    commandLineContents = (WCHAR *)malloc(commandLine.Length+1);
-
-    /* read the command line */
-    if (!ReadProcessMemory(hProcess, commandLine.Buffer,
-        commandLineContents, commandLine.Length, NULL))
-    {
-        //printf("Could not read the command line string!\n");
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        free(commandLineContents);
-        return NULL;
-    }
-
-    /* print the commandline */
-    //printf("%.*S\n", commandLine.Length / 2, commandLineContents);
-
-    // null-terminate the string to prevent wcslen from returning incorrect length
-    // the length specifier is in characters, but commandLine.Length is in bytes
-    commandLineContents[(commandLine.Length/sizeof(WCHAR))] = '\0';
-
-    // attemempt tp parse the command line using Win32 API, fall back on string
-    // cmdline version otherwise
-    szArglist = CommandLineToArgvW(commandLineContents, &nArgs);
-    if (NULL == szArglist) {
-        // failed to parse arglist
-        // encode as a UTF8 Python string object from WCHAR string
-        arg_from_wchar = PyUnicode_FromWideChar(commandLineContents,
-                                                commandLine.Length / 2);
-        #if PY_MAJOR_VERSION >= 3
-            argList = Py_BuildValue("N", PyUnicode_AsUTF8String(arg_from_wchar));
-        #else
-            argList = Py_BuildValue("N", PyUnicode_FromObject(arg_from_wchar));
-        #endif
-    }
-    else {
-        // arglist parsed as array of UNICODE_STRING, so convert each to Python
-        // string object and add to arg list
-        argList = Py_BuildValue("[]");
-        for(i=0; i<nArgs; i++) {
-            //printf("%d: %.*S (%d characters)\n", i, wcslen(szArglist[i]),
-            //                  szArglist[i], wcslen(szArglist[i]));
-            arg_from_wchar = PyUnicode_FromWideChar(szArglist[i],
-                                                    wcslen(szArglist[i])
-                                                    );
-            #if PY_MAJOR_VERSION >= 3
-                arg = PyUnicode_FromObject(arg_from_wchar);
-            #else
-                arg = PyUnicode_AsUTF8String(arg_from_wchar);
-            #endif
-            Py_XDECREF(arg_from_wchar);
-            PyList_Append(argList, arg);
-            Py_XDECREF(arg);
-        }
-    }
-
-    LocalFree(szArglist);
-    free(commandLineContents);
-    CloseHandle(hProcess);
-    return argList;
-}
-
-
-#define PH_FIRST_PROCESS(Processes) ((PSYSTEM_PROCESS_INFORMATION)(Processes))
-
-#define PH_NEXT_PROCESS(Process) ( \
-    ((PSYSTEM_PROCESS_INFORMATION)(Process))->NextEntryOffset ? \
-    (PSYSTEM_PROCESS_INFORMATION)((PCHAR)(Process) + \
-    ((PSYSTEM_PROCESS_INFORMATION)(Process))->NextEntryOffset) : \
-    NULL \
-    )
-
-const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004;
-const STATUS_BUFFER_TOO_SMALL = 0xC0000023L;
-
-/*
- * Given a process PID and a PSYSTEM_PROCESS_INFORMATION structure
- * fills the structure with process information.
- * On success return 1, else 0 with Python exception already set.
- */
-int
-get_process_info(DWORD pid, PSYSTEM_PROCESS_INFORMATION *retProcess)
-{
-    static ULONG initialBufferSize = 0x4000;
-    NTSTATUS status;
-    PVOID buffer;
-    ULONG bufferSize;
-    PSYSTEM_PROCESS_INFORMATION process;
-
-    // get NtQuerySystemInformation
-    typedef DWORD (_stdcall *NTQSI_PROC) (int, PVOID, ULONG, PULONG);
-    NTQSI_PROC NtQuerySystemInformation;
-    HINSTANCE hNtDll;
-    hNtDll = LoadLibrary(TEXT("ntdll.dll"));
-    NtQuerySystemInformation = (NTQSI_PROC)GetProcAddress(
-                                hNtDll, "NtQuerySystemInformation");
-
-    bufferSize = initialBufferSize;
-    buffer = malloc(bufferSize);
-
-    while (TRUE) {
-        status = NtQuerySystemInformation(SystemProcessInformation, buffer,
-                                          bufferSize, &bufferSize);
-
-        if (status == STATUS_BUFFER_TOO_SMALL || status == STATUS_INFO_LENGTH_MISMATCH)
-        {
-            free(buffer);
-            buffer = malloc(bufferSize);
-        }
-        else {
-            break;
-        }
-    }
-
-    if (status != 0) {
-        free(buffer);
-        PyErr_Format(PyExc_RuntimeError, "NtQuerySystemInformation() failed");
-        return 0;
-    }
-
-
-    if (bufferSize <= 0x20000)
-        initialBufferSize = bufferSize;
-
-    process = PH_FIRST_PROCESS(buffer);
-    do {
-        if (process->UniqueProcessId == (HANDLE)pid) {
-            free(buffer);
-            *retProcess = process;
-            return 1;
-        }
-    } while (process = PH_NEXT_PROCESS(process));
-
-    free(buffer);
-    NoSuchProcess();
-    return 0;
-}
-
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.h b/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.h
deleted file mode 100644
index d640150..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/process_info.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id: process_info.h 930 2011-02-22 03:45:38Z g.rodola $
- *
- * Helper functions related to fetching process information. Used by _psutil_mswindows
- * module methods.
- */
-
-#include <Python.h>
-#include <windows.h>
-
-PyObject * NoSuchProcess(void);
-PyObject * AccessDenied(void);
-HANDLE handle_from_pid_waccess(DWORD pid, DWORD dwDesiredAccess);
-HANDLE handle_from_pid(DWORD pid);
-PVOID GetPebAddress(HANDLE ProcessHandle);
-HANDLE handle_from_pid(DWORD pid);
-BOOL is_running(HANDLE hProcess);
-int pid_in_proclist(DWORD pid);
-int pid_is_running(DWORD pid);
-int is_system_proc(DWORD pid);
-PyObject* get_arg_list(long pid);
-PyObject* get_ppid(long pid);
-PyObject* get_name(long pid);
-DWORD* get_pids(DWORD *numberOfReturnedPIDs);
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/security.c b/contrib/psutil-0.2.1/psutil/arch/mswindows/security.c
deleted file mode 100644
index ee6ff9d..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/security.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * $Id: security.c 772 2010-11-03 13:51:11Z g.rodola $
- *
- * Security related functions for Windows platform (Set privileges such as
- * SeDebug), as well as security helper functions.
- */
-
-#include <windows.h>
-#include <Python.h>
-
-/*
- * Convert a process handle to a process token handle.
- */
-HANDLE
-token_from_handle(HANDLE hProcess) {
-    HANDLE hToken = NULL;
-
-    if (! OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return hToken;
-}
-
-
-/*
- * http://www.ddj.com/windows/184405986
- *
- * there’s a way to determine whether we’re running under the Local System
- * account. However (you guessed it), we have to call more Win32 functions to
- * determine this. Backing up through the code listing, we need to make another
- * call to GetTokenInformation, but instead of passing through the TOKEN_USER
- * constant, we pass through the TOKEN_PRIVILEGES constant. This value returns
- * an array of privileges that the account has in the environment. Iterating
- * through the array, we call the function LookupPrivilegeName looking for the
- * string “SeTcbPrivilege. If the function returns this string, then this
- * account has Local System privileges
- */
-int HasSystemPrivilege(HANDLE hProcess) {
-    DWORD i;
-    DWORD dwSize = 0;
-    DWORD dwRetval = 0;
-    TCHAR privName[256];
-    DWORD dwNameSize = 256;
-    //PTOKEN_PRIVILEGES tp = NULL;
-    BYTE *pBuffer = NULL;
-    TOKEN_PRIVILEGES* tp = NULL;
-    HANDLE hToken = token_from_handle(hProcess);
-
-    if (NULL == hToken) {
-        return -1;
-    }
-
-    // call GetTokenInformation first to get the buffer size
-    if (! GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwSize)) {
-        dwRetval = GetLastError();
-        // if it failed for a reason other than the buffer, bail out
-        if (dwRetval != ERROR_INSUFFICIENT_BUFFER ) {
-            PyErr_SetFromWindowsErr(dwRetval);
-            return 0;
-        }
-    }
-
-    // allocate buffer and call GetTokenInformation again
-    //tp = (PTOKEN_PRIVILEGES) GlobalAlloc(GPTR, dwSize);
-    pBuffer = (BYTE *) malloc(dwSize);
-
-    if (pBuffer == NULL) {
-        PyErr_SetFromWindowsErr(0);
-        LocalFree(pBuffer);
-        return -1;
-    }
-
-    if (! GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwSize, &dwSize) ) {
-        PyErr_SetFromWindowsErr(0);
-        LocalFree(pBuffer);
-        return -1;
-    }
-
-    // convert the BYTE buffer to a TOKEN_PRIVILEGES struct pointer
-    tp = (TOKEN_PRIVILEGES*)pBuffer;
-
-    // check all the privileges looking for SeTcbPrivilege
-    for(i=0; i < tp->PrivilegeCount; i++) {
-        // reset the buffer contents and the buffer size
-        strcpy(privName, "");
-        dwNameSize = sizeof(privName) / sizeof(TCHAR);
-        if (! LookupPrivilegeName(NULL,
-                &tp->Privileges[i].Luid,
-                (LPTSTR)privName,
-                &dwNameSize)) {
-
-            PyErr_SetFromWindowsErr(0);
-            free(pBuffer);
-            return -1;
-        }
-
-        // if we find the SeTcbPrivilege then it's a LocalSystem process
-        if (! lstrcmpi(privName, TEXT("SeTcbPrivilege"))) {
-            free(pBuffer);
-            return 1;
-        }
-
-    } //for
-
-    free(pBuffer);
-    return 0;
-}
-
-
-BOOL SetPrivilege(HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege)
-{
-    TOKEN_PRIVILEGES tp;
-    LUID luid;
-    TOKEN_PRIVILEGES tpPrevious;
-    DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);
-
-    if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE;
-
-    // first pass.  get current privilege setting
-    tp.PrivilegeCount = 1;
-    tp.Privileges[0].Luid = luid;
-    tp.Privileges[0].Attributes = 0;
-
-    AdjustTokenPrivileges(
-        hToken,
-        FALSE,
-        &tp,
-        sizeof(TOKEN_PRIVILEGES),
-        &tpPrevious,
-        &cbPrevious
-    );
-
-    if (GetLastError() != ERROR_SUCCESS) return FALSE;
-
-    // second pass. set privilege based on previous setting
-    tpPrevious.PrivilegeCount = 1;
-    tpPrevious.Privileges[0].Luid = luid;
-
-    if(bEnablePrivilege) {
-        tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
-    }
-
-    else {
-        tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
-                tpPrevious.Privileges[0].Attributes);
-    }
-
-    AdjustTokenPrivileges(
-        hToken,
-        FALSE,
-        &tpPrevious,
-        cbPrevious,
-        NULL,
-        NULL
-    );
-
-    if (GetLastError() != ERROR_SUCCESS) return FALSE;
-
-    return TRUE;
-}
-
-
-int SetSeDebug()
-{
-    HANDLE hToken;
-    if(! OpenThreadToken(GetCurrentThread(),
-                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                         FALSE,
-                         &hToken)
-                         ){
-        if (GetLastError() == ERROR_NO_TOKEN){
-            if (!ImpersonateSelf(SecurityImpersonation)){
-                //Log2File("Error setting impersonation [SetSeDebug()]", L_DEBUG);
-                return 0;
-            }
-            if (!OpenThreadToken(GetCurrentThread(),
-                                 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                                 FALSE,
-                                 &hToken)
-                                 ){
-                //Log2File("Error Opening Thread Token", L_DEBUG);
-                return 0;
-            }
-        }
-    }
-
-    // enable SeDebugPrivilege (open any process)
-    if (! SetPrivilege(hToken, SE_DEBUG_NAME, TRUE)){
-        //Log2File("Error setting SeDebug Privilege [SetPrivilege()]", L_WARN);
-        return 0;
-    }
-
-    CloseHandle(hToken);
-    return 1;
-}
-
-
-int UnsetSeDebug()
-{
-    HANDLE hToken;
-    if(! OpenThreadToken(GetCurrentThread(),
-                        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                        FALSE,
-                        &hToken)
-                        ){
-        if(GetLastError() == ERROR_NO_TOKEN){
-            if(! ImpersonateSelf(SecurityImpersonation)){
-                //Log2File("Error setting impersonation! [UnsetSeDebug()]", L_DEBUG);
-                return 0;
-            }
-
-            if(!OpenThreadToken(GetCurrentThread(),
-                                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                                FALSE,
-                                &hToken)
-                                ){
-                //Log2File("Error Opening Thread Token! [UnsetSeDebug()]", L_DEBUG);
-                return 0;
-            }
-        }
-    }
-
-    //now disable SeDebug
-    if(!SetPrivilege(hToken, SE_DEBUG_NAME, FALSE)){
-        //Log2File("Error unsetting SeDebug Privilege [SetPrivilege()]", L_WARN);
-        return 0;
-    }
-
-    CloseHandle(hToken);
-    return 1;
-}
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/mswindows/security.h b/contrib/psutil-0.2.1/psutil/arch/mswindows/security.h
deleted file mode 100644
index 5c55643..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/mswindows/security.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * $Id: security.h 435 2009-09-19 09:32:29Z jloden $
- *
- * Security related functions for Windows platform (Set privileges such as
- * SeDebug), as well as security helper functions.
- */
-
-#include <windows.h>
-
-
-BOOL SetPrivilege(HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege);
-int SetSeDebug();
-int UnsetSeDebug();
-HANDLE token_from_handle(HANDLE hProcess);
-int HasSystemPrivilege(HANDLE hProcess);
-
diff --git a/contrib/psutil-0.2.1/psutil/arch/osx/process_info.c b/contrib/psutil-0.2.1/psutil/arch/osx/process_info.c
deleted file mode 100644
index 5c5773c..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/osx/process_info.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * $Id: process_info.c 843 2010-11-27 01:26:41Z jloden $
- *
- * Helper functions related to fetching process information. Used by _psutil_osx
- * module methods.
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <limits.h>  /* for INT_MAX */
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <sys/sysctl.h>
-
-#include "process_info.h"
-#include "../../_psutil_common.h"
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-int
-pid_exists(long pid)
-{
-    int kill_ret;
-
-    // save some time if it's an invalid PID
-    if (pid < 0) {
-        return 0;
-    }
-
-    // if kill returns success of permission denied we know it's a valid PID
-    kill_ret = kill(pid , 0);
-    if ( (0 == kill_ret) || (EPERM == errno) ) {
-        return 1;
-    }
-
-    // otherwise return 0 for PID not found
-    return 0;
-}
-
-
-
-/*
- * Returns a list of all BSD processes on the system.  This routine
- * allocates the list and puts it in *procList and a count of the
- * number of entries in *procCount.  You are responsible for freeing
- * this list (use "free" from System framework).
- * On success, the function returns 0.
- * On error, the function returns a BSD errno value.
- */
-int
-get_proc_list(kinfo_proc **procList, size_t *procCount)
-{
-    /* Declaring mib as const requires use of a cast since the
-     * sysctl prototype doesn't include the const modifier. */
-    static const int mib3[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
-    size_t           size, size2;
-    void            *ptr;
-    int              err, lim = 8;  /* some limit */
-
-    assert( procList != NULL);
-    assert(*procList == NULL);
-    assert(procCount != NULL);
-
-    *procCount = 0;
-
-    /* We start by calling sysctl with ptr == NULL and size == 0.
-     * That will succeed, and set size to the appropriate length.
-     * We then allocate a buffer of at least that size and call
-     * sysctl with that buffer.  If that succeeds, we're done.
-     * If that call fails with ENOMEM, we throw the buffer away
-     * and try again.
-     * Note that the loop calls sysctl with NULL again.  This is
-     * is necessary because the ENOMEM failure case sets size to
-     * the amount of data returned, not the amount of data that
-     * could have been returned.
-     */
-    while (lim-- > 0) {
-        size = 0;
-        if (sysctl((int *)mib3, 3, NULL, &size, NULL, 0) == -1) {
-            return errno;
-        }
-
-        size2 = size + (size >> 3);  /* add some */
-        if (size2 > size) {
-            ptr = malloc(size2);
-            if (ptr == NULL) {
-                ptr = malloc(size);
-            } else {
-                size = size2;
-            }
-        }
-        else {
-            ptr = malloc(size);
-        }
-        if (ptr == NULL) {
-            return ENOMEM;
-        }
-
-        if (sysctl((int *)mib3, 3, ptr, &size, NULL, 0) == -1) {
-            err = errno;
-            free(ptr);
-            if (err != ENOMEM) {
-                return err;
-            }
-
-        } else {
-            *procList = (kinfo_proc *)ptr;
-            *procCount = size / sizeof(kinfo_proc);
-            return 0;
-        }
-    }
-    return ENOMEM;
-}
-
-
-/* Read the maximum argument size for processes */
-size_t
-get_argmax()
-{
-    size_t argmax;
-    int mib[] = { CTL_KERN, KERN_ARGMAX };
-    size_t size = sizeof(argmax);
-
-    if (sysctl(mib, 2, &argmax, &size, NULL, 0) == 0) {
-        return argmax;
-    }
-    return 0;
-}
-
-
-/* return process args as a python list */
-PyObject*
-get_arg_list(long pid)
-{
-    int mib[3];
-    int nargs;
-    int len;
-    char *procargs;
-    char *arg_ptr;
-    char *arg_end;
-    char *curr_arg;
-    size_t argmax;
-    PyObject *arg = NULL;
-    PyObject *arglist = NULL;
-
-    //special case for PID 0 (kernel_task) where cmdline cannot be fetched
-    if (pid == 0) {
-        return Py_BuildValue("[]");
-    }
-
-    /* read argmax and allocate memory for argument space. */
-    argmax = get_argmax();
-    if (! argmax) { return PyErr_SetFromErrno(PyExc_OSError); }
-
-    procargs = (char *)malloc(argmax);
-    if (NULL == procargs) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-
-    /* read argument space */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROCARGS2;
-    mib[2] = pid;
-    if (sysctl(mib, 3, procargs, &argmax, NULL, 0) < 0) {
-        if (EINVAL == errno) { // invalid == access denied OR nonexistent PID
-            if ( pid_exists(pid) ) {
-                AccessDenied();
-            } else {
-                NoSuchProcess();
-            }
-        }
-        free(procargs);
-        return NULL;
-    }
-
-    arg_end = &procargs[argmax];
-    /* copy the number of arguments to nargs */
-    memcpy(&nargs, procargs, sizeof(nargs));
-
-    arg_ptr = procargs + sizeof(nargs);
-    len = strlen(arg_ptr);
-    arg_ptr += len + 1;
-
-    if (arg_ptr == arg_end) {
-        free(procargs);
-        return Py_BuildValue("[]");
-    }
-
-    // skip ahead to the first argument
-    for (; arg_ptr < arg_end; arg_ptr++) {
-        if (*arg_ptr != '\0') {
-            break;
-        }
-    }
-
-    /* iterate through arguments */
-    curr_arg = arg_ptr;
-    arglist = Py_BuildValue("[]");
-    while (arg_ptr < arg_end && nargs > 0) {
-        if (*arg_ptr++ == '\0') {
-            arg = Py_BuildValue("s", curr_arg);
-            if (NULL == arg) {
-                return NULL;
-            }
-            PyList_Append(arglist, arg);
-            Py_DECREF(arg);
-            // iterate to next arg and decrement # of args
-            curr_arg = arg_ptr;
-            nargs--;
-        }
-    }
-
-    free(procargs);
-    return arglist;
-}
-
-
-int
-get_kinfo_proc(pid_t pid, struct kinfo_proc *kp)
-{
-    int mib[4];
-    size_t len;
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID;
-    mib[3] = pid;
-
-    // fetch the info with sysctl()
-    len = sizeof(struct kinfo_proc);
-
-    // now read the data from sysctl
-    if (sysctl(mib, 4, kp, &len, NULL, 0) == -1) {
-        // raise an exception and throw errno as the error
-        PyErr_SetFromErrno(PyExc_OSError);
-    }
-
-    /*
-     * sysctl succeeds but len is zero, happens when process has gone away
-     */
-    if (len == 0) {
-        NoSuchProcess();
-        return -1;
-    }
-    return 0;
-}
diff --git a/contrib/psutil-0.2.1/psutil/arch/osx/process_info.h b/contrib/psutil-0.2.1/psutil/arch/osx/process_info.h
deleted file mode 100644
index 00f91bb..0000000
--- a/contrib/psutil-0.2.1/psutil/arch/osx/process_info.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * $Id: process_info.h 823 2010-11-16 22:34:06Z jloden $
- *
- * Helper functions related to fetching process information. Used by _psutil_osx
- * module methods.
- */
-
-#include <Python.h>
-
-
-typedef struct kinfo_proc kinfo_proc;
-
-int get_proc_list(kinfo_proc **procList, size_t *procCount);
-int get_kinfo_proc(pid_t pid, struct kinfo_proc *kp);
-size_t get_argmax(void);
-int pid_exists(long pid);
-PyObject* get_arg_list(long pid);
diff --git a/contrib/psutil-0.2.1/psutil/error.py b/contrib/psutil-0.2.1/psutil/error.py
deleted file mode 100644
index 646edef..0000000
--- a/contrib/psutil-0.2.1/psutil/error.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: error.py 931 2011-02-22 04:10:46Z g.rodola $
-#
-
-"""psutil exception classes"""
-
-
-class Error(Exception):
-    """Base exception class. All other psutil exceptions inherit
-    from this one.
-    """
-
-class NoSuchProcess(Error):
-    """Exception raised when a process with a certain PID doesn't
-    or no longer exists (zombie).
-    """
-
-    def __init__(self, pid, name=None, msg=None):
-        self.pid = pid
-        self.name = name
-        self.msg = msg
-        if msg is None:
-            if name:
-                details = "(pid=%s, name=%s)" % (self.pid, repr(self.name))
-            else:
-                details = "(pid=%s)" % self.pid
-            self.msg = "process no longer exists " + details
-
-    def __str__(self):
-        return self.msg
-
-
-class AccessDenied(Error):
-    """Exception raised when permission to perform an action is denied."""
-
-    def __init__(self, pid=None, name=None, msg=None):
-        self.pid = pid
-        self.name = name
-        self.msg = msg
-        if msg is None:
-            if (pid is not None) and (name is not None):
-                self.msg = "(pid=%s, name=%s)" % (pid, repr(name))
-            elif (pid is not None):
-                self.msg = "(pid=%s)" % self.pid
-            else:
-                self.msg = ""
-
-    def __str__(self):
-        return self.msg
-
-
-class TimeoutExpired(Error):
-    """Raised on Process.wait(timeout) if timeout expires and process
-    is still alive.
-    """
-
-    def __init__(self, pid=None, name=None):
-        self.pid = pid
-        self.name = name
-        if (pid is not None) and (name is not None):
-            self.msg = "(pid=%s, name=%s)" % (pid, repr(name))
-        elif (pid is not None):
-            self.msg = "(pid=%s)" % self.pid
-        else:
-            self.msg = ""
-
-    def __str__(self):
-        return self.msg
-
diff --git a/contrib/psutil-0.2.1/setup.py b/contrib/psutil-0.2.1/setup.py
deleted file mode 100644
index 6a4c4fe..0000000
--- a/contrib/psutil-0.2.1/setup.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: setup.py 955 2011-03-20 20:46:58Z g.rodola $
-#
-
-import sys
-import os
-import shutil
-from distutils.core import setup, Extension
-
-__ver__ = "0.2.1"
-
-# Hack for Python 3 to tell distutils to run 2to3 against the files
-# copied in the build directory before installing.
-# Reference: http://osdir.com/ml/python.python-3000.cvs/2008-03/msg00127.html
-try:
-    from distutils.command.build_py import build_py_2to3 as build_py
-except ImportError:
-    from distutils.command.build_py import build_py
-
-
-if os.name == 'posix':
-    posix_extension = Extension('_psutil_posix',
-                                sources = ['psutil/_psutil_posix.c'])
-
-
-# Windows
-if sys.platform.lower().startswith("win"):
-
-    def get_winver():
-        maj,min = sys.getwindowsversion()[0:2]
-        return '0x0%s' % ((maj * 100) + min)
-
-    extensions = [Extension('_psutil_mswindows',
-                            sources=['psutil/_psutil_mswindows.c',
-                                     'psutil/_psutil_common.c',
-                                     'psutil/arch/mswindows/process_info.c',
-                                     'psutil/arch/mswindows/process_handles.c',
-                                     'psutil/arch/mswindows/security.c'],
-                            define_macros=[('_WIN32_WINNT', get_winver()),
-                                           ('_AVAIL_WINVER_', get_winver())],
-                            libraries=["psapi", "kernel32", "advapi32", "shell32",
-                                       "netapi32"]
-                            )]
-# OS X
-elif sys.platform.lower().startswith("darwin"):
-    extensions = [Extension('_psutil_osx',
-                            sources = ['psutil/_psutil_osx.c',
-                                       'psutil/_psutil_common.c',
-                                       'psutil/arch/osx/process_info.c']
-                            ),
-                  posix_extension]
-# FreeBSD
-elif sys.platform.lower().startswith("freebsd"):
-    extensions = [Extension('_psutil_bsd',
-                            sources = ['psutil/_psutil_bsd.c',
-                                       'psutil/_psutil_common.c',
-                                       'psutil/arch/bsd/process_info.c']
-                            ),
-                  posix_extension]
-# Linux
-elif sys.platform.lower().startswith("linux"):
-    extensions = [Extension('_psutil_linux',
-                            sources=['psutil/_psutil_linux.c'],
-                            libraries=[]
-                            ),
-                  posix_extension]
-
-else:
-    raise NotImplementedError('platform %s is not supported' % sys.platform)
-
-
-def main():
-    setup_args = dict(
-        name='psutil',
-        version=__ver__,
-        download_url="http://psutil.googlecode.com/files/psutil-%s.tar.gz" % __ver__,
-        description='A process utilities module for Python',
-        long_description="""
-psutil is a module providing convenience functions for managing processes in a
-portable way by using Python.""",
-        keywords=['psutil', 'ps', 'top', 'process', 'utility', 'lsof', 'top',
-                  'netstat', 'taskmgr'],
-        author='Giampaolo Rodola, Dave Daeschler, Jay Loden',
-        author_email='psutil-dev@googlegroups.com',
-        url='http://code.google.com/p/psutil/',
-        platforms='Platform Independent',
-        license='License :: OSI Approved :: BSD License',
-        packages=['psutil'],
-        cmdclass={'build_py':build_py},  # Python 3.X
-        classifiers=[
-              'Development Status :: 5 - Production/Stable',
-              'Environment :: Console',
-              'Operating System :: MacOS :: MacOS X',
-              'Operating System :: Microsoft :: Windows :: Windows NT/2000',
-              'Operating System :: POSIX :: Linux',
-              'Operating System :: POSIX :: BSD :: FreeBSD',
-              'Operating System :: OS Independent',
-              'Programming Language :: C',
-              'Programming Language :: Python',
-              'Programming Language :: Python :: 2',
-              'Programming Language :: Python :: 2.4',
-              'Programming Language :: Python :: 2.5',
-              'Programming Language :: Python :: 2.6',
-              'Programming Language :: Python :: 2.7',
-              'Programming Language :: Python :: 3',
-              'Programming Language :: Python :: 3.0',
-              'Programming Language :: Python :: 3.1',
-              'Programming Language :: Python :: 3.2',
-              'Topic :: System :: Monitoring',
-              'Topic :: System :: Networking',
-              'Topic :: System :: Benchmark',
-              'Topic :: System :: Systems Administration',
-              'Topic :: Utilities',
-              'Topic :: Software Development :: Libraries :: Python Modules',
-              'Intended Audience :: Developers',
-              'Intended Audience :: System Administrators',
-              'License :: OSI Approved :: MIT License',
-              ],
-        )
-    if extensions is not None:
-        setup_args["ext_modules"] = extensions
-
-    setup(**setup_args)
-
-
-if __name__ == '__main__':
-    main()
-
diff --git a/contrib/psutil-0.2.1/test/_bsd.py b/contrib/psutil-0.2.1/test/_bsd.py
deleted file mode 100644
index 437589e..0000000
--- a/contrib/psutil-0.2.1/test/_bsd.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _bsd.py 950 2011-03-19 21:37:09Z g.rodola $
-#
-
-import unittest
-import subprocess
-import time
-import re
-import sys
-
-import psutil
-
-from test_psutil import reap_children, get_test_subprocess
-from _posix import ps
-
-
-def sysctl(cmdline):
-    """Expects a sysctl command with an argument and parse the result
-    returning only the value of interest.
-    """
-    p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-    result = p.communicate()[0].strip()
-    if sys.version_info >= (3,):
-        result = result[result.find(b": ") + 2:]
-        result = str(result, sys.stdout.encoding)
-    else:
-        result = result[result.find(": ") + 2:]
-    try:
-        return int(result)
-    except ValueError:
-        return result
-
-def parse_sysctl_vmtotal(output):
-    """Parse sysctl vm.vmtotal output returning total and free memory
-    values.
-    """
-    line = output.split('\n')[4]  # our line of interest
-    mobj = re.match(r'Virtual\s+Memory.*Total:\s+(\d+)K,\s+Active\s+(\d+)K.*', line)
-    total, active = mobj.groups()
-    # values are represented in kilo bytes
-    total = int(total) * 1024
-    active = int(active) * 1024
-    free = total - active
-    return total, free
-
-
-class BSDSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        self.pid = get_test_subprocess().pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_TOTAL_PHYMEM(self):
-        sysctl_hwphymem = sysctl('sysctl hw.physmem')
-        self.assertEqual(sysctl_hwphymem, psutil.TOTAL_PHYMEM)
-
-    def test_BOOT_TIME(self):
-        s = sysctl('sysctl kern.boottime')
-        s = s[s.find(" sec = ") + 7:]
-        s = s[:s.find(',')]
-        btime = int(s)
-        self.assertEqual(btime, psutil.BOOT_TIME)
-
-    def test_avail_phymem(self):
-        # This test is not particularly accurate and may fail if the OS is
-        # consuming memory for other applications.
-        # We just want to test that the difference between psutil result
-        # and sysctl's is not too high.
-        _sum = sum((sysctl("sysctl vm.stats.vm.v_inactive_count"),
-                    sysctl("sysctl vm.stats.vm.v_cache_count"),
-                    sysctl("sysctl vm.stats.vm.v_free_count")
-                   ))
-        _pagesize = sysctl("sysctl hw.pagesize")
-        sysctl_avail_phymem = _sum * _pagesize
-        psutil_avail_phymem =  psutil.avail_phymem()
-        difference = abs(psutil_avail_phymem - sysctl_avail_phymem)
-        # On my system both sysctl and psutil report the same values.
-        # Let's use a tollerance of 0.5 MB and consider the test as failed
-        # if we go over it.
-        if difference > (0.5 * 2**20):
-            self.fail("sysctl=%s; psutil=%s; difference=%s;" %(
-                      sysctl_avail_phymem, psutil_avail_phymem, difference))
-
-    def test_total_virtmem(self):
-        # This test is not particularly accurate and may fail if the OS is
-        # consuming memory for other applications.
-        # We just want to test that the difference between psutil result
-        # and sysctl's is not too high.
-        p = subprocess.Popen("sysctl vm.vmtotal", shell=1, stdout=subprocess.PIPE)
-        result = p.communicate()[0].strip()
-        if sys.version_info >= (3,):
-            result = str(result, sys.stdout.encoding)
-        sysctl_total_virtmem, _ = parse_sysctl_vmtotal(result)
-        psutil_total_virtmem = psutil.total_virtmem()
-        difference = abs(sysctl_total_virtmem - psutil_total_virtmem)
-
-        # On my system I get a difference of 4657152 bytes, probably because
-        # the system is consuming memory for this same test.
-        # Assuming psutil is right, let's use a tollerance of 10 MB and consider
-        # the test as failed if we go over it.
-        if difference > (10 * 2**20):
-            self.fail("sysctl=%s; psutil=%s; difference=%s;" %(
-                       sysctl_total_virtmem, psutil_total_virtmem, difference))
-
-    def test_avail_virtmem(self):
-        # This test is not particularly accurate and may fail if the OS is
-        # consuming memory for other applications.
-        # We just want to test that the difference between psutil result
-        # and sysctl's is not too high.
-        p = subprocess.Popen("sysctl vm.vmtotal", shell=1, stdout=subprocess.PIPE)
-        result = p.communicate()[0].strip()
-        if sys.version_info >= (3,):
-            result = str(result, sys.stdout.encoding)
-        _, sysctl_avail_virtmem = parse_sysctl_vmtotal(result)
-        psutil_avail_virtmem = psutil.avail_virtmem()
-        difference = abs(sysctl_avail_virtmem - psutil_avail_virtmem)
-        # let's assume the test is failed if difference is > 0.5 MB
-        if difference > (0.5 * 2**20):
-            self.fail("sysctl=%s; psutil=%s; difference=%s;" %(
-                       sysctl_avail_virtmem, psutil_avail_virtmem, difference))
-
-    def test_process_create_time(self):
-        cmdline = "ps -o lstart -p %s" %self.pid
-        p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0]
-        if sys.version_info >= (3,):
-            output = str(output, sys.stdout.encoding)
-        start_ps = output.replace('STARTED', '').strip()
-        start_psutil = psutil.Process(self.pid).create_time
-        start_psutil = time.strftime("%a %b %e %H:%M:%S %Y",
-                                     time.localtime(start_psutil))
-        self.assertEqual(start_ps, start_psutil)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(BSDSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-
-
-
diff --git a/contrib/psutil-0.2.1/test/_linux.py b/contrib/psutil-0.2.1/test/_linux.py
deleted file mode 100644
index 187c058..0000000
--- a/contrib/psutil-0.2.1/test/_linux.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _linux.py 707 2010-10-19 18:16:08Z g.rodola $
-#
-
-import unittest
-import subprocess
-import sys
-
-import psutil
-
-
-class LinuxSpecificTestCase(unittest.TestCase):
-
-    def test_cached_phymem(self):
-        # test psutil.cached_phymem against "cached" column of free
-        # command line utility
-        p = subprocess.Popen("free", shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0].strip()
-        if sys.version_info >= (3,):
-            output = str(output, sys.stdout.encoding)
-        free_cmem = int(output.split('\n')[1].split()[6])
-        psutil_cmem = psutil.cached_phymem() / 1024
-        self.assertEqual(free_cmem, psutil_cmem)
-
-    def test_phymem_buffers(self):
-        # test psutil.phymem_buffers against "buffers" column of free
-        # command line utility
-        p = subprocess.Popen("free", shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0].strip()
-        if sys.version_info >= (3,):
-            output = str(output, sys.stdout.encoding)
-        free_cmem = int(output.split('\n')[1].split()[5])
-        psutil_cmem = psutil.phymem_buffers() / 1024
-        self.assertEqual(free_cmem, psutil_cmem)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(LinuxSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-
-
-
diff --git a/contrib/psutil-0.2.1/test/_osx.py b/contrib/psutil-0.2.1/test/_osx.py
deleted file mode 100644
index caf595a..0000000
--- a/contrib/psutil-0.2.1/test/_osx.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _osx.py 818 2010-11-13 19:52:38Z jloden $
-#
-
-import unittest
-import subprocess
-import time
-import re
-import sys
-
-import psutil
-
-from test_psutil import reap_children, get_test_subprocess
-#from _posix import ps
-
-
-def sysctl(cmdline):
-    """Expects a sysctl command with an argument and parse the result
-    returning only the value of interest.
-    """
-    p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-    result = p.communicate()[0].strip().split()[1]
-    if sys.version_info >= (3,):
-        result = str(result, sys.stdout.encoding)
-    try:
-        return int(result)
-    except ValueError:
-        return result
-
-
-class OSXSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        self.pid = get_test_subprocess().pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_TOTAL_PHYMEM(self):
-        sysctl_hwphymem = sysctl('sysctl hw.memsize')
-        self.assertEqual(sysctl_hwphymem, psutil.TOTAL_PHYMEM)
-
-    def test_process_create_time(self):
-        cmdline = "ps -o lstart -p %s" %self.pid
-        p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0]
-        if sys.version_info >= (3,):
-            output = str(output, sys.stdout.encoding)
-        start_ps = output.replace('STARTED', '').strip()
-        start_psutil = psutil.Process(self.pid).create_time
-        start_psutil = time.strftime("%a %b %e %H:%M:%S %Y",
-                                     time.localtime(start_psutil))
-        self.assertEqual(start_ps, start_psutil)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(OSXSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-
-
-
diff --git a/contrib/psutil-0.2.1/test/_posix.py b/contrib/psutil-0.2.1/test/_posix.py
deleted file mode 100755
index 64d5dfb..0000000
--- a/contrib/psutil-0.2.1/test/_posix.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _posix.py 935 2011-02-22 22:19:33Z g.rodola $
-#
-
-import unittest
-import subprocess
-import time
-import sys
-import os
-
-import psutil
-
-from test_psutil import (get_test_subprocess, reap_children, PYTHON, LINUX, OSX,
-                         ignore_access_denied)
-
-
-def ps(cmd):
-    """Expects a ps command with a -o argument and parse the result
-    returning only the value of interest.
-    """
-    if not LINUX:
-        cmd = cmd.replace(" --no-headers ", " ")
-    p = subprocess.Popen(cmd, shell=1, stdout=subprocess.PIPE)
-    output = p.communicate()[0].strip()
-    if sys.version_info >= (3,):
-        output = str(output, sys.stdout.encoding)
-    if not LINUX:
-        output = output.split('\n')[1]
-    try:
-        return int(output)
-    except ValueError:
-        return output
-
-
-class PosixSpecificTestCase(unittest.TestCase):
-    """Compare psutil results against 'ps' command line utility."""
-
-    # for ps -o arguments see: http://unixhelp.ed.ac.uk/CGI/man-cgi?ps
-
-    def setUp(self):
-        self.pid = get_test_subprocess([PYTHON, "-E", "-O"]).pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_process_parent_pid(self):
-        ppid_ps = ps("ps --no-headers -o ppid -p %s" %self.pid)
-        ppid_psutil = psutil.Process(self.pid).ppid
-        self.assertEqual(ppid_ps, ppid_psutil)
-
-    def test_process_uid(self):
-        uid_ps = ps("ps --no-headers -o uid -p %s" %self.pid)
-        uid_psutil = psutil.Process(self.pid).uids.real
-        self.assertEqual(uid_ps, uid_psutil)
-
-    def test_process_gid(self):
-        gid_ps = ps("ps --no-headers -o rgid -p %s" %self.pid)
-        gid_psutil = psutil.Process(self.pid).gids.real
-        self.assertEqual(gid_ps, gid_psutil)
-
-    def test_process_username(self):
-        username_ps = ps("ps --no-headers -o user -p %s" %self.pid)
-        username_psutil = psutil.Process(self.pid).username
-        self.assertEqual(username_ps, username_psutil)
-
-    @ignore_access_denied
-    def test_process_rss_memory(self):
-        # give python interpreter some time to properly initialize
-        # so that the results are the same
-        time.sleep(0.1)
-        rss_ps = ps("ps --no-headers -o rss -p %s" %self.pid)
-        rss_psutil = psutil.Process(self.pid).get_memory_info()[0] / 1024
-        self.assertEqual(rss_ps, rss_psutil)
-
-    @ignore_access_denied
-    def test_process_vsz_memory(self):
-        # give python interpreter some time to properly initialize
-        # so that the results are the same
-        time.sleep(0.1)
-        vsz_ps = ps("ps --no-headers -o vsz -p %s" %self.pid)
-        vsz_psutil = psutil.Process(self.pid).get_memory_info()[1] / 1024
-        self.assertEqual(vsz_ps, vsz_psutil)
-
-    def test_process_name(self):
-        # use command + arg since "comm" keyword not supported on all platforms
-        name_ps = ps("ps --no-headers -o command -p %s" %self.pid).split(' ')[0]
-        # remove path if there is any, from the command
-        name_ps = os.path.basename(name_ps)
-        name_psutil = psutil.Process(self.pid).name
-        if OSX:
-            self.assertEqual(name_psutil, "Python")
-        else:
-            self.assertEqual(name_ps, name_psutil)
-
-    def test_process_exe(self):
-        ps_pathname = ps("ps --no-headers -o command -p %s" %self.pid).split(' ')[0]
-        psutil_pathname = psutil.Process(self.pid).exe
-        try:
-            self.assertEqual(ps_pathname, psutil_pathname)
-        except AssertionError:
-            # certain platforms such as BSD are more accurate returning:
-            # "/usr/local/bin/python2.7"
-            # ...instead of:
-            # "/usr/local/bin/python"
-            # We do not want to consider this difference in accuracy
-            # an error.
-            ps_extended_pathname = PYTHON + "%s.%s" % (sys.version_info.major,
-                                                       sys.version_info.minor)
-            self.assertEqual(ps_extended_pathname, psutil_pathname)
-
-    def test_process_cmdline(self):
-        ps_cmdline = ps("ps --no-headers -o command -p %s" %self.pid)
-        psutil_cmdline = " ".join(psutil.Process(self.pid).cmdline)
-        self.assertEqual(ps_cmdline, psutil_cmdline)
-
-    def test_get_pids(self):
-        # Note: this test might fail if the OS is starting/killing
-        # other processes in the meantime
-        p = get_test_subprocess(["ps", "ax", "-o", "pid"], stdout=subprocess.PIPE)
-        output = p.communicate()[0].strip()
-        if sys.version_info >= (3,):
-            output = str(output, sys.stdout.encoding)
-        output = output.replace('PID', '')
-        p.wait()
-        pids_ps = []
-        for pid in output.split('\n'):
-            if pid:
-                pids_ps.append(int(pid.strip()))
-        # remove ps subprocess pid which is supposed to be dead in meantime
-        pids_ps.remove(p.pid)
-        # not all systems include pid 0 in their list but psutil does so
-        # we force it
-        if 0 not in pids_ps:
-            pids_ps.append(0)
-
-        pids_psutil = psutil.get_pid_list()
-        pids_ps.sort()
-        pids_psutil.sort()
-
-        if pids_ps != pids_psutil:
-            difference = filter(lambda x:x not in pids_ps, pids_psutil) + \
-                         filter(lambda x:x not in pids_psutil, pids_ps)
-            self.fail("difference: " + str(difference))
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(PosixSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-
diff --git a/contrib/psutil-0.2.1/test/_windows.py b/contrib/psutil-0.2.1/test/_windows.py
deleted file mode 100644
index 95a45b6..0000000
--- a/contrib/psutil-0.2.1/test/_windows.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _windows.py 798 2010-11-12 20:52:57Z g.rodola $
-#
-
-
-import os
-import unittest
-import platform
-import subprocess
-import signal
-import time
-import warnings
-import atexit
-
-import psutil
-from test_psutil import reap_children, get_test_subprocess, wait_for_pid
-try:
-    import wmi
-except ImportError, err:
-    atexit.register(warnings.warn, "Couldn't run wmi tests: %s" % str(err),
-                    RuntimeWarning)
-    wmi = None
-
-WIN2000 = platform.win32_ver()[0] == '2000'
-
-
-class WindowsSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        self.pid = sproc.pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_issue_24(self):
-        p = psutil.Process(0)
-        self.assertRaises(psutil.AccessDenied, p.kill)
-
-    def test_special_pid(self):
-        if not WIN2000:
-            p = psutil.Process(4)
-        else:
-            p = psutil.Process(8)
-        self.assertEqual(p.name, 'System')
-        # use __str__ to access all common Process properties to check
-        # that nothing strange happens
-        str(p)
-        p.username
-        self.assertTrue(p.create_time >= 0.0)
-        try:
-            rss, vms = p.get_memory_info()
-        except psutil.AccessDenied:
-            # expected on Windows Vista and Windows 7
-            if not platform.uname()[1] in ('vista', 'win-7', 'win7'):
-                raise
-        else:
-            self.assertTrue(rss > 0)
-            if not WIN2000:
-                self.assertEqual(vms, 0)
-
-    def test_signal(self):
-        p = psutil.Process(self.pid)
-        self.assertRaises(ValueError, p.send_signal, signal.SIGINT)
-
-    if wmi is not None:
-
-        # --- Process class tests
-
-        def test_process_name(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            self.assertEqual(p.name, w.Caption)
-
-        def test_process_path(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            self.assertEqual(p.exe, w.ExecutablePath)
-
-        if not WIN2000:
-            def test_process_cmdline(self):
-                w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-                p = psutil.Process(self.pid)
-                self.assertEqual(' '.join(p.cmdline), w.CommandLine.replace('"', ''))
-
-        def test_process_username(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            domain, _, username = w.GetOwner()
-            username = "%s\\%s" %(domain, username)
-            self.assertEqual(p.username, username)
-
-        def test_process_rss_memory(self):
-            time.sleep(0.1)
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            rss = p.get_memory_info().rss
-            self.assertEqual(rss, int(w.WorkingSetSize))
-
-        def test_process_vms_memory(self):
-            time.sleep(0.1)
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            vms = p.get_memory_info().vms
-            # http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx
-            # ...claims that PageFileUsage is represented in Kilo
-            # bytes but funnily enough on certain platforms bytes are
-            # returned instead.
-            wmi_usage = int(w.PageFileUsage)
-            if (vms != wmi_usage) and (vms != wmi_usage * 1024):
-                self.fail("wmi=%s, psutil=%s" % (wmi_usage, vms))
-
-        def test_process_create_time(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            wmic_create = str(w.CreationDate.split('.')[0])
-            psutil_create = time.strftime("%Y%m%d%H%M%S",
-                                          time.localtime(p.create_time))
-            self.assertEqual(wmic_create, psutil_create)
-
-
-        # --- psutil namespace functions and constants tests
-
-        def test_NUM_CPUS(self):
-            num_cpus = int(os.environ['NUMBER_OF_PROCESSORS'])
-            self.assertEqual(num_cpus, psutil.NUM_CPUS)
-
-        def test_TOTAL_PHYMEM(self):
-            w = wmi.WMI().Win32_ComputerSystem()[0]
-            self.assertEqual(int(w.TotalPhysicalMemory), psutil.TOTAL_PHYMEM)
-
-        def test__UPTIME(self):
-            # _UPTIME constant is not public but it is used internally
-            # as value to return for pid 0 creation time.
-            # WMI behaves the same.
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(0)
-            wmic_create = str(w.CreationDate.split('.')[0])
-            psutil_create = time.strftime("%Y%m%d%H%M%S",
-                                          time.localtime(p.create_time))
-
-        def test_get_pids(self):
-            # Note: this test might fail if the OS is starting/killing
-            # other processes in the meantime
-            w = wmi.WMI().Win32_Process()
-            wmi_pids = [x.ProcessId for x in w]
-            wmi_pids.sort()
-            psutil_pids = psutil.get_pid_list()
-            psutil_pids.sort()
-            if wmi_pids != psutil_pids:
-                difference = filter(lambda x:x not in wmi_pids, psutil_pids) + \
-                             filter(lambda x:x not in psutil_pids, wmi_pids)
-                self.fail("difference: " + str(difference))
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(WindowsSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
diff --git a/contrib/psutil-0.2.1/test/test_memory_leaks.py b/contrib/psutil-0.2.1/test/test_memory_leaks.py
deleted file mode 100644
index da18571..0000000
--- a/contrib/psutil-0.2.1/test/test_memory_leaks.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: test_memory_leaks.py 828 2010-11-20 20:52:07Z g.rodola $
-#
-
-"""
-Note: this is targeted for python 2.x.
-To run it under python 3.x you need to use 2to3 tool first:
-
-$ 2to3 -w test/test_memory_leaks.py
-"""
-
-
-import os
-import gc
-import sys
-import unittest
-
-import psutil
-from test_psutil import reap_children, skipUnless, skipIf, \
-                        POSIX, LINUX, WINDOWS, OSX, BSD
-
-LOOPS = 1000
-TOLERANCE = 4096
-
-
-class TestProcessObjectLeaks(unittest.TestCase):
-    """Test leaks of Process class methods and properties"""
-
-    def setUp(self):
-        gc.collect()
-
-    def tearDown(self):
-        reap_children()
-
-    def execute(self, method, *args, **kwarks):
-        # step 1
-        p = psutil.Process(os.getpid())
-        for x in xrange(LOOPS):
-            obj = getattr(p, method)
-            if callable(obj):
-                retvalue = obj(*args, **kwarks)
-            else:
-                retvalue = obj  # property
-        del x, p, obj, retvalue
-        gc.collect()
-        rss1 = psutil.Process(os.getpid()).get_memory_info()[0]
-
-        # step 2
-        p = psutil.Process(os.getpid())
-        for x in xrange(LOOPS):
-            obj = getattr(p, method)
-            if callable(obj):
-                retvalue = obj(*args, **kwarks)
-            else:
-                retvalue = obj  # property
-        del x, p, obj, retvalue
-        gc.collect()
-        rss2 = psutil.Process(os.getpid()).get_memory_info()[0]
-
-        # comparison
-        difference = rss2 - rss1
-        if difference > TOLERANCE:
-            self.fail("rss1=%s, rss2=%s, difference=%s" %(rss1, rss2, difference))
-
-    def test_name(self):
-        self.execute('name')
-
-    def test_cmdline(self):
-        self.execute('cmdline')
-
-    def test_ppid(self):
-        self.execute('ppid')
-
-    def test_uid(self):
-        self.execute('uid')
-
-    def test_uid(self):
-        self.execute('gid')
-
-    @skipIf(POSIX)
-    def test_username(self):
-        self.execute('username')
-
-    def test_create_time(self):
-        self.execute('create_time')
-
-    def test_get_num_threads(self):
-        self.execute('get_num_threads')
-
-    def test_get_threads(self):
-        self.execute('get_num_threads')
-
-    def test_get_cpu_times(self):
-        self.execute('get_cpu_times')
-
-    def test_get_memory_info(self):
-        self.execute('get_memory_info')
-
-    def test_is_running(self):
-        self.execute('is_running')
-
-    @skipUnless(WINDOWS)
-    def test_resume(self):
-        self.execute('resume')
-
-    @skipUnless(WINDOWS)
-    def test_getcwd(self):
-        self.execute('getcwd')
-
-    @skipUnless(WINDOWS)
-    def test_get_open_files(self):
-        self.execute('get_open_files')
-
-    @skipUnless(WINDOWS)
-    def test_get_connections(self):
-        self.execute('get_connections')
-
-
-class TestModuleFunctionsLeaks(unittest.TestCase):
-    """Test leaks of psutil module functions."""
-
-    def setUp(self):
-        gc.collect()
-
-    def execute(self, function, *args, **kwarks):
-        # step 1
-        for x in xrange(LOOPS):
-            obj = getattr(psutil, function)
-            if callable(obj):
-                retvalue = obj(*args, **kwarks)
-            else:
-                retvalue = obj  # property
-        del x, obj, retvalue
-        gc.collect()
-        rss1 = psutil.Process(os.getpid()).get_memory_info()[0]
-
-        # step 2
-        for x in xrange(LOOPS):
-            obj = getattr(psutil, function)
-            if callable(obj):
-                retvalue = obj(*args, **kwarks)
-            else:
-                retvalue = obj  # property
-        del x, obj, retvalue
-        gc.collect()
-        rss2 = psutil.Process(os.getpid()).get_memory_info()[0]
-
-        # comparison
-        difference = rss2 - rss1
-        if difference > TOLERANCE:
-            self.fail("rss1=%s, rss2=%s, difference=%s" %(rss1, rss2, difference))
-
-    def test_get_pid_list(self):
-        self.execute('get_pid_list')
-
-    @skipIf(POSIX)
-    def test_pid_exists(self):
-        self.execute('pid_exists', os.getpid())
-
-    def test_process_iter(self):
-        self.execute('process_iter')
-
-    def test_used_phymem(self):
-        self.execute('used_phymem')
-
-    def test_avail_phymem(self):
-        self.execute('avail_phymem')
-
-    def test_total_virtmem(self):
-        self.execute('total_virtmem')
-
-    def test_used_virtmem(self):
-        self.execute('used_virtmem')
-
-    def test_avail_virtmem(self):
-        self.execute('avail_virtmem')
-
-    def test_cpu_times(self):
-        self.execute('cpu_times')
-
-
-def test_main():
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(TestProcessObjectLeaks))
-    test_suite.addTest(unittest.makeSuite(TestModuleFunctionsLeaks))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-if __name__ == '__main__':
-    test_main()
-
diff --git a/contrib/psutil-0.2.1/test/test_psutil.py b/contrib/psutil-0.2.1/test/test_psutil.py
deleted file mode 100644
index fd69edd..0000000
--- a/contrib/psutil-0.2.1/test/test_psutil.py
+++ /dev/null
@@ -1,1326 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: test_psutil.py 953 2011-03-20 20:29:45Z g.rodola $
-#
-
-"""psutil test suite.
-Note: this is targeted for python 2.x.
-To run it under python 3.x you need to use 2to3 tool first:
-
-$ 2to3 -w test/*.py
-"""
-
-import unittest
-import os
-import sys
-import subprocess
-import time
-import signal
-import types
-import traceback
-import socket
-import warnings
-import atexit
-import errno
-import threading
-import tempfile
-
-import psutil
-
-
-PYTHON = os.path.realpath(sys.executable)
-DEVNULL = open(os.devnull, 'r+')
-TESTFN = os.path.join(os.getcwd(), "$testfile")
-
-POSIX = os.name == 'posix'
-LINUX = sys.platform.lower().startswith("linux")
-WINDOWS = sys.platform.lower().startswith("win32")
-OSX = sys.platform.lower().startswith("darwin")
-BSD = sys.platform.lower().startswith("freebsd")
-
-try:
-    psutil.Process(os.getpid()).get_connections()
-except NotImplementedError, err:
-    SUPPORT_CONNECTIONS = False
-    atexit.register(warnings.warn, "get_connections() not supported on this platform",
-                    RuntimeWarning)
-else:
-    SUPPORT_CONNECTIONS = True
-
-
-_subprocesses_started = set()
-
-def get_test_subprocess(cmd=None, stdout=DEVNULL, stderr=DEVNULL, stdin=None):
-    """Return a subprocess.Popen object to use in tests.
-    By default stdout and stderr are redirected to /dev/null and the
-    python interpreter is used as test process.
-    """
-    if cmd is None:
-        cmd = [PYTHON, "-c", "import time; time.sleep(3600);"]
-    sproc = subprocess.Popen(cmd, stdout=stdout, stderr=stderr, stdin=stdin)
-    _subprocesses_started.add(sproc.pid)
-    return sproc
-
-def sh(cmdline):
-    """run cmd in a subprocess and return its output.
-    raises RuntimeError on error.
-    """
-    p = subprocess.Popen(cmdline, shell=True, stdout=subprocess.PIPE,
-                                              stderr=subprocess.PIPE)
-    stdout, stderr = p.communicate()
-    if p.returncode != 0:
-        raise RuntimeError(stderr)
-    if stderr:
-        warnings.warn(stderr, RuntimeWarning)
-
-def wait_for_pid(pid, timeout=1):
-    """Wait for pid to show up in the process list then return.
-    Used in the test suite to give time the sub process to initialize.
-    """
-    raise_at = time.time() + timeout
-    while 1:
-        if pid in psutil.get_pid_list():
-            # give it one more iteration to allow full initialization
-            time.sleep(0.01)
-            return
-        time.sleep(0.0001)
-        if time.time() >= raise_at:
-            raise RuntimeError("Timed out")
-
-def reap_children(search_all=False):
-    """Kill any subprocess started by this test suite and ensure that
-    no zombies stick around to hog resources and create problems when
-    looking for refleaks.
-    """
-    if search_all:
-        this_process = psutil.Process(os.getpid())
-        pids = [x.pid for x in this_process.get_children()]
-    else:
-        pids =_subprocesses_started
-    while pids:
-        pid = pids.pop()
-        try:
-            child = psutil.Process(pid)
-            child.kill()
-        except psutil.NoSuchProcess:
-            pass
-        else:
-            child.wait()
-
-
-# we want to search through all processes before exiting
-atexit.register(reap_children, search_all=True)
-
-def skipIf(condition, reason="", warn=False):
-    """Decorator which skip a test under if condition is satisfied.
-    This is a substitute of unittest.skipIf which is available
-    only in python 2.7 and 3.2.
-    If 'reason' argument is provided this will be printed during
-    tests execution.
-    If 'warn' is provided a RuntimeWarning will be shown when all
-    tests are run.
-    """
-    def outer(fun, *args, **kwargs):
-        def inner(self):
-            if condition:
-                sys.stdout.write("skipped-")
-                sys.stdout.flush()
-                if warn:
-                    objname = "%s.%s" % (self.__class__.__name__, fun.__name__)
-                    msg = "%s was skipped" % objname
-                    if reason:
-                        msg += "; reason: " + repr(reason)
-                    atexit.register(warnings.warn, msg, RuntimeWarning)
-                return
-            else:
-                return fun(self, *args, **kwargs)
-        return inner
-    return outer
-
-def skipUnless(condition, reason="", warn=False):
-    """Contrary of skipIf."""
-    if not condition:
-        return skipIf(True, reason, warn)
-    return skipIf(False)
-
-def ignore_access_denied(fun):
-    """Decorator to Ignore AccessDenied exceptions."""
-    def outer(fun, *args, **kwargs):
-        def inner(self):
-            try:
-                return fun(self, *args, **kwargs)
-            except psutil.AccessDenied:
-                pass
-        return inner
-    return outer
-
-
-class ThreadTask(threading.Thread):
-    """A thread object used for running process thread tests."""
-
-    def __init__(self):
-        threading.Thread.__init__(self)
-        self._running = False
-        self._interval = None
-        self._flag = threading.Event()
-
-    def __repr__(self):
-        name =  self.__class__.__name__
-        return '<%s running=%s at %#x>' % (name, self._running, id(self))
-
-    def start(self, interval=0.001):
-        """Start thread and keep it running until an explicit
-        stop() request. Polls for shutdown every 'timeout' seconds.
-        """
-        if self._running:
-            raise ValueError("already started")
-        self._interval = interval
-        threading.Thread.start(self)
-        self._flag.wait()
-
-    def run(self):
-        self._running = True
-        self._flag.set()
-        while self._running:
-            time.sleep(self._interval)
-
-    def stop(self):
-        """Stop thread execution and and waits until it is stopped."""
-        if not self._running:
-            raise ValueError("already stopped")
-        self._running = False
-        self.join()
-
-
-class TestCase(unittest.TestCase):
-
-    def tearDown(self):
-        reap_children()
-
-    def test_get_process_list(self):
-        pids = [x.pid for x in psutil.get_process_list()]
-        self.assertTrue(os.getpid() in pids)
-        self.assertTrue(0 in pids)
-
-    def test_process_iter(self):
-        pids = [x.pid for x in psutil.process_iter()]
-        self.assertTrue(os.getpid() in pids)
-        self.assertTrue(0 in pids)
-
-    def test_kill(self):
-        sproc = get_test_subprocess()
-        test_pid = sproc.pid
-        wait_for_pid(test_pid)
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.kill()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_terminate(self):
-        sproc = get_test_subprocess()
-        test_pid = sproc.pid
-        wait_for_pid(test_pid)
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.terminate()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_send_signal(self):
-        if POSIX:
-            sig = signal.SIGKILL
-        else:
-            sig = signal.SIGTERM
-        sproc = get_test_subprocess()
-        test_pid = sproc.pid
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.send_signal(sig)
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_wait(self):
-        # check exit code signal
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        code = p.wait()
-        if os.name == 'posix':
-            self.assertEqual(code, signal.SIGKILL)
-        else:
-            self.assertEqual(code, 0)
-        self.assertFalse(p.is_running())
-
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.terminate()
-        code = p.wait()
-        if os.name == 'posix':
-            self.assertEqual(code, signal.SIGTERM)
-        else:
-            self.assertEqual(code, 0)
-        self.assertFalse(p.is_running())
-
-        # check sys.exit() code
-        code = "import time, sys; time.sleep(0.01); sys.exit(5);"
-        sproc = get_test_subprocess([PYTHON, "-c", code])
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.wait(), 5)
-        self.assertFalse(p.is_running())
-
-        # Test wait() issued twice.
-        # It is not supposed to raise NSP when the process is gone.
-        # On UNIX this should return None, on Windows it should keep
-        # returning the exit code.
-        sproc = get_test_subprocess([PYTHON, "-c", code])
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.wait(), 5)
-        self.assertTrue(p.wait() in (5, None))
-
-        # test timeout
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.name
-        self.assertRaises(psutil.TimeoutExpired, p.wait, 0.01)
-
-    @skipUnless(POSIX)
-    def test_wait_non_children(self):
-        # test wait() against processes which are not our children
-        code = "import sys;"
-        code += "from subprocess import Popen, PIPE;"
-        code += "cmd = ['%s', '-c', 'import time; time.sleep(10)'];" %PYTHON
-        code += "sp = Popen(cmd, stdout=PIPE);"
-        code += "sys.stdout.write(str(sp.pid));"
-        sproc = get_test_subprocess([PYTHON, "-c", code], stdout=subprocess.PIPE)
-
-        grandson_pid = int(sproc.stdout.read())
-        grandson_proc = psutil.Process(grandson_pid)
-        try:
-            self.assertRaises(psutil.TimeoutExpired, grandson_proc.wait, 0.01)
-            grandson_proc.kill()
-            ret = grandson_proc.wait()
-            self.assertEqual(ret, None)
-        finally:
-            if grandson_proc.is_running():
-                grandson_proc.kill()
-                grandson_proc.wait()
-
-    def test_TOTAL_PHYMEM(self):
-        x = psutil.TOTAL_PHYMEM
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x > 0)
-
-    def test_BOOT_TIME(self):
-        x = psutil.BOOT_TIME
-        self.assertTrue(isinstance(x, float))
-        self.assertTrue(x > 0)
-
-    def test_used_phymem(self):
-        x = psutil.used_phymem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x > 0)
-
-    def test_avail_phymem(self):
-        x = psutil.avail_phymem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x > 0)
-
-    def test_total_virtmem(self):
-        x = psutil.total_virtmem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x >= 0)
-
-    def test_used_virtmem(self):
-        x = psutil.used_virtmem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x >= 0)
-
-    def test_avail_virtmem(self):
-        x = psutil.avail_virtmem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x >= 0)
-
-    @skipUnless(LINUX)
-    def test_cached_phymem(self):
-        x = psutil.cached_phymem()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x >= 0)
-
-    @skipUnless(LINUX)
-    def test_phymem_buffers(self):
-        x = psutil.phymem_buffers()
-        self.assertTrue(isinstance(x, (int, long)))
-        self.assertTrue(x >= 0)
-
-    def test_system_cpu_times(self):
-        total = 0
-        times = psutil.cpu_times()
-        sum(times)
-        for cp_time in times:
-            self.assertTrue(isinstance(cp_time, float))
-            self.assertTrue(cp_time >= 0.0)
-            total += cp_time
-        self.assertEqual(total, sum(times))
-        str(times)
-
-    def test_system_cpu_times2(self):
-        t1 = sum(psutil.cpu_times())
-        time.sleep(0.1)
-        t2 = sum(psutil.cpu_times())
-        difference = t2 - t1
-        if not difference >= 0.05:
-            self.fail("difference %s" % difference)
-
-    def test_system_cpu_percent(self):
-        psutil.cpu_percent(interval=0.001)
-        psutil.cpu_percent(interval=0.001)
-        for x in xrange(1000):
-            percent = psutil.cpu_percent(interval=None)
-            self.assertTrue(isinstance(percent, float))
-            self.assertTrue(percent >= 0.0)
-            self.assertTrue(percent <= 100.0)
-
-    def test_process_cpu_percent(self):
-        p = psutil.Process(os.getpid())
-        p.get_cpu_percent(interval=0.001)
-        p.get_cpu_percent(interval=0.001)
-        for x in xrange(100):
-            percent = p.get_cpu_percent(interval=None)
-            self.assertTrue(isinstance(percent, float))
-            self.assertTrue(percent >= 0.0)
-            self.assertTrue(percent <= 100.0)
-
-    def test_get_process_cpu_times(self):
-        times = psutil.Process(os.getpid()).get_cpu_times()
-        self.assertTrue((times.user > 0.0) or (times.system > 0.0))
-        # make sure returned values can be pretty printed with strftime
-        time.strftime("%H:%M:%S", time.localtime(times.user))
-        time.strftime("%H:%M:%S", time.localtime(times.system))
-
-    # Test Process.cpu_times() against os.times()
-    # os.times() is broken on Python 2.6
-    # http://bugs.python.org/issue1040026
-    # XXX fails on OSX: not sure if it's for os.times(). We should
-    # try this with Python 2.7 and re-enable the test.
-
-    @skipUnless(sys.version_info > (2, 6, 1) and not OSX)
-    def test_get_process_cpu_times2(self):
-        user_time, kernel_time = psutil.Process(os.getpid()).get_cpu_times()
-        utime, ktime = os.times()[:2]
-
-        # Use os.times()[:2] as base values to compare our results
-        # using a tolerance  of +/- 0.1 seconds.
-        # It will fail if the difference between the values is > 0.1s.
-        if (max([user_time, utime]) - min([user_time, utime])) > 0.1:
-            self.fail("expected: %s, found: %s" %(utime, user_time))
-
-        if (max([kernel_time, ktime]) - min([kernel_time, ktime])) > 0.1:
-            self.fail("expected: %s, found: %s" %(ktime, kernel_time))
-
-    def test_create_time(self):
-        sproc = get_test_subprocess()
-        now = time.time()
-        wait_for_pid(sproc.pid)
-        p = psutil.Process(sproc.pid)
-        create_time = p.create_time
-
-        # Use time.time() as base value to compare our result using a
-        # tolerance of +/- 1 second.
-        # It will fail if the difference between the values is > 2s.
-        difference = abs(create_time - now)
-        if difference > 2:
-            self.fail("expected: %s, found: %s, difference: %s"
-                      % (now, create_time, difference))
-
-        # make sure returned value can be pretty printed with strftime
-        time.strftime("%Y %m %d %H:%M:%S", time.localtime(p.create_time))
-
-    @skipIf(OSX, warn=False)
-    def test_get_io_counters(self):
-        p = psutil.Process(os.getpid())
-        # test reads
-        io1 = p.get_io_counters()
-        f = open(PYTHON, 'rb')
-        f.read()
-        f.close()
-        io2 = p.get_io_counters()
-        if not BSD:
-            self.assertTrue(io2.read_count > io1.read_count)
-            self.assertTrue(io2.write_count == io1.write_count)
-        self.assertTrue(io2.read_bytes >= io1.read_bytes)
-        self.assertTrue(io2.write_bytes >= io1.write_bytes)
-        # test writes
-        io1 = p.get_io_counters()
-        f = tempfile.TemporaryFile()
-        if sys.version_info >= (3,):
-            f.write(bytes("x" * 1000000, 'ascii'))
-        else:
-            f.write("x" * 1000000)
-        f.close()
-        io2 = p.get_io_counters()
-        if not BSD:
-            self.assertTrue(io2.write_count > io1.write_count)
-            self.assertTrue(io2.write_bytes > io1.write_bytes)
-        self.assertTrue(io2.read_count >= io1.read_count)
-        self.assertTrue(io2.read_bytes >= io1.read_bytes)
-
-    @skipUnless(LINUX)
-    def test_get_set_ionice(self):
-        from psutil import (IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE,
-                            IOPRIO_CLASS_IDLE)
-        self.assertEqual(IOPRIO_CLASS_NONE, 0)
-        self.assertEqual(IOPRIO_CLASS_RT, 1)
-        self.assertEqual(IOPRIO_CLASS_BE, 2)
-        self.assertEqual(IOPRIO_CLASS_IDLE, 3)
-        p = psutil.Process(os.getpid())
-        try:
-            p.set_ionice(2)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 4)
-            #
-            p.set_ionice(3)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 3)
-            self.assertEqual(value, 0)
-            #
-            p.set_ionice(2, 0)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 0)
-            p.set_ionice(2, 7)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 7)
-            self.assertRaises(ValueError, p.set_ionice, 2, 10)
-        finally:
-            p.set_ionice(IOPRIO_CLASS_NONE)
-
-    def test_get_num_threads(self):
-        # on certain platforms such as Linux we might test for exact
-        # thread number, since we always have with 1 thread per process,
-        # but this does not apply across all platforms (OSX, Windows)
-        p = psutil.Process(os.getpid())
-        step1 = p.get_num_threads()
-
-        thread = ThreadTask()
-        thread.start()
-        try:
-            step2 = p.get_num_threads()
-            self.assertEqual(step2, step1 + 1)
-            thread.stop()
-        finally:
-            if thread._running:
-                thread.stop()
-
-    def test_get_threads(self):
-        p = psutil.Process(os.getpid())
-        step1 = p.get_threads()
-
-        thread = ThreadTask()
-        thread.start()
-
-        try:
-            step2 = p.get_threads()
-            self.assertEqual(len(step2), len(step1) + 1)
-            # on Linux, first thread id is supposed to be this process
-            if LINUX:
-                self.assertEqual(step2[0].id, os.getpid())
-            athread = step2[0]
-            # test named tuple
-            self.assertEqual(athread.id, athread[0])
-            self.assertEqual(athread.user_time, athread[1])
-            self.assertEqual(athread.system_time, athread[2])
-            # test num threads
-            thread.stop()
-        finally:
-            if thread._running:
-                thread.stop()
-
-    def test_get_memory_info(self):
-        p = psutil.Process(os.getpid())
-
-        # step 1 - get a base value to compare our results
-        rss1, vms1 = p.get_memory_info()
-        percent1 = p.get_memory_percent()
-        self.assertTrue(rss1 > 0)
-        self.assertTrue(vms1 > 0)
-
-        # step 2 - allocate some memory
-        memarr = [None] * 1500000
-
-        rss2, vms2 = p.get_memory_info()
-        percent2 = p.get_memory_percent()
-        # make sure that the memory usage bumped up
-        self.assertTrue(rss2 > rss1)
-        self.assertTrue(vms2 >= vms1)  # vms might be equal
-        self.assertTrue(percent2 > percent1)
-        del memarr
-
-    def test_get_memory_percent(self):
-        p = psutil.Process(os.getpid())
-        self.assertTrue(p.get_memory_percent() > 0.0)
-
-    def test_pid(self):
-        sproc = get_test_subprocess()
-        self.assertEqual(psutil.Process(sproc.pid).pid, sproc.pid)
-
-    def test_eq(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        self.assertTrue(psutil.Process(sproc.pid) == psutil.Process(sproc.pid))
-
-    def test_is_running(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        p = psutil.Process(sproc.pid)
-        self.assertTrue(p.is_running())
-        p.kill()
-        p.wait()
-        self.assertFalse(p.is_running())
-
-    def test_pid_exists(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        self.assertTrue(psutil.pid_exists(sproc.pid))
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(sproc.pid))
-        self.assertFalse(psutil.pid_exists(-1))
-
-    def test_exe(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        try:
-            self.assertEqual(psutil.Process(sproc.pid).exe, PYTHON)
-        except AssertionError:
-            # certain platforms such as BSD are more accurate returning:
-            # "/usr/local/bin/python2.7"
-            # ...instead of:
-            # "/usr/local/bin/python"
-            # We do not want to consider this difference in accuracy
-            # an error.
-            extended_py_name = PYTHON + "%s.%s" % (sys.version_info.major,
-                                                   sys.version_info.minor)
-            self.assertEqual(psutil.Process(sproc.pid).exe, extended_py_name)
-        for p in psutil.process_iter():
-            try:
-                exe = p.exe
-            except psutil.Error:
-                continue
-            if not exe:
-                continue
-            if not os.path.exists(exe):
-                self.fail("%s does not exist (pid=%s, name=%s, cmdline=%s)" \
-                          % (repr(exe), p.pid, p.name, p.cmdline))
-            if hasattr(os, 'access') and hasattr(os, "X_OK"):
-                if not os.access(p.exe, os.X_OK):
-                    self.fail("%s is not executable (pid=%s, name=%s, cmdline=%s)" \
-                              % (repr(p.exe), p.pid, p.name, p.cmdline))
-
-    def test_path(self):
-        proc = psutil.Process(os.getpid())
-        warnings.filterwarnings("error")
-        try:
-            self.assertRaises(DeprecationWarning, getattr, proc, 'path')
-        finally:
-            warnings.resetwarnings()
-
-    def test_cmdline(self):
-        sproc = get_test_subprocess([PYTHON, "-E"])
-        wait_for_pid(sproc.pid)
-        self.assertEqual(psutil.Process(sproc.pid).cmdline, [PYTHON, "-E"])
-
-    def test_name(self):
-        sproc = get_test_subprocess(PYTHON)
-        wait_for_pid(sproc.pid)
-        if OSX:
-            self.assertEqual(psutil.Process(sproc.pid).name, "Python")
-        else:
-            self.assertEqual(psutil.Process(sproc.pid).name, os.path.basename(PYTHON))
-
-    if os.name == 'posix':
-
-        def test_uids(self):
-            p = psutil.Process(os.getpid())
-            real, effective, saved = p.uids
-            # os.getuid() refers to "real" uid
-            self.assertEqual(real, os.getuid())
-            # os.geteuid() refers to "effective" uid
-            self.assertEqual(effective, os.geteuid())
-            # no such thing as os.getsuid() ("saved" uid), but starting
-            # from python 2.7 we have os.getresuid()[2]
-            if hasattr(os, "getresuid"):
-                self.assertEqual(saved, os.getresuid()[2])
-
-        def test_gids(self):
-            p = psutil.Process(os.getpid())
-            real, effective, saved = p.gids
-            # os.getuid() refers to "real" uid
-            self.assertEqual(real, os.getgid())
-            # os.geteuid() refers to "effective" uid
-            self.assertEqual(effective, os.getegid())
-            # no such thing as os.getsuid() ("saved" uid), but starting
-            # from python 2.7 we have os.getresgid()[2]
-            if hasattr(os, "getresuid"):
-                self.assertEqual(saved, os.getresgid()[2])
-
-        def test_nice(self):
-            p = psutil.Process(os.getpid())
-            self.assertRaises(TypeError, setattr, p, "nice", "str")
-            first_nice = p.nice
-            try:
-                p.nice = 1
-                self.assertEqual(p.nice, 1)
-                # going back to previous nice value raises AccessDenied on OSX
-                if not OSX:
-                    p.nice = 0
-                    self.assertEqual(p.nice, 0)
-            finally:
-                # going back to previous nice value raises AccessDenied on OSX
-                if not OSX:
-                    p.nice = first_nice
-
-    if os.name == 'nt':
-
-        def test_nice(self):
-            p = psutil.Process(os.getpid())
-            self.assertRaises(TypeError, setattr, p, "nice", "str")
-            try:
-                self.assertEqual(p.nice, psutil.NORMAL_PRIORITY_CLASS)
-                p.nice = psutil.HIGH_PRIORITY_CLASS
-                self.assertEqual(p.nice, psutil.HIGH_PRIORITY_CLASS)
-                p.nice = psutil.NORMAL_PRIORITY_CLASS
-                self.assertEqual(p.nice, psutil.NORMAL_PRIORITY_CLASS)
-            finally:
-                p.nice = psutil.NORMAL_PRIORITY_CLASS
-
-    def test_status(self):
-        p = psutil.Process(os.getpid())
-        self.assertEqual(p.status, psutil.STATUS_RUNNING)
-        self.assertEqual(str(p.status), "running")
-        for p in psutil.process_iter():
-            if str(p.status) == '?':
-                self.fail("invalid status for pid %d" % p.pid)
-
-    def test_username(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        if POSIX:
-            import pwd
-            self.assertEqual(p.username, pwd.getpwuid(os.getuid()).pw_name)
-        elif WINDOWS:
-            expected_username = os.environ['USERNAME']
-            expected_domain = os.environ['USERDOMAIN']
-            domain, username = p.username.split('\\')
-            self.assertEqual(domain, expected_domain)
-            self.assertEqual(username, expected_username)
-        else:
-            p.username
-
-    @skipUnless(WINDOWS or LINUX)
-    def test_getcwd(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.getcwd(), os.getcwd())
-
-    @skipUnless(WINDOWS or LINUX)
-    def test_getcwd_2(self):
-        cmd = [PYTHON, "-c", "import os, time; os.chdir('..'); time.sleep(10)"]
-        sproc = get_test_subprocess(cmd)
-        wait_for_pid(sproc.pid)
-        p = psutil.Process(sproc.pid)
-        time.sleep(0.1)
-        expected_dir = os.path.dirname(os.getcwd())
-        self.assertEqual(p.getcwd(), expected_dir)
-
-    def test_get_open_files(self):
-        # current process
-        p = psutil.Process(os.getpid())
-        files = p.get_open_files()
-        self.assertFalse(TESTFN in files)
-        f = open(TESTFN, 'r')
-        time.sleep(.1)
-        filenames = [x.path for x in p.get_open_files()]
-        self.assertTrue(TESTFN in filenames)
-        f.close()
-        for file in filenames:
-            self.assertTrue(os.path.isfile(file))
-
-        # another process
-        cmdline = "import time; f = open(r'%s', 'r'); time.sleep(100);" % TESTFN
-        sproc = get_test_subprocess([PYTHON, "-c", cmdline])
-        wait_for_pid(sproc.pid)
-        time.sleep(0.1)
-        p = psutil.Process(sproc.pid)
-        filenames = [x.path for x in p.get_open_files()]
-        self.assertTrue(TESTFN in filenames)
-        for file in filenames:
-            self.assertTrue(os.path.isfile(file))
-        # all processes
-        for proc in psutil.process_iter():
-            try:
-                files = proc.get_open_files()
-            except psutil.Error:
-                pass
-            else:
-                for file in filenames:
-                    self.assertTrue(os.path.isfile(file))
-
-    def test_get_open_files2(self):
-        # test fd and path fields
-        fileobj = open(TESTFN, 'r')
-        p = psutil.Process(os.getpid())
-        for path, fd in p.get_open_files():
-            if path == fileobj.name or fd == fileobj.fileno():
-                break
-        else:
-            self.fail("no file found; files=%s" % repr(p.get_open_files()))
-        self.assertEqual(path, fileobj.name)
-        if WINDOWS:
-            self.assertEqual(fd, -1)
-        else:
-            self.assertEqual(fd, fileobj.fileno())
-        # test positions
-        ntuple = p.get_open_files()[0]
-        self.assertEqual(ntuple[0], ntuple.path)
-        self.assertEqual(ntuple[1], ntuple.fd)
-        # test file is gone
-        fileobj.close()
-        self.assertTrue(fileobj.name not in p.get_open_files())
-
-    @skipUnless(SUPPORT_CONNECTIONS, warn=1)
-    def test_get_connections(self):
-        arg = "import socket, time;" \
-              "s = socket.socket();" \
-              "s.bind(('127.0.0.1', 0));" \
-              "s.listen(1);" \
-              "conn, addr = s.accept();" \
-              "time.sleep(100);"
-        sproc = get_test_subprocess([PYTHON, "-c", arg])
-        time.sleep(0.1)
-        p = psutil.Process(sproc.pid)
-        cons = p.get_connections()
-        self.assertTrue(len(cons) == 1)
-        con = cons[0]
-        self.assertEqual(con.family, socket.AF_INET)
-        self.assertEqual(con.type, socket.SOCK_STREAM)
-        self.assertEqual(con.status, "LISTEN")
-        ip, port = con.local_address
-        self.assertEqual(ip, '127.0.0.1')
-        self.assertEqual(con.remote_address, ())
-        if WINDOWS:
-            self.assertEqual(con.fd, -1)
-        else:
-            self.assertTrue(con.fd > 0)
-        # test positions
-        self.assertEqual(con[0], con.fd)
-        self.assertEqual(con[1], con.family)
-        self.assertEqual(con[2], con.type)
-        self.assertEqual(con[3], con.local_address)
-        self.assertEqual(con[4], con.remote_address)
-        self.assertEqual(con[5], con.status)
-
-    @skipUnless(hasattr(socket, "fromfd") and not WINDOWS)
-    def test_connection_fromfd(self):
-        sock = socket.socket()
-        sock.bind(('127.0.0.1', 0))
-        sock.listen(1)
-        p = psutil.Process(os.getpid())
-        for conn in p.get_connections():
-            if conn.fd == sock.fileno():
-                break
-        else:
-            sock.close()
-            self.fail("couldn't find socket fd")
-        dupsock = socket.fromfd(conn.fd, conn.family, conn.type)
-        try:
-            self.assertEqual(dupsock.getsockname(), conn.local_address)
-            self.assertNotEqual(sock.fileno(), dupsock.fileno())
-        finally:
-            sock.close()
-            dupsock.close()
-
-    @skipUnless(SUPPORT_CONNECTIONS, warn=1)
-    def test_get_connections_all(self):
-
-        def check_address(addr, family):
-            if not addr:
-                return
-            ip, port = addr
-            self.assertTrue(isinstance(port, int))
-            if family == socket.AF_INET:
-                ip = map(int, ip.split('.'))
-                self.assertTrue(len(ip) == 4)
-                for num in ip:
-                    self.assertTrue(0 <= num <= 255)
-            self.assertTrue(0 <= port <= 65535)
-
-        def supports_ipv6():
-            if not socket.has_ipv6 or not hasattr(socket, "AF_INET6"):
-                return False
-            try:
-                sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
-                sock.bind(("::1", 0))
-            except (socket.error, socket.gaierror):
-                return False
-            else:
-                sock.close()
-                return True
-
-        # all values are supposed to match Linux's tcp_states.h states
-        # table across all platforms.
-        valid_states = ["ESTABLISHED", "SYN_SENT", "SYN_RECV", "FIN_WAIT1",
-                        "FIN_WAIT2", "TIME_WAIT", "CLOSE", "CLOSE_WAIT",
-                        "LAST_ACK", "LISTEN", "CLOSING", ""]
-
-        tcp_template = "import socket;" \
-                       "s = socket.socket($family, socket.SOCK_STREAM);" \
-                       "s.bind(('$addr', 0));" \
-                       "s.listen(1);" \
-                       "conn, addr = s.accept();"
-
-        udp_template = "import socket, time;" \
-                       "s = socket.socket($family, socket.SOCK_DGRAM);" \
-                       "s.bind(('$addr', 0));" \
-                       "time.sleep(100);"
-
-        from string import Template
-        tcp4_template = Template(tcp_template).substitute(family=socket.AF_INET,
-                                                          addr="127.0.0.1")
-        udp4_template = Template(udp_template).substitute(family=socket.AF_INET,
-                                                          addr="127.0.0.1")
-        tcp6_template = Template(tcp_template).substitute(family=socket.AF_INET6,
-                                                          addr="::1")
-        udp6_template = Template(udp_template).substitute(family=socket.AF_INET6,
-                                                          addr="::1")
-
-        # launch various subprocess instantiating a socket of various
-        # families  and tupes to enrich psutil results
-        tcp4_proc = get_test_subprocess([PYTHON, "-c", tcp4_template])
-        udp4_proc = get_test_subprocess([PYTHON, "-c", udp4_template])
-        if supports_ipv6():
-            tcp6_proc = get_test_subprocess([PYTHON, "-c", tcp6_template])
-            udp6_proc = get_test_subprocess([PYTHON, "-c", udp6_template])
-        else:
-            tcp6_proc = None
-            udp6_proc = None
-
-        # --- check connections of all processes
-
-        time.sleep(0.1)
-        for p in psutil.process_iter():
-            try:
-                cons = p.get_connections()
-            except (psutil.NoSuchProcess, psutil.AccessDenied):
-                pass
-            else:
-                for conn in cons:
-                    self.assertTrue(conn.type in (socket.SOCK_STREAM,
-                                                  socket.SOCK_DGRAM))
-                    self.assertTrue(conn.family in (socket.AF_INET,
-                                                    socket.AF_INET6))
-                    check_address(conn.local_address, conn.family)
-                    check_address(conn.remote_address, conn.family)
-                    if conn.status not in valid_states:
-                        self.fail("%s is not a valid status" %conn.status)
-                    # actually try to bind the local socket; ignore IPv6
-                    # sockets as their address might be represented as
-                    # an IPv4-mapped-address (e.g. "::127.0.0.1")
-                    # and that's rejected by bind()
-                    if conn.family == socket.AF_INET:
-                        s = socket.socket(conn.family, conn.type)
-                        s.bind((conn.local_address[0], 0))
-                        s.close()
-
-                    if not WINDOWS and hasattr(socket, 'fromfd'):
-                        try:
-                            dupsock = socket.fromfd(conn.fd, conn.family,
-                                                             conn.type)
-                        except (socket.error, OSError), err:
-                            if err.args[0] == errno.EBADF:
-                                continue
-                            else:
-                                raise
-                        # python >= 2.5
-                        if hasattr(dupsock, "family"):
-                            self.assertEqual(dupsock.family, conn.family)
-                            self.assertEqual(dupsock.type, conn.type)
-
-        # --- check matches against subprocesses
-
-        for p in psutil.Process(os.getpid()).get_children():
-            for conn in p.get_connections():
-                # TCP v4
-                if p.pid == tcp4_proc.pid:
-                    self.assertEqual(conn.family, socket.AF_INET)
-                    self.assertEqual(conn.type, socket.SOCK_STREAM)
-                    self.assertEqual(conn.local_address[0], "127.0.0.1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "LISTEN")
-                # UDP v4
-                elif p.pid == udp4_proc.pid:
-                    self.assertEqual(conn.family, socket.AF_INET)
-                    self.assertEqual(conn.type, socket.SOCK_DGRAM)
-                    self.assertEqual(conn.local_address[0], "127.0.0.1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "")
-                # TCP v6
-                elif p.pid == getattr(tcp6_proc, "pid", None):
-                    self.assertEqual(conn.family, socket.AF_INET6)
-                    self.assertEqual(conn.type, socket.SOCK_STREAM)
-                    self.assertEqual(conn.local_address[0], "::1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "LISTEN")
-                # UDP v6
-                elif p.pid == getattr(udp6_proc, "pid", None):
-                    self.assertEqual(conn.family, socket.AF_INET6)
-                    self.assertEqual(conn.type, socket.SOCK_DGRAM)
-                    self.assertEqual(conn.local_address[0], "::1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "")
-
-    def test_parent_ppid(self):
-        this_parent = os.getpid()
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.ppid, this_parent)
-        self.assertEqual(p.parent.pid, this_parent)
-        # no other process is supposed to have us as parent
-        for p in psutil.process_iter():
-            if p.pid == sproc.pid:
-                continue
-            self.assertTrue(p.ppid != this_parent)
-
-    def test_get_children(self):
-        p = psutil.Process(os.getpid())
-        self.assertEqual(p.get_children(), [])
-        sproc = get_test_subprocess()
-        children = p.get_children()
-        self.assertEqual(len(children), 1)
-        self.assertEqual(children[0].pid, sproc.pid)
-        self.assertEqual(children[0].ppid, os.getpid())
-
-    def test_suspend_resume(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.suspend()
-        time.sleep(0.1)
-        self.assertEqual(p.status, psutil.STATUS_STOPPED)
-        self.assertEqual(str(p.status), "stopped")
-        p.resume()
-        self.assertTrue(p.status != psutil.STATUS_STOPPED)
-
-    def test_get_pid_list(self):
-        plist = [x.pid for x in psutil.get_process_list()]
-        pidlist = psutil.get_pid_list()
-        self.assertEqual(plist.sort(), pidlist.sort())
-        # make sure every pid is unique
-        self.assertEqual(len(pidlist), len(set(pidlist)))
-
-    def test_test(self):
-        # test for psutil.test() function
-        stdout = sys.stdout
-        sys.stdout = DEVNULL
-        try:
-            psutil.test()
-        finally:
-            sys.stdout = stdout
-
-    def test_invalid_pid(self):
-        self.assertRaises(ValueError, psutil.Process, "1")
-        self.assertRaises(ValueError, psutil.Process, None)
-        # Refers to Issue #12
-        self.assertRaises(psutil.NoSuchProcess, psutil.Process, -1)
-
-    def test_zombie_process(self):
-        # Test that NoSuchProcess exception gets raised in case the
-        # process dies after we create the Process object.
-        # Example:
-        #  >>> proc = Process(1234)
-        #  >>> time.sleep(5)  # time-consuming task, process dies in meantime
-        #  >>> proc.name
-        # Refers to Issue #15
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "ppid")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "parent")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "name")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "exe")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "cmdline")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "status")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "create_time")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "username")
-        if hasattr(p, 'getcwd'):
-            self.assertRaises(psutil.NoSuchProcess, p.getcwd)
-        if POSIX:
-            self.assertRaises(psutil.NoSuchProcess, getattr, p, "uids")
-            self.assertRaises(psutil.NoSuchProcess, getattr, p, "gids")
-        self.assertRaises(psutil.NoSuchProcess, getattr, p, "nice")
-        try:
-            if os.name == 'posix':
-                p.nice = 1
-            else:
-                p.nice = psutil.NORMAL_PRIORITY_CLASS
-        except psutil.NoSuchProcess:
-            pass
-        else:
-            self.fail("exception not raised")
-        if hasattr(p, 'get_ionice'):
-            self.assertRaises(psutil.NoSuchProcess, p.get_ionice)
-            self.assertRaises(psutil.NoSuchProcess, p.set_ionice, 2)
-        if hasattr(p, 'get_io_counters'):
-            self.assertRaises(psutil.NoSuchProcess, p.get_io_counters)
-        self.assertRaises(psutil.NoSuchProcess, p.get_open_files)
-        self.assertRaises(psutil.NoSuchProcess, p.get_connections)
-        self.assertRaises(psutil.NoSuchProcess, p.suspend)
-        self.assertRaises(psutil.NoSuchProcess, p.resume)
-        self.assertRaises(psutil.NoSuchProcess, p.kill)
-        self.assertRaises(psutil.NoSuchProcess, p.terminate)
-        self.assertRaises(psutil.NoSuchProcess, p.send_signal, signal.SIGTERM)
-        self.assertRaises(psutil.NoSuchProcess, p.get_cpu_times)
-        self.assertRaises(psutil.NoSuchProcess, p.get_cpu_percent, 0)
-        self.assertRaises(psutil.NoSuchProcess, p.get_memory_info)
-        self.assertRaises(psutil.NoSuchProcess, p.get_memory_percent)
-        self.assertRaises(psutil.NoSuchProcess, p.get_children)
-        self.assertRaises(psutil.NoSuchProcess, p.get_num_threads)
-        self.assertRaises(psutil.NoSuchProcess, p.get_threads)
-        self.assertFalse(p.is_running())
-
-    def test__str__(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        self.assertTrue(str(sproc.pid) in str(p))
-        self.assertTrue(os.path.basename(PYTHON) in str(p))
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-        self.assertTrue(str(sproc.pid) in str(p))
-        self.assertTrue("terminated" in str(p))
-
-    def test_fetch_all(self):
-        valid_procs = 0
-        excluded_names = ['send_signal', 'suspend', 'resume', 'terminate',
-                          'kill', 'wait']
-        excluded_names += ['get_cpu_percent', 'path', 'uid', 'gid', 'get_children']
-        # XXX - skip slow lsof implementation;
-        if BSD:
-           excluded_names += ['get_open_files', 'get_connections']
-        if OSX:
-           excluded_names += ['get_connections']
-        attrs = []
-        for name in dir(psutil.Process):
-            if name.startswith("_"):
-                continue
-            if name.startswith("set_"):
-                continue
-            if name in excluded_names:
-                continue
-            attrs.append(name)
-
-        for p in psutil.process_iter():
-            for name in attrs:
-                try:
-                    try:
-                        attr = getattr(p, name, None)
-                        if attr is not None and callable(attr):
-                            ret = attr()
-                        else:
-                            ret = attr
-                        valid_procs += 1
-                    except (psutil.NoSuchProcess, psutil.AccessDenied), err:
-                        self.assertEqual(err.pid, p.pid)
-                        if err.name:
-                            self.assertEqual(err.name, p.name)
-                        self.assertTrue(str(err))
-                        self.assertTrue(err.msg)
-                    else:
-                        if name == 'parent' or ret in (0, 0.0, []):
-                            continue
-                        self.assertTrue(ret)
-                        if name == "exe":
-                            self.assertTrue(os.path.isfile(ret))
-                        elif name == "getcwd":
-                            self.assertTrue(os.path.isdir(ret))
-                except Exception, err:
-                    trace = traceback.format_exc()
-                    self.fail('%s\nmethod=%s, pid=%s, retvalue=%s'
-                              %(trace, name, p.pid, repr(ret)))
-
-        # we should always have a non-empty list, not including PID 0 etc.
-        # special cases.
-        self.assertTrue(valid_procs > 0)
-
-    def test_pid_0(self):
-        # Process(0) is supposed to work on all platforms even if with
-        # some differences
-        p = psutil.Process(0)
-        self.assertTrue(p.name)
-
-        if os.name == 'posix':
-            self.assertEqual(p.uids.real, 0)
-            self.assertEqual(p.gids.real, 0)
-
-        self.assertTrue(p.ppid in (0, 1))
-        #self.assertEqual(p.exe, "")
-        self.assertEqual(p.cmdline, [])
-        try:
-            p.get_num_threads()
-        except psutil.AccessDenied:
-            pass
-
-        if OSX : #and os.geteuid() != 0:
-            self.assertRaises(psutil.AccessDenied, p.get_memory_info)
-            self.assertRaises(psutil.AccessDenied, p.get_cpu_times)
-        else:
-            p.get_memory_info()
-
-        # username property
-        if POSIX:
-            self.assertEqual(p.username, 'root')
-        elif WINDOWS:
-            self.assertEqual(p.username, 'NT AUTHORITY\\SYSTEM')
-        else:
-            p.username
-
-        # PID 0 is supposed to be available on all platforms
-        self.assertTrue(0 in psutil.get_pid_list())
-        self.assertTrue(psutil.pid_exists(0))
-
-    def test_Popen(self):
-        # Popen class test
-        cmd = [PYTHON, "-c", "import time; time.sleep(3600);"]
-        proc = psutil.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        try:
-            proc.name
-            proc.stdin
-            self.assertTrue(hasattr(proc, 'name'))
-            self.assertTrue(hasattr(proc, 'stdin'))
-            self.assertRaises(AttributeError, getattr, proc, 'foo')
-        finally:
-            proc.kill()
-            proc.wait()
-
-
-if hasattr(os, 'getuid'):
-    class LimitedUserTestCase(TestCase):
-        """Repeat the previous tests by using a limited user.
-        Executed only on UNIX and only if the user who run the test script
-        is root.
-        """
-        # the uid/gid the test suite runs under
-        PROCESS_UID = os.getuid()
-        PROCESS_GID = os.getgid()
-
-        def setUp(self):
-            os.setegid(1000)
-            os.seteuid(1000)
-            TestCase.setUp(self)
-
-        def tearDown(self):
-            os.setegid(self.PROCESS_UID)
-            os.seteuid(self.PROCESS_GID)
-            TestCase.tearDown(self)
-
-        def test_path(self):
-            # DeprecationWarning is only raised once
-            pass
-
-        def test_nice(self):
-            try:
-                psutil.Process(os.getpid()).nice = -1
-            except psutil.AccessDenied:
-                pass
-            else:
-                self.fail("exception not raised")
-
-        # overridden tests known to raise AccessDenied when run
-        # as limited user on different platforms
-
-        if LINUX:
-
-            def test_getcwd(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_getcwd, self)
-
-            def test_getcwd_2(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_getcwd_2, self)
-
-            def test_get_open_files(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_get_open_files, self)
-
-            def test_get_connections(self):
-                pass
-
-            def test_exe(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_exe, self)
-
-        if BSD:
-
-            def test_get_open_files(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_get_open_files, self)
-
-            def test_get_open_files2(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_get_open_files, self)
-
-            def test_get_connections(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_get_connections, self)
-
-            def test_get_connections_all(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_get_connections_all, self)
-
-            def test_connection_fromfd(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_connection_fromfd, self)
-
-        if OSX:
-            def test_nice(self):
-                self.assertRaises(psutil.AccessDenied, TestCase.test_nice, self)
-
-
-def test_main():
-    tests = []
-    test_suite = unittest.TestSuite()
-    tests.append(TestCase)
-
-    if hasattr(os, 'getuid'):
-        if os.getuid() == 0:
-            tests.append(LimitedUserTestCase)
-        else:
-            atexit.register(warnings.warn, "Couldn't run limited user tests ("
-                          "super-user privileges are required)", RuntimeWarning)
-
-    if POSIX:
-        from _posix import PosixSpecificTestCase
-        tests.append(PosixSpecificTestCase)
-
-    # import the specific platform test suite
-    if LINUX:
-        from _linux import LinuxSpecificTestCase as stc
-    elif WINDOWS:
-        from _windows import WindowsSpecificTestCase as stc
-    elif OSX:
-        from _osx import OSXSpecificTestCase as stc
-    elif BSD:
-        from _bsd import BSDSpecificTestCase as stc
-    tests.append(stc)
-
-    for test_class in tests:
-        test_suite.addTest(unittest.makeSuite(test_class))
-
-    f = open(TESTFN, 'w')
-    f.close()
-    atexit.register(lambda: os.remove(TESTFN))
-
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-    DEVNULL.close()
-
-if __name__ == '__main__':
-    test_main()
-
-
diff --git a/contrib/psutil-0.6.1/CREDITS b/contrib/psutil-0.6.1/CREDITS
deleted file mode 100644
index 77d5e87..0000000
--- a/contrib/psutil-0.6.1/CREDITS
+++ /dev/null
@@ -1,119 +0,0 @@
-
-Intro
-=====
-
-We would like to recognize some of the people who have been instrumental in the
-development of psutil.
-I'm sure we are forgetting some people (feel free to email us), but here is a
-short list.
-It's modeled after the Linux CREDITS file where the fields are:
-name (N), e-mail (E), web-address (W), country (C), description (D), (I) issues
-(issue tracker is at http://code.google.com/p/psutil/issues/list).
-Really thanks to all of you.
-
-
-Maintainers
-===========
-
-N: Giampaolo Rodola'
-C: Italy
-E: g.rodola@gmail.com
-
-N: Jay Loden
-C: NJ, USA
-E: jloden@gmail.com
-W: http://www.jayloden.com
-
-
-Contributors
-============
-
-N: Jeremy Whitlock
-E: jcscoobyrs@gmail.com
-I: 125, 150, 174, 206
-
-N: wj32
-E: wj32.64@gmail.com
-D: process username() and get_connections() on Windows
-I: 114, 115
-
-N: Yan Raber
-C: Bologna, Italy
-E: yanraber@gmail.com
-D: help on Windows development
-
-N: Dave Daeschler
-C: USA
-E: david.daeschler@gmail.com
-D: initial design/bootstrap and continuing bug fixes
-
-N: cjgohlke
-E: cjgohlke@gmail.com
-D: Windows 64 bit support
-I: 107
-
-N: Jeffery Kline
-E: jeffery.kline@gmail.com
-I: 130
-
-N: Grabriel Monnerat
-E: gabrielmonnerat@gmail.com
-I: 146
-
-N: Philip Roberts
-E: philip.roberts@gmail.com
-I: 168
-
-N: jcscoobyrs
-E: jcscoobyrs@gmail.com
-I: 125
-
-N: Sandro Tosi
-E: sandro.tosi@gmail.com
-I: 200, 201
-
-N: Andrew Colin
-E: andrew.colin@gmail.com
-I: 248
-
-N: Amoser
-E: amoser@google.com
-I: 266, 267
-
-N: Matthew Grant
-E: matthewgrant5@gmail.com
-I: 271
-
-N: oweidner
-E: oweidner@cct.lsu.edu
-I: 275
-
-N: Tarek Ziade
-E: ziade.tarek
-I: 281
-
-N: Luca Cipriani
-C: Turin, Italy
-E: luca.opensource@gmail.com
-I: 278
-
-N: Maciej Lach,
-E: maciej.lach@gmail.com
-I: 294
-
-N: James Pye
-E: james.pye@gmail.com
-I: 305, 306
-
-N: Stanchev Emil
-E: stanchev.emil
-I: 314
-
-N: Kim Gräsman
-E: kim.grasman@gmail.com
-D: ...also kindly donated some money.
-I: 316
-
-N: Riccardo Murri
-C: Italy
-I: 318
diff --git a/contrib/psutil-0.6.1/HISTORY b/contrib/psutil-0.6.1/HISTORY
deleted file mode 100644
index ca0a9a1..0000000
--- a/contrib/psutil-0.6.1/HISTORY
+++ /dev/null
@@ -1,463 +0,0 @@
-Bug tracker at http://code.google.com/p/psutil/issues
-
-0.6.1 - 2012-08-16
-------------------
-
-NEW FEATURES
-
- * Issue 316: process cmdline property now makes a better job at guessing the
-   process executable from the cmdline.
-
-BUG FIXES
-
- * Issue 316: process exe was resolved in case it was a symlink.
- * Issue 318: python 2.4 compatibility was broken.
-
-API CHANGES
-
- * process exe can now return an empty string instead of raising AccessDenied.
- * process exe is no longer resolved in case it's a symlink.
-
-
-0.6.0 - 2012-08-13
-------------------
-
-NEW FEATURES
-
- * Issue 216: (UNIX) get_connections() UNIX sockets support.
- * Issue 220: (BSD) get_connections() has been rewritten in C and no longer
-   requires lsof.
- * Issue 222: (OSX) add support for process cwd.
- * Issue 261: process extended memory info.
- * Issue 295: (OSX) process executable path is now determined by asking the OS
-   instead of being guessed from process cmdline.
- * Issue 297: (OSX) the Process methods below were always raising AccessDenied
-   for any process except the current one. Now this is no longer true. Also they
-   are 2.5x faster.
-    - name
-    - get_memory_info()
-    - get_memory_percent()
-    - get_cpu_times()
-    - get_cpu_percent()
-    - get_num_threads()
- * Issue 300: examples/pmap.py script.
- * Issue 301: process_iter() now yields processes sorted by their PIDs.
- * Issue 302: process number of voluntary and involuntary context switches.
- * Issue 303: (Windows) the Process methods below were always raising
-   AccessDenied for any process not owned by current user. Now this is no longer
-   true:
-    - create_time
-    - get_cpu_times()
-    - get_cpu_percent()
-    - get_memory_info()
-    - get_memory_percent()
-    - get_num_handles()
-    - get_io_counters()
- * Issue 305: add examples/netstat.py script.
- * Issue 311: system memory functions has been refactorized and rewritten and
-   now provide a more detailed and consistent representation of the system
-   memory.
-   New psutil.virtual_memory() function provides the following memory amounts:
-    - total
-    - available
-    - percent
-    - used
-    - active (UNIX)
-    - inactive (UNIX)
-    - buffers (BSD, Linux)
-    - cached (BSD, OSX)
-    - wired (OSX, BSD)
-    - shared (BSD)
-   New psutil.swap_memory() provides:
-    - total
-    - used
-    - free
-    - percent
-    - sin (no. of bytes the system has swapped in from disk (cumulative))
-    - sout (no. of bytes the system has swapped out from disk (cumulative))
-   All old memory-related functions are deprecated.
-   Also two new example scripts were added:  free.py and meminfo.py.
- * Issue 312: psutil.network_io_counters() namedtuple includes 4 new fields:
-   errin, errout dropin and dropout, reflecting the number of packets dropped
-   and with errors.
-
-BUGFIXES
-
- * Issue 298: (OSX - BSD) memory leak in get_num_fds().
- * Issue 299: potential memory leak every time PyList_New(0) is used.
- * Issue 303: (Windows) potential heap corruption in get_num_threads() and
-   get_status() Process methods.
- * Issue 305: (BSD) psutil can't compile on FreeBSD 9 due to removal of utmp.h.
- * Issue 306: at C level, errors are not checked when invoking Py* functions
-   which create or manipulate Python objects leading to potential memory related
-   errors and/or segmentation faults.
- * Issue 307: (BSD) values returned by psutil.network_io_counters() are wrong.
- * Issue 308: (BSD / Windows) psutil.virtmem_usage() wasn't actually returning
-   information about swap memory usage as it was supposed to do. It does now.
- * Issue 309: get_open_files() might not return files which can not be accessed
-   due to limited permissions. AccessDenied is now raised instead.
-
-API CHANGES
-
- * psutil.phymem_usage() is deprecated             (use psutil.virtual_memory())
- * psutil.virtmem_usage() is deprecated            (use psutil.swap_memory())
- * psutil.phymem_buffers() on Linux is deprecated  (use psutil.virtual_memory())
- * psutil.cached_phymem() on Linux is deprecated   (use psutil.virtual_memory())
- * (Windows and BSD) psutil.virtmem_usage() now returns information about swap
-   memory instead of virtual memory.
-
-
-0.5.1 - 2012-06-29
-------------------
-
-NEW FEATURES
-
- * Issue 293: (Windows) process executable path is now determined by asking the
-   OS instead of being guessed from process cmdline.
-
-BUGFIXES
-
- * Issue 292: (Linux) race condition in process files/threads/connections.
- * Issue 294: (Windows) Process CPU affinity is only able to set CPU #0.
-
-
-0.5.0 - 2012-06-27
-------------------
-
-NEW FEATURES
-
- * Issue #195: (Windows) number of handles opened by process.
- * Issue #209: psutil.disk_partitions() now provides also mount options.
- * Issue #229: list users currently connected on the system (psutil.get_users()).
- * Issue #238: (Linux, Windows) process CPU affinity (get and set).
- * Issue #242: Process.get_children(recursive=True): return all process
-   descendants.
- * Issue #245: (POSIX) Process.wait() incrementally consumes less CPU cycles.
- * Issue #257: (Windows) removed Windows 2000 support.
- * Issue #258: (Linux) Process.get_memory_info() is now 0.5x faster.
- * Issue #260: process's mapped memory regions. (Windows patch by wj32.64, OSX
-   patch by Jeremy Whitlock)
- * Issue #262: (Windows) psutil.disk_partitions() was slow due to inspecting
-   the floppy disk drive also when "all" argument was False.
- * Issue #273: psutil.get_process_list() is deprecated.
- * Issue #274: psutil no longer requires 2to3 at installation time in order to
-   work with Python 3.
- * Issue #278: new Process.as_dict() method.
- * Issue #281: ppid, name, exe, cmdline and create_time properties of Process
-   class are now cached after being accessed.
- * Issue #282: psutil.STATUS_* constants can now be compared by using their
-   string representation.
- * Issue #283: speedup Process.is_running() by caching its return value in case
-   the process is terminated.
- * Issue #284: (POSIX) per-process number of opened file descriptors.
- * Issue #287: psutil.process_iter() now caches Process instances between calls.
- * Issue #290: Process.nice property is deprecated in favor of new get_nice()
-   and set_nice() methods.
-
-BUGFIXES
-
- * Issue #193: psutil.Popen constructor can throw an exception if the spawned
-   process terminates quickly.
- * Issue #240: (OSX) incorrect use of free() for Process.get_connections().
- * Issue #244: (POSIX) Process.wait() can hog CPU resources if called against
-   a process which is not our children.
- * Issue #248: (Linux) psutil.network_io_counters() might return erroneous NIC
-   names.
- * Issue #252: (Windows) process getcwd() erroneously raise NoSuchProcess for
-   processes owned by another user.  It now raises AccessDenied instead.
- * Issue #266: (Windows) psutil.get_pid_list() only shows 1024 processes.
-   (patch by Amoser)
- * Issue #267: (OSX) Process.get_connections() - an erroneous remote address
-   was returned. (Patch by Amoser)
- * Issue #272: (Linux) Porcess.get_open_files() - potential race condition can
-   lead to unexpected NoSuchProcess exception.  Also, we can get incorrect
-   reports of not absolutized path names.
- * Issue #275: (Linux) Process.get_io_counters() erroneously raise NoSuchProcess
-   on old Linux versions. Where not available it now raises NotImplementedError.
- * Issue #286: Process.is_running() doesn't actually check whether PID has been
-   reused.
- * Issue #314: Process.get_children() can sometimes return non-children.
-
-API CHANGES
-
- * Process.nice property is deprecated in favor of new get_nice() and set_nice()
-   methods.
- * psutil.get_process_list() is deprecated.
- * ppid, name, exe, cmdline and create_time properties of Process class are now
-   cached after being accessed, meaning NoSuchProcess will no longer be raised
-   in case the process is gone in the meantime.
- * psutil.STATUS_* constants can now be compared by using their string
-   representation.
-
-
-0.4.1 - 2011-12-14
-------------------
-
-BUGFIXES
-
- * Issue 228: some example scripts were not working with python 3.
- * Issue 230: (Windows / OSX) memory leak in Process.get_connections().
- * Issue 232: (Linux) psutil.phymem_usage() can report erroneous values which
-   are different than "free" command.
- * Issue 236: (Windows) memory/handle leak in Process's get_memory_info(),
-   suspend() and resume() methods.
-
-
-0.4.0 - 2011-10-29
-------------------
-
-NEW FEATURES
-
- * Issue 150: network I/O counters. (OSX and Windows patch by Jeremy Whitlock)
- * Issue 154: (FreeBSD) add support for process getcwd()
- * Issue 157: (Windows) provide installer for Python 3.2 64-bit.
- * Issue 198: Process.wait(timeout=0) can now be used to make wait() return
-   immediately.
- * Issue 206: disk I/O counters. (OSX and Windows patch by Jeremy Whitlock)
- * Issue 213: examples/iotop.py script.
- * Issue 217: Process.get_connections() now has a "kind" argument to filter
-   for connections with different criteria.
- * Issue 221: (FreeBSD) Process.get_open_files has been rewritten in C and no
-   longer relies on lsof.
- * Issue 223: examples/top.py script.
- * Issue 227: examples/nettop.py script.
-
-BUGFIXES
-
- * Issue 135: (OS X) psutil cannot create Process object
- * Issue 144: (Linux) no longer support 0 special PID.
- * Issue 188: (Linux) psutil import error on Linux ARM architectures.
- * Issue 194: (POSIX) psutil.Process.get_cpu_percent() now reports a percentage
-   over 100 on multicore processors.
- * Issue 197: (Linux) Process.get_connections() is broken on platforms not
-   supporting IPv6.
- * Issue 200: (Linux) psutil.NUM_CPUS not working on armel and sparc
-   architectures and causing crash on module import.
- * Issue 201: (Linux) Process.get_connections() is broken on big-endian
-   architectures.
- * Issue 211: Process instance can unexpectedly raise NoSuchProcess if tested
-   for equality with another object.
- * Issue 218: (Linux) crash at import time on Debian 64-bit because of a missing
-   line in /proc/meminfo.
- * Issue 226: (FreeBSD) crash at import time on FreeBSD 7 and minor.
-
-
-0.3.0 - 2011-07-08
-------------------
-
-NEW FEATURES
-
- * Issue 125: system per-cpu percentage utilization and times.
- * Issue 163: per-process associated terminal (TTY).
- * Issue 171: added get_phymem() and get_virtmem() functions returning system
-   memory information (total, used, free) and memory percent usage.
-   total_* avail_* and used_* memory functions are deprecated.
- * Issue 172: disk usage statistics.
- * Issue 174: mounted disk partitions.
- * Issue 179: setuptools is now used in setup.py
-
-BUGFIXES
-
- * Issue 159: SetSeDebug() does not close handles or unset impersonation on
-   return.
- * Issue 164: wait function raises a TimeoutException when a process returns
-   -1 (Windows).
- * Issue 165: process.status raises an unhandled exception.
- * Issue 166: get_memory_info() leaks handles hogging system resources.
- * Issue 168: psutil.cpu_percent() returns erroneous results when used in
-   non-blocking mode.  (patch by Philip Roberts)
- * Issue 178: OSX - Process.get_threads() leaks memory
- * Issue 180: Windows - Process's get_num_threads() and get_threads() methods
-   can raise NoSuchProcess exception while process still exists.
-
-
-0.2.1 - 2011-03-20
-------------------
-
-NEW FEATURES
-
- * Issue 64: per-process I/O counters.
- * Issue 116: per-process wait() (wait for process to terminate and return its
-   exit code).
- * Issue 134: per-process get_threads() returning information (id, user and
-   kernel times) about threads opened by process.
- * Issue 136: process executable path on FreeBSD is now determined by asking
-   the kernel instead of guessing it from cmdline[0].
- * Issue 137: per-process real, effective and saved user and group ids.
- * Issue 140: system boot time.
- * Issue 142: per-process get and set niceness (priority).
- * Issue 143: per-process status.
- * Issue 147: per-process I/O nice (priority) - Linux only.
- * Issue 148: psutil.Popen class which tidies up subprocess.Popen and
-   psutil.Process in a unique interface.
- * Issue 152: (OSX) get_process_open_files() implementation has been rewritten
-   in C and no longer relies on lsof resulting in a 3x speedup.
- * Issue 153: (OSX) get_process_connection() implementation has been rewritten
-   in C and no longer relies on lsof resulting in a 3x speedup.
-
-BUGFIXES
-
- * Issue 83: process cmdline is empty on OSX 64-bit.
- * Issue 130: a race condition can cause IOError exception be raised on
-   Linux if process disappears between open() and subsequent read() calls.
- * Issue 145: WindowsError was raised instead of psutil.AccessDenied when using
-   process resume() or suspend() on Windows.
- * Issue 146: 'exe' property on Linux can raise TypeError if path contains NULL
-   bytes.
- * Issue 151: exe and getcwd() for PID 0 on Linux return inconsistent data.
-
-API CHANGES
-
- * Process "uid" and "gid" properties are deprecated in favor of "uids" and
-   "gids" properties.
-
-
-0.2.0 - 2010-11-13
-------------------
-
-NEW FEATURES
-
- * Issue 79: per-process open files.
- * Issue 88: total system physical cached memory.
- * Issue 88: total system physical memory buffers used by the kernel.
- * Issue 91: per-process send_signal() and terminate() methods.
- * Issue 95: NoSuchProcess and AccessDenied exception classes now provide "pid",
-   "name" and "msg" attributes.
- * Issue 97: per-process children.
- * Issue 98: Process.get_cpu_times() and Process.get_memory_info now return
-   a namedtuple instead of a tuple.
- * Issue 103: per-process opened TCP and UDP connections.
- * Issue 107: add support for Windows 64 bit. (patch by cjgohlke)
- * Issue 111: per-process executable name.
- * Issue 113: exception messages now include process name and pid.
- * Issue 114: process username Windows implementation has been rewritten in pure
-   C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
-   longer required as a third-party dependancy. (patch by wj32)
- * Issue 117: added support for Windows 2000.
- * Issue 123: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
-   new 'interval' parameter.
- * Issue 129: per-process number of threads.
-
-BUGFIXES
-
- * Issue 80: fixed warnings when installing psutil with easy_install.
- * Issue 81: psutil fails to compile with Visual Studio.
- * Issue 94: suspend() raises OSError instead of AccessDenied.
- * Issue 86: psutil didn't compile against FreeBSD 6.x.
- * Issue 102: orphaned process handles obtained by using OpenProcess in C were
-   left behind every time Process class was instantiated.
- * Issue 111: path and name Process properties report truncated or erroneous
-   values on UNIX.
- * Issue 120: cpu_percent() always returning 100% on OS X.
- * Issue 112: uid and gid properties don't change if process changes effective
-   user/group id at some point.
- * Issue 126: ppid, uid, gid, name, exe, cmdline and create_time properties are
-   no longer cached and correctly raise NoSuchProcess exception if the process
-   disappears.
-
-API CHANGES
-
- * psutil.Process.path property is deprecated and works as an alias for "exe"
-   property.
- * psutil.Process.kill(): signal argument was removed - to send a signal to the
-   process use send_signal(signal) method instead.
- * psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
- * psutil.cpu_times() returns a nametuple instead of a tuple.
- * New psutil.Process methods: get_open_files(), get_connections(),
-   send_signal() and terminate().
- * ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
-   cached and raise NoSuchProcess exception if process disappears.
- * psutil.cpu_percent() no longer returns immediately (see issue 123).
- * psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
-   immediately by default (see issue 123).
-
-
-0.1.3 - 2010-03-02
-------------------
-
-NEW FEATURES
-
- * Issue 14: per-process username
- * Issue 51: per-process current working directory (Windows and Linux only)
- * Issue 59: Process.is_running() is now 10 times faster
- * Issue 61: added supoprt for FreeBSD 64 bit
- * Issue 71: implemented suspend/resume process
- * Issue 75: python 3 support
-
-BUGFIXES
-
- * Issue 36: process cpu_times() and memory_info() functions succeeded also for
-   dead processes while a NoSuchProcess exception is supposed to be raised.
- * Issue 48: incorrect size for mib array defined in getcmdargs for BSD
- * Issue 49: possible memory leak due to missing free() on error condition on
- * Issue 50: fixed getcmdargs() memory fragmentation on BSD
- * Issue 55: test_pid_4 was failing on Windows Vista
- * Issue 57: some unit tests were failing on systems where no swap memory is
-   available
- * Issue 58: is_running() is now called before kill() to make sure we are going
-   to kill the correct process.
- * Issue 73: virtual memory size reported on OS X includes shared library size
- * Issue 77: NoSuchProcess wasn't raised on Process.create_time if kill() was
-   used first.
-
-
-0.1.2 - 2009-05-06
-------------------
-
-NEW FEATURES
-
- * Issue 32: Per-process CPU user/kernel times
- * Issue 33: Process create time
- * Issue 34: Per-process CPU utilization percentage
- * Issue 38: Per-process memory usage (bytes)
- * Issue 41: Per-process memory utilization (percent)
- * Issue 39: System uptime
- * Issue 43: Total system virtual memory
- * Issue 46: Total system physical memory
- * Issue 44: Total system used/free virtual and physical memory
-
-BUGFIXES
-
- * Issue 36: NoSuchProcess not raised on Windows when accessing timing methods
- * Issue 40: test_get_cpu_times() failing on FreeBSD and OS X
- * Issue 42: get_memory_percent() raises AccessDenied on Windows
-
-
-0.1.1 - 2009-03-06
-------------------
-
-NEW FEATURES
-
- * Issue 4: FreeBSD support for all functions of psutil
- * Issue 9: Process.uid and Process.gid now retrieve process UID and GID.
- * Issue 11: Support for parent/ppid - Process.parent property returns a
-   Process object representing the parent process, and Process.ppid returns
-   the parent PID.
- * Issue 12 & 15: NoSuchProcess exception now raised when creating an object
-   for a nonexistent process, or when retrieving information about a process
-   that has gone away.
- * Issue 21: AccessDenied exception created for raising access denied errors
-   from OSError or WindowsError on individual platforms.
- * Issue 26: psutil.process_iter() function to iterate over processes as
-   Process objects with a generator.
- * Process objects can now also be compared with == operator for equality
-   (PID, name, command line are compared).
-
-BUGFIXES
-
- * Issue 16: Special case for Windows' "System Idle Process" (PID 0) which
-   otherwise would return an "invalid parameter" exception.
- * Issue 17: get_process_list() ignores NoSuchProcess and AccessDenied
-   exceptions during building of the list.
- * Issue 22: Process(0).kill() was failing on Windows with an unset exception
- * Issue 23: Special case for pid_exists(0)
- * Issue 24: Process(0).kill() now raises AccessDenied exception instead of
-   WindowsError.
- * Issue 30: psutil.get_pid_list() was returning two instances of PID 0 on OS
-   X and FreeBSD platforms.
-
-
-0.1.0 - 2009-01-27
-------------------
-
- * Initial release.
diff --git a/contrib/psutil-0.6.1/INSTALL b/contrib/psutil-0.6.1/INSTALL
deleted file mode 100644
index d887732..0000000
--- a/contrib/psutil-0.6.1/INSTALL
+++ /dev/null
@@ -1,110 +0,0 @@
-==================
-Using easy_install
-==================
-
-The easiest way to install psutil from sources is using easy_install.
-Get the latest easy_install version from http://pypi.python.org/pypi/setuptools
-and just run:
-
-    easy_install psutil
-
-This should get the most updated psutil version from the Python pypi repository,
-unpack it, compile it and install it automatically.
-
-
-===================================
-Installing on Windows using mingw32
-===================================
-
-After the mingw [1] environment is properly set up on your system you can
-compile Windows sources by entering:
-
-    setup.py build -c mingw32
-
-To compile and install just append the "install" keyword at the end of the
-command line above, like this:
-
-    setup.py build -c mingw32 install
-
-It might be possible that distutils will complain about missing gcc executable.
-That means you have to add mingw bin PATH variable first.
-Entering this line in the command prompt should do the work:
-
-    SET PATH=C:\MinGW\bin;%PATH%
-
-NOTE: this assumes MinGW is installed in C:\MinGW, if not simply replace the
-path in the command above with an appropriate location.
-
-[1] http://www.mingw.org/
-
-
-=========================================
-Installing on Windows using Visual Studio
-=========================================
-
-To use Visual Studio to install psutil, you must have the same version of
-Visual Studio used to compile your installation of Python. For older versions
-of Python that will be Visual Studio 2003. For 2.6 and later it should be
-Visual Studio 2008. If you do not have the requisite version of Visual Studio
-available then it is recommended to use MinGW to compile psutil instead.
-If you do have Visual Studio installed, you can use the basic distutils
-commands:
-
-     setup.py build
-
-...or to install and build:
-
-     setup.py install
-
-distutils should take care of any necessary magic to compile from there.
-
-
-==================
-Installing on OS X
-==================
-
-OS X installation from source will require gcc which you can obtain as part of
-the 'XcodeTools' installer from Apple. Then you can run the standard distutils
-commands.
-To build only:
-
-     python setup.py build
-
-To install and build:
-
-     python setup.py install
-
-NOTE: due to developer's hardware limitations psutil has only been compiled and
-tested on OS X 10.4.11 so may or may not work on other versions.
-
-
-=====================
-Installing on FreeBSD
-=====================
-
-The same compiler used to install Python must be present on the system in order
-to build modules using distutils. Assuming it is installed, you can build using
-the standard distutils commands.
-
-Build only:
-
-     python setup.py build
-
-Install and build:
-
-     python setup.py install
-
-
-===================
-Installing on Linux
-===================
-
-gcc is required and so the python headers. They can easily be installed by using
-the distro package manager. For example, on Ubuntu:
-
-     sudo apt-get install python-dev
-
-Once done, you can install/build psutil with:
-
-     python setup.py install
-
diff --git a/contrib/psutil-0.6.1/LICENSE b/contrib/psutil-0.6.1/LICENSE
deleted file mode 100644
index e91b135..0000000
--- a/contrib/psutil-0.6.1/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-psutil is distributed under BSD license reproduced below.
-
-Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola'
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
- * Neither the name of the psutil authors nor the names of its contributors
-   may be used to endorse or promote products derived from this software without
-   specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/contrib/psutil-0.6.1/MANIFEST.in b/contrib/psutil-0.6.1/MANIFEST.in
deleted file mode 100644
index 5cf37d0..0000000
--- a/contrib/psutil-0.6.1/MANIFEST.in
+++ /dev/null
@@ -1,9 +0,0 @@
-include CREDITS
-include HISTORY
-include LICENSE
-include MANIFEST.in
-include README
-include setup.py
-recursive-include psutil *.py *.c *.h
-recursive-include test *.py
-recursive-include examples *.py
diff --git a/contrib/psutil-0.6.1/PKG-INFO b/contrib/psutil-0.6.1/PKG-INFO
deleted file mode 100644
index 6e30f5d..0000000
--- a/contrib/psutil-0.6.1/PKG-INFO
+++ /dev/null
@@ -1,252 +0,0 @@
-Metadata-Version: 1.1
-Name: psutil
-Version: 0.6.1
-Summary: A process and system utilities module for Python
-Home-page: http://code.google.com/p/psutil/
-Author: Giampaolo Rodola
-Author-email: g.rodola <at> gmail <dot> com
-License: License :: OSI Approved :: BSD License
-Download-URL: http://psutil.googlecode.com/files/psutil-0.6.1.tar.gz
-Description: ===========
-        Quick links
-        ===========
-        
-        * `Home page <http://code.google.com/p/psutil>`_
-        * `Download <http://code.google.com/p/psutil/downloads/list>`_
-        * `Documentation <http://code.google.com/p/psutil/wiki/Documentation>`_
-        
-        =======
-        Summary
-        =======
-        
-        psutil is a module providing an interface for retrieving information on all
-        running processes and system utilization (CPU, memory, disks, network, users) in
-        a portable way by using Python, implementing many functionalities offered by
-        command line tools such as:  **ps, top, df, kill, free, lsof, free, netstat,
-        ifconfig, nice, ionice, iostat, iotop, uptime, pidof, tty, who, taskset, pmap**.
-        
-        It currently supports **Linux**, **Windows**, **OSX** and **FreeBSD** both
-        **32-bit** and **64-bit** with Python versions from **2.4** to **3.3** by using
-        a single code base.
-        
-        ==============
-        Example usages
-        ==============
-        
-        CPU
-        ===
-        
-        >>> import psutil
-        >>> psutil.cpu_times()
-        cputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540,
-                 iowait=629.509, irq=0.0, softirq=19.422)
-        >>>
-        >>> for x in range(3):
-        ...     psutil.cpu_percent(interval=1)
-        ...
-        4.0
-        5.9
-        3.8
-        >>>
-        >>> for x in range(3):
-        ...     psutil.cpu_percent(interval=1, percpu=True)
-        ...
-        [4.0, 6.9]
-        [7.0, 8.5]
-        [1.2, 9.0]
-        >>>
-        
-        
-        Memory
-        ======
-        
-        >>> psutil.virtual_memory()
-        vmem(total=8374149120L, available=2081050624L, percent=75.1, used=8074080256L,
-             free=300068864L, active=3294920704, inactive=1361616896, buffers=529895424L,
-             cached=1251086336)
-        >>> psutil.swap_memory()
-        swap(total=2097147904L, used=296128512L, free=1801019392L, percent=14.1,
-             sin=304193536, sout=677842944)
-        >>>
-        
-        
-        Disks
-        =====
-        
-        >>> psutil.disk_partitions()
-        [partition(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),
-         partition(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw')]
-        >>>
-        >>> psutil.disk_usage('/')
-        usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
-        >>>
-        >>> psutil.disk_io_counters()
-        iostat(read_count=719566, write_count=1082197, read_bytes=18626220032,
-               write_bytes=24081764352, read_time=5023392, write_time=63199568)
-        >>>
-        
-        
-        Network
-        =======
-        
-        >>> psutil.network_io_counters(pernic=True)
-        {'lo': iostat(bytes_sent=799953745, bytes_recv=799953745,
-                      packets_sent=453698, packets_recv=453698),
-         'eth0': iostat(bytes_sent=734324837, bytes_recv=4163935363,
-                        packets_sent=3605828, packets_recv=4096685)}
-        >>>
-        
-        
-        Users
-        =====
-        
-        >>> psutil.get_users()
-        [user(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0),
-         user(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0)]
-        >>>
-        
-        
-        Process management
-        ==================
-        
-        >>> import psutil
-        >>> psutil.get_pid_list()
-        [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
-        268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
-        2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245,
-        4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358,
-        4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235,
-        5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
-        >>>
-        >>> p = psutil.Process(7055)
-        >>> p.name
-        'python'
-        >>> p.exe
-        '/usr/bin/python'
-        >>> p.getcwd()
-        '/home/giampaolo'
-        >>> p.cmdline
-        ['/usr/bin/python', 'main.py']
-        >>>
-        >>> str(p.status)
-        'running'
-        >>> p.username
-        'giampaolo'
-        >>> p.create_time
-        1267551141.5019531
-        >>> p.terminal
-        '/dev/pts/0'
-        >>>
-        >>> p.uids
-        user(real=1000, effective=1000, saved=1000)
-        >>> p.gids
-        group(real=1000, effective=1000, saved=1000)
-        >>>
-        >>> p.get_cpu_times()
-        cputimes(user=1.02, system=0.31)
-        >>> p.get_cpu_percent(interval=1.0)
-        12.1
-        >>> p.get_cpu_affinity()
-        [0, 1, 2, 3]
-        >>> p.set_cpu_affinity([0])
-        >>>
-        >>> p.get_memory_percent()
-        0.63423
-        >>>
-        >>> p.get_memory_info()
-        meminfo(rss=7471104, vms=68513792)
-        >>> p.get_ext_memory_info()
-        meminfo(rss=9662464, vms=49192960, shared=3612672, text=2564096, lib=0, data=5754880, dirty=0)
-        >>> p.get_memory_maps()
-        [mmap(path='/lib/x86_64-linux-gnu/libutil-2.15.so', rss=16384, anonymous=8192, swap=0),
-         mmap(path='/lib/x86_64-linux-gnu/libc-2.15.so', rss=6384, anonymous=15, swap=0),
-         mmap(path='/lib/x86_64-linux-gnu/libcrypto.so.1.0.0', rss=34124, anonymous=1245, swap=0),
-         mmap(path='[heap]', rss=54653, anonymous=8192, swap=0),
-         mmap(path='[stack]', rss=1542, anonymous=166, swap=0),
-         ...]
-        >>>
-        >>> p.get_io_counters()
-        io(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632)
-        >>>
-        >>> p.get_open_files()
-        [openfile(path='/home/giampaolo/svn/psutil/somefile', fd=3)]
-        >>>
-        >>> p.get_connections()
-        [connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776),
-                    remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
-         connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761),
-                    remote_address=('72.14.234.100', 80), status='CLOSING'),
-         connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759),
-                    remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
-         connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314),
-                    remote_address=('72.14.234.83', 443), status='SYN_SENT')]
-        >>>
-        >>> p.get_num_threads()
-        4
-        >>> p.get_num_fds()
-        8
-        >>> p.get_threads()
-        [thread(id=5234, user_time=22.5, system_time=9.2891),
-         thread(id=5235, user_time=0.0, system_time=0.0),
-         thread(id=5236, user_time=0.0, system_time=0.0),
-         thread(id=5237, user_time=0.0707, system_time=1.1)]
-        >>>
-        >>> p.get_num_ctx_switches()
-        amount(voluntary=78, involuntary=19)
-        >>>
-        >>> p.get_nice()
-        0
-        >>> p.set_nice(10)
-        >>>
-        >>> p.suspend()
-        >>> p.resume()
-        >>>
-        >>> p.terminate()
-        >>> p.wait(timeout=3)
-        0
-        >>>
-        >>> psutil.test()
-        USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND
-        root           1  0.0  0.0   24584    2240 ?          Jun17   00:00  init
-        root           2  0.0  0.0       0       0 ?          Jun17   00:00  kthreadd
-        root           3  0.0  0.0       0       0 ?          Jun17   00:05  ksoftirqd/0
-        ...
-        giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4
-        giampaolo  31721  0.0  2.2  773060  181896 ?          00:04   10:30  chrome
-        root       31763  0.0  0.0       0       0 ?          00:05   00:00  kworker/0:1
-        >>>
-        
-Keywords: ps,top,kill,free,lsof,netstat,nice,tty,ionice,uptime,taskmgr,process,df,iotop,iostat,ifconfig,taskset,who,pidof,pmap,smem,monitoring
-Platform: Platform Independent
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft
-Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: POSIX :: BSD :: FreeBSD
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.0
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Topic :: System :: Monitoring
-Classifier: Topic :: System :: Networking
-Classifier: Topic :: System :: Networking :: Monitoring
-Classifier: Topic :: System :: Benchmark
-Classifier: Topic :: System :: Hardware
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: BSD License
diff --git a/contrib/psutil-0.6.1/README b/contrib/psutil-0.6.1/README
deleted file mode 100644
index 1710937..0000000
--- a/contrib/psutil-0.6.1/README
+++ /dev/null
@@ -1,208 +0,0 @@
-===========
-Quick links
-===========
-
-* `Home page <http://code.google.com/p/psutil>`_
-* `Download <http://code.google.com/p/psutil/downloads/list>`_
-* `Documentation <http://code.google.com/p/psutil/wiki/Documentation>`_
-
-=======
-Summary
-=======
-
-psutil is a module providing an interface for retrieving information on all
-running processes and system utilization (CPU, memory, disks, network, users) in
-a portable way by using Python, implementing many functionalities offered by
-command line tools such as:  **ps, top, df, kill, free, lsof, free, netstat,
-ifconfig, nice, ionice, iostat, iotop, uptime, pidof, tty, who, taskset, pmap**.
-
-It currently supports **Linux**, **Windows**, **OSX** and **FreeBSD** both
-**32-bit** and **64-bit** with Python versions from **2.4** to **3.3** by using
-a single code base.
-
-==============
-Example usages
-==============
-
-CPU
-===
-
->>> import psutil
->>> psutil.cpu_times()
-cputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540,
-         iowait=629.509, irq=0.0, softirq=19.422)
->>>
->>> for x in range(3):
-...     psutil.cpu_percent(interval=1)
-...
-4.0
-5.9
-3.8
->>>
->>> for x in range(3):
-...     psutil.cpu_percent(interval=1, percpu=True)
-...
-[4.0, 6.9]
-[7.0, 8.5]
-[1.2, 9.0]
->>>
-
-
-Memory
-======
-
->>> psutil.virtual_memory()
-vmem(total=8374149120L, available=2081050624L, percent=75.1, used=8074080256L,
-     free=300068864L, active=3294920704, inactive=1361616896, buffers=529895424L,
-     cached=1251086336)
->>> psutil.swap_memory()
-swap(total=2097147904L, used=296128512L, free=1801019392L, percent=14.1,
-     sin=304193536, sout=677842944)
->>>
-
-
-Disks
-=====
-
->>> psutil.disk_partitions()
-[partition(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),
- partition(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw')]
->>>
->>> psutil.disk_usage('/')
-usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
->>>
->>> psutil.disk_io_counters()
-iostat(read_count=719566, write_count=1082197, read_bytes=18626220032,
-       write_bytes=24081764352, read_time=5023392, write_time=63199568)
->>>
-
-
-Network
-=======
-
->>> psutil.network_io_counters(pernic=True)
-{'lo': iostat(bytes_sent=799953745, bytes_recv=799953745,
-              packets_sent=453698, packets_recv=453698),
- 'eth0': iostat(bytes_sent=734324837, bytes_recv=4163935363,
-                packets_sent=3605828, packets_recv=4096685)}
->>>
-
-
-Users
-=====
-
->>> psutil.get_users()
-[user(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0),
- user(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0)]
->>>
-
-
-Process management
-==================
-
->>> import psutil
->>> psutil.get_pid_list()
-[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
-268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
-2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245,
-4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358,
-4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235,
-5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
->>>
->>> p = psutil.Process(7055)
->>> p.name
-'python'
->>> p.exe
-'/usr/bin/python'
->>> p.getcwd()
-'/home/giampaolo'
->>> p.cmdline
-['/usr/bin/python', 'main.py']
->>>
->>> str(p.status)
-'running'
->>> p.username
-'giampaolo'
->>> p.create_time
-1267551141.5019531
->>> p.terminal
-'/dev/pts/0'
->>>
->>> p.uids
-user(real=1000, effective=1000, saved=1000)
->>> p.gids
-group(real=1000, effective=1000, saved=1000)
->>>
->>> p.get_cpu_times()
-cputimes(user=1.02, system=0.31)
->>> p.get_cpu_percent(interval=1.0)
-12.1
->>> p.get_cpu_affinity()
-[0, 1, 2, 3]
->>> p.set_cpu_affinity([0])
->>>
->>> p.get_memory_percent()
-0.63423
->>>
->>> p.get_memory_info()
-meminfo(rss=7471104, vms=68513792)
->>> p.get_ext_memory_info()
-meminfo(rss=9662464, vms=49192960, shared=3612672, text=2564096, lib=0, data=5754880, dirty=0)
->>> p.get_memory_maps()
-[mmap(path='/lib/x86_64-linux-gnu/libutil-2.15.so', rss=16384, anonymous=8192, swap=0),
- mmap(path='/lib/x86_64-linux-gnu/libc-2.15.so', rss=6384, anonymous=15, swap=0),
- mmap(path='/lib/x86_64-linux-gnu/libcrypto.so.1.0.0', rss=34124, anonymous=1245, swap=0),
- mmap(path='[heap]', rss=54653, anonymous=8192, swap=0),
- mmap(path='[stack]', rss=1542, anonymous=166, swap=0),
- ...]
->>>
->>> p.get_io_counters()
-io(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632)
->>>
->>> p.get_open_files()
-[openfile(path='/home/giampaolo/svn/psutil/somefile', fd=3)]
->>>
->>> p.get_connections()
-[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776),
-            remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
- connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761),
-            remote_address=('72.14.234.100', 80), status='CLOSING'),
- connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759),
-            remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
- connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314),
-            remote_address=('72.14.234.83', 443), status='SYN_SENT')]
->>>
->>> p.get_num_threads()
-4
->>> p.get_num_fds()
-8
->>> p.get_threads()
-[thread(id=5234, user_time=22.5, system_time=9.2891),
- thread(id=5235, user_time=0.0, system_time=0.0),
- thread(id=5236, user_time=0.0, system_time=0.0),
- thread(id=5237, user_time=0.0707, system_time=1.1)]
->>>
->>> p.get_num_ctx_switches()
-amount(voluntary=78, involuntary=19)
->>>
->>> p.get_nice()
-0
->>> p.set_nice(10)
->>>
->>> p.suspend()
->>> p.resume()
->>>
->>> p.terminate()
->>> p.wait(timeout=3)
-0
->>>
->>> psutil.test()
-USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND
-root           1  0.0  0.0   24584    2240 ?          Jun17   00:00  init
-root           2  0.0  0.0       0       0 ?          Jun17   00:00  kthreadd
-root           3  0.0  0.0       0       0 ?          Jun17   00:05  ksoftirqd/0
-...
-giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4
-giampaolo  31721  0.0  2.2  773060  181896 ?          00:04   10:30  chrome
-root       31763  0.0  0.0       0       0 ?          00:05   00:00  kworker/0:1
->>>
diff --git a/contrib/psutil-0.6.1/examples/disk_usage.py b/contrib/psutil-0.6.1/examples/disk_usage.py
deleted file mode 100644
index 1886b90..0000000
--- a/contrib/psutil-0.6.1/examples/disk_usage.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: disk_usage.py 1340 2012-06-09 13:42:21Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-List all mounted disk partitions a-la "df -h" command.
-"""
-
-import sys
-import psutil
-from psutil._compat import print_
-
-def bytes2human(n):
-    # http://code.activestate.com/recipes/578019
-    # >>> bytes2human(10000)
-    # '9.8K'
-    # >>> bytes2human(100001221)
-    # '95.4M'
-    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
-    prefix = {}
-    for i, s in enumerate(symbols):
-        prefix[s] = 1 << (i+1)*10
-    for s in reversed(symbols):
-        if n >= prefix[s]:
-            value = float(n) / prefix[s]
-            return '%.1f%s' % (value, s)
-    return "%sB" % n
-
-
-def main():
-    templ = "%-17s %8s %8s %8s %5s%% %9s  %s"
-    print_(templ % ("Device", "Total", "Used", "Free", "Use ", "Type", "Mount"))
-    for part in psutil.disk_partitions(all=False):
-        usage = psutil.disk_usage(part.mountpoint)
-        print_(templ % (part.device,
-                        bytes2human(usage.total),
-                        bytes2human(usage.used),
-                        bytes2human(usage.free),
-                        int(usage.percent),
-                        part.fstype,
-                        part.mountpoint))
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/contrib/psutil-0.6.1/examples/free.py b/contrib/psutil-0.6.1/examples/free.py
deleted file mode 100644
index 5f0278b..0000000
--- a/contrib/psutil-0.6.1/examples/free.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: free.py 1508 2012-08-13 12:30:07Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of 'free' cmdline utility.
-"""
-
-import psutil
-from psutil._compat import print_
-
-def main():
-    virt = psutil.virtual_memory()
-    swap = psutil.swap_memory()
-    templ = "%-7s %10s %10s %10s %10s %10s %10s"
-    print_(templ % ('', 'total', 'used', 'free', 'shared', 'buffers', 'cache'))
-    print_(templ % ('Mem:', int(virt.total / 1024),
-                            int(virt.used / 1024),
-                            int(virt.free / 1024),
-                            int(getattr(virt, 'shared', 0) / 1024),
-                            int(getattr(virt, 'buffers', 0) / 1024),
-                            int(getattr(virt, 'cached', 0) / 1024)))
-    print_(templ % ('Swap:', int(swap.total / 1024),
-                             int(swap.used / 1024),
-                             int(swap.free / 1024),
-                             '', '', ''))
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/iotop.py b/contrib/psutil-0.6.1/examples/iotop.py
deleted file mode 100644
index 9e0f377..0000000
--- a/contrib/psutil-0.6.1/examples/iotop.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: iotop.py 1236 2011-12-13 19:00:35Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of iotop (http://guichaz.free.fr/iotop/) showing real time
-disk I/O statistics.
-
-It works on Linux only (FreeBSD and OSX are missing support for IO
-counters).
-It doesn't work on Windows as curses module is required.
-
-Author: Giampaolo Rodola' <g.rodola@gmail.com>
-"""
-
-import os
-import sys
-import psutil
-if not hasattr(psutil.Process, 'get_io_counters') or os.name != 'posix':
-    sys.exit('platform not supported')
-import time
-import curses
-import atexit
-
-
-# --- curses stuff
-def tear_down():
-    win.keypad(0)
-    curses.nocbreak()
-    curses.echo()
-    curses.endwin()
-
-win = curses.initscr()
-atexit.register(tear_down)
-curses.endwin()
-lineno = 0
-
-def print_line(line, highlight=False):
-    """A thin wrapper around curses's addstr()."""
-    global lineno
-    try:
-        if highlight:
-            line += " " * (win.getmaxyx()[1] - len(line))
-            win.addstr(lineno, 0, line, curses.A_REVERSE)
-        else:
-            win.addstr(lineno, 0, line, 0)
-    except curses.error:
-        lineno = 0
-        win.refresh()
-        raise
-    else:
-        lineno += 1
-# --- /curses stuff
-
-
-def bytes2human(n):
-    """
-    >>> bytes2human(10000)
-    '9.8 K/s'
-    >>> bytes2human(100001221)
-    '95.4 M/s'
-    """
-    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
-    prefix = {}
-    for i, s in enumerate(symbols):
-        prefix[s] = 1 << (i+1)*10
-    for s in reversed(symbols):
-        if n >= prefix[s]:
-            value = float(n) / prefix[s]
-            return '%.2f %s/s' % (value, s)
-    return '%.2f B/s' % (n)
-
-def poll(interval):
-    """Calculate IO usage by comparing IO statics before and
-    after the interval.
-    Return a tuple including all currently running processes
-    sorted by IO activity and total disks I/O activity.
-    """
-    # first get a list of all processes and disk io counters
-    procs = [p for p in psutil.process_iter()]
-    for p in procs[:]:
-        try:
-            p._before = p.get_io_counters()
-        except psutil.Error:
-            procs.remove(p)
-            continue
-    disks_before = psutil.disk_io_counters()
-
-    # sleep some time
-    time.sleep(interval)
-
-    # then retrieve the same info again
-    for p in procs[:]:
-        try:
-            p._after = p.get_io_counters()
-            p._cmdline = ' '.join(p.cmdline)
-            if not p._cmdline:
-                p._cmdline = p.name
-            p._username = p.username
-        except psutil.NoSuchProcess:
-            procs.remove(p)
-    disks_after = psutil.disk_io_counters()
-
-    # finally calculate results by comparing data before and
-    # after the interval
-    for p in procs:
-        p._read_per_sec = p._after.read_bytes - p._before.read_bytes
-        p._write_per_sec = p._after.write_bytes - p._before.write_bytes
-        p._total = p._read_per_sec + p._write_per_sec
-
-    disks_read_per_sec = disks_after.read_bytes - disks_before.read_bytes
-    disks_write_per_sec = disks_after.write_bytes - disks_before.write_bytes
-
-    # sort processes by total disk IO so that the more intensive
-    # ones get listed first
-    processes = sorted(procs, key=lambda p: p._total, reverse=True)
-
-    return (processes, disks_read_per_sec, disks_write_per_sec)
-
-
-def refresh_window(procs, disks_read, disks_write):
-    """Print results on screen by using curses."""
-    curses.endwin()
-    templ = "%-5s %-7s %11s %11s  %s"
-    win.erase()
-
-    disks_tot = "Total DISK READ: %s | Total DISK WRITE: %s" \
-                % (bytes2human(disks_read), bytes2human(disks_write))
-    print_line(disks_tot)
-
-    header = templ % ("PID", "USER", "DISK READ", "DISK WRITE", "COMMAND")
-    print_line(header, highlight=True)
-
-    for p in procs:
-        line = templ % (p.pid,
-                        p._username[:7],
-                        bytes2human(p._read_per_sec),
-                        bytes2human(p._write_per_sec),
-                        p._cmdline)
-        try:
-            print_line(line)
-        except curses.error:
-            break
-    win.refresh()
-
-def main():
-    try:
-        interval = 0
-        while 1:
-            args = poll(interval)
-            refresh_window(*args)
-            interval = 1
-    except (KeyboardInterrupt, SystemExit):
-        pass
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/killall.py b/contrib/psutil-0.6.1/examples/killall.py
deleted file mode 100644
index 5381b54..0000000
--- a/contrib/psutil-0.6.1/examples/killall.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: killall.py 1143 2011-10-05 19:11:59Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Kill a process by name.
-"""
-
-import os
-import sys
-import psutil
-
-def main():
-    if len(sys.argv) != 2:
-        sys.exit('usage: %s name' % __file__)
-    else:
-        NAME = sys.argv[1]
-
-    killed = []
-    for proc in psutil.process_iter():
-        if proc.name == NAME and proc.pid != os.getpid():
-            proc.kill()
-            killed.append(proc.pid)
-    if not killed:
-        sys.exit('%s: no process found' % NAME)
-    else:
-        sys.exit(0)
-
-sys.exit(main())
diff --git a/contrib/psutil-0.6.1/examples/meminfo.py b/contrib/psutil-0.6.1/examples/meminfo.py
deleted file mode 100644
index f1bbbd8..0000000
--- a/contrib/psutil-0.6.1/examples/meminfo.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: meminfo.py 1509 2012-08-13 12:31:18Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Print system memory information.
-"""
-
-import psutil
-from psutil._compat import print_
-
-def to_meg(n):
-    return str(int(n / 1024 / 1024)) + "M"
-
-def pprint_ntuple(nt):
-    for name in nt._fields:
-        value = getattr(nt, name)
-        if name != 'percent':
-            value = to_meg(value)
-        print_('%-10s : %7s' % (name.capitalize(), value))
-
-def main():
-    print_('MEMORY\n------')
-    pprint_ntuple(psutil.virtual_memory())
-    print_('\nSWAP\n----')
-    pprint_ntuple(psutil.swap_memory())
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/netstat.py b/contrib/psutil-0.6.1/examples/netstat.py
deleted file mode 100644
index 24a9cf5..0000000
--- a/contrib/psutil-0.6.1/examples/netstat.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: netstat.py 1457 2012-07-14 18:09:36Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of 'netstat'.
-"""
-
-import socket
-from socket import AF_INET, SOCK_STREAM, SOCK_DGRAM
-
-import psutil
-from psutil._compat import print_
-
-
-AD = "-"
-AF_INET6 = getattr(socket, 'AF_INET6', object())
-proto_map = {(AF_INET, SOCK_STREAM)  : 'tcp',
-             (AF_INET6, SOCK_STREAM) : 'tcp6',
-             (AF_INET, SOCK_DGRAM)   : 'udp',
-             (AF_INET6, SOCK_DGRAM)  : 'udp6'}
-
-def main():
-    templ = "%-5s %-22s %-22s %-13s %-6s %s"
-    print_(templ % ("Proto", "Local addr", "Remote addr", "Status", "PID",
-                    "Program name"))
-    for p in psutil.process_iter():
-        name = '?'
-        try:
-            name = p.name
-            cons = p.get_connections(kind='inet')
-        except psutil.AccessDenied:
-            print_(templ % (AD, AD, AD, AD, p.pid, name))
-        else:
-            for c in cons:
-                raddr = ""
-                laddr = "%s:%s" % (c.local_address)
-                if c.remote_address:
-                    raddr = "%s:%s" % (c.remote_address)
-                print_(templ % (proto_map[(c.family, c.type)],
-                                laddr,
-                                raddr,
-                                str(c.status),
-                                p.pid,
-                                name[:15]))
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/nettop.py b/contrib/psutil-0.6.1/examples/nettop.py
deleted file mode 100644
index 17e504d..0000000
--- a/contrib/psutil-0.6.1/examples/nettop.py
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: iotop.py 1160 2011-10-14 18:50:36Z g.rodola@gmail.com $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Shows real-time network statistics.
-
-Author: Giampaolo Rodola' <g.rodola@gmail.com>
-"""
-
-import sys
-import os
-if os.name != 'posix':
-    sys.exit('platform not supported')
-import curses
-import atexit
-import time
-
-import psutil
-
-
-# --- curses stuff
-def tear_down():
-    win.keypad(0)
-    curses.nocbreak()
-    curses.echo()
-    curses.endwin()
-
-win = curses.initscr()
-atexit.register(tear_down)
-curses.endwin()
-lineno = 0
-
-def print_line(line, highlight=False):
-    """A thin wrapper around curses's addstr()."""
-    global lineno
-    try:
-        if highlight:
-            line += " " * (win.getmaxyx()[1] - len(line))
-            win.addstr(lineno, 0, line, curses.A_REVERSE)
-        else:
-            win.addstr(lineno, 0, line, 0)
-    except curses.error:
-        lineno = 0
-        win.refresh()
-        raise
-    else:
-        lineno += 1
-# --- curses stuff
-
-
-def bytes2human(n):
-    """
-    >>> bytes2human(10000)
-    '9.8 K'
-    >>> bytes2human(100001221)
-    '95.4 M'
-    """
-    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
-    prefix = {}
-    for i, s in enumerate(symbols):
-        prefix[s] = 1 << (i+1)*10
-    for s in reversed(symbols):
-        if n >= prefix[s]:
-            value = float(n) / prefix[s]
-            return '%.2f %s' % (value, s)
-    return '%.2f B' % (n)
-
-def poll(interval):
-    """Retrieve raw stats within an interval window."""
-    tot_before = psutil.network_io_counters()
-    pnic_before = psutil.network_io_counters(pernic=True)
-    # sleep some time
-    time.sleep(interval)
-    tot_after = psutil.network_io_counters()
-    pnic_after = psutil.network_io_counters(pernic=True)
-    return (tot_before, tot_after, pnic_before, pnic_after)
-
-
-def refresh_window(tot_before, tot_after, pnic_before, pnic_after):
-    """Print stats on screen."""
-    global lineno
-
-    # totals
-    print_line("total bytes:           sent: %-10s   received: %s" \
-          % (bytes2human(tot_after.bytes_sent),
-             bytes2human(tot_after.bytes_recv))
-    )
-    print_line("total packets:         sent: %-10s   received: %s" \
-          % (tot_after.packets_sent, tot_after.packets_recv)
-    )
-
-
-    # per-network interface details: let's sort network interfaces so
-    # that the ones which generated more traffic are shown first
-    print_line("")
-    nic_names = list(pnic_after.keys())
-    nic_names.sort(key=lambda x: sum(pnic_after[x]), reverse=True)
-    for name in nic_names:
-        stats_before = pnic_before[name]
-        stats_after = pnic_after[name]
-        templ = "%-15s %15s %15s"
-        print_line(templ % (name, "TOTAL", "PER-SEC"), highlight=True)
-        print_line(templ % (
-            "bytes-sent",
-            bytes2human(stats_after.bytes_sent),
-            bytes2human(stats_after.bytes_sent - stats_before.bytes_sent) + '/s',
-        ))
-        print_line(templ % (
-            "bytes-recv",
-            bytes2human(stats_after.bytes_recv),
-            bytes2human(stats_after.bytes_recv - stats_before.bytes_recv) + '/s',
-        ))
-        print_line(templ % (
-            "pkts-sent",
-            stats_after.packets_sent,
-            stats_after.packets_sent - stats_before.packets_sent,
-        ))
-        print_line(templ % (
-            "pkts-recv",
-            stats_after.packets_recv,
-            stats_after.packets_recv - stats_before.packets_recv,
-        ))
-        print_line("")
-    win.refresh()
-    lineno = 0
-
-
-def main():
-    try:
-        interval = 0
-        while 1:
-            args = poll(interval)
-            refresh_window(*args)
-            interval = 1
-    except (KeyboardInterrupt, SystemExit):
-        pass
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/pmap.py b/contrib/psutil-0.6.1/examples/pmap.py
deleted file mode 100644
index 740a305..0000000
--- a/contrib/psutil-0.6.1/examples/pmap.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: pmap.py 1420 2012-07-08 12:12:01Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of 'pmap' utility on Linux, 'vmmap' on OSX and 'procstat -v' on BSD.
-Report memory map of a process.
-"""
-
-import sys
-
-import psutil
-from psutil._compat import print_
-
-def main():
-    if len(sys.argv) != 2:
-        sys.exit('usage: pmap pid')
-    p = psutil.Process(int(sys.argv[1]))
-    print_("pid=%s, name=%s" % (p.pid, p.name))
-    templ = "%-16s %10s  %-7s %s"
-    print_(templ % ("Address", "RSS", "Mode", "Mapping"))
-    total_rss = 0
-    for m in p.get_memory_maps(grouped=False):
-        total_rss += m.rss
-        print_(templ % (m.addr.split('-')[0].zfill(16),
-                        str(m.rss / 1024) + 'K' ,
-                        m.perms,
-                        m.path))
-    print_("-" * 33)
-    print_(templ % ("Total", str(total_rss / 1024) + 'K', '', ''))
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/process_detail.py b/contrib/psutil-0.6.1/examples/process_detail.py
deleted file mode 100644
index 611f756..0000000
--- a/contrib/psutil-0.6.1/examples/process_detail.py
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: process_detail.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Print detailed information about a process.
-
-Author: Giampaolo Rodola' <g.rodola@gmail.com>
-"""
-
-import os
-import datetime
-import socket
-import sys
-
-import psutil
-
-
-def convert_bytes(n):
-    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
-    prefix = {}
-    for i, s in enumerate(symbols):
-        prefix[s] = 1 << (i+1)*10
-    for s in reversed(symbols):
-        if n >= prefix[s]:
-            value = float(n) / prefix[s]
-            return '%.1f%s' % (value, s)
-    return "%sB" % n
-
-def print_(a, b):
-    if sys.stdout.isatty() and os.name == 'posix':
-        fmt = '\x1b[1;32m%-17s\x1b[0m %s' %(a, b)
-    else:
-        fmt = '%-15s %s' %(a, b)
-    # python 2/3 compatibility layer
-    sys.stdout.write(fmt + '\n')
-    sys.stdout.flush()
-
-def run(pid):
-    ACCESS_DENIED = ''
-    try:
-        p = psutil.Process(pid)
-        pinfo = p.as_dict(ad_value=ACCESS_DENIED)
-    except psutil.NoSuchProcess:
-        sys.exit(str(sys.exc_info()[1]))
-
-    try:
-        if p.parent:
-            parent = '(%s)' % p.parent.name
-        else:
-            parent = ''
-    except psutil.Error:
-        parent = ''
-    started = datetime.datetime.fromtimestamp(pinfo['create_time']
-                                                ).strftime('%Y-%M-%d %H:%M')
-    io = pinfo.get('io_counters', None)
-    mem = '%s%% (resident=%s, virtual=%s) ' % (
-                                      round(pinfo['memory_percent'], 1),
-                                      convert_bytes(pinfo['memory_info'].rss),
-                                      convert_bytes(pinfo['memory_info'].vms))
-    children = p.get_children()
-
-    print_('pid', pinfo['pid'])
-    print_('name', pinfo['name'])
-    print_('exe', pinfo['exe'])
-    print_('parent', '%s %s' % (pinfo['ppid'], parent))
-    print_('cmdline', ' '.join(pinfo['cmdline']))
-    print_('started', started)
-    print_('user', pinfo['username'])
-    if os.name == 'posix':
-        print_('uids', 'real=%s, effective=%s, saved=%s' % pinfo['uids'])
-        print_('gids', 'real=%s, effective=%s, saved=%s' % pinfo['gids'])
-        print_('terminal', pinfo['terminal'] or '')
-    if hasattr(p, 'getcwd'):
-        print_('cwd', pinfo['cwd'])
-    print_('memory', mem)
-    print_('cpu', '%s%% (user=%s, system=%s)' % (pinfo['cpu_percent'],
-                                                 pinfo['cpu_times'].user,
-                                                 pinfo['cpu_times'].system))
-    print_('status', pinfo['status'])
-    print_('niceness', pinfo['nice'])
-    print_('num threads', pinfo['num_threads'])
-    if io != ACCESS_DENIED:
-        print_('I/O', 'bytes-read=%s, bytes-written=%s' % \
-                                               (convert_bytes(io.read_bytes),
-                                                convert_bytes(io.write_bytes)))
-    if children:
-        print_('children', '')
-        for child in children:
-            print_('', 'pid=%s name=%s' % (child.pid, child.name))
-
-    if pinfo['open_files'] != ACCESS_DENIED:
-        print_('open files', '')
-        for file in pinfo['open_files']:
-            print_('',  'fd=%s %s ' % (file.fd, file.path))
-
-    if pinfo['threads']:
-        print_('running threads', '')
-        for thread in pinfo['threads']:
-            print_('',  'id=%s, user-time=%s, sys-time=%s' \
-                         % (thread.id, thread.user_time, thread.system_time))
-    if pinfo['connections'] != ACCESS_DENIED:
-        print_('open connections', '')
-        for conn in pinfo['connections']:
-            if conn.type == socket.SOCK_STREAM:
-                type = 'TCP'
-            elif conn.type == socket.SOCK_DGRAM:
-                type = 'UDP'
-            else:
-                type = 'UNIX'
-            lip, lport = conn.local_address
-            if not conn.remote_address:
-                rip, rport = '*', '*'
-            else:
-                rip, rport = conn.remote_address
-            print_('',  '%s:%s -> %s:%s type=%s status=%s' \
-                         % (lip, lport, rip, rport, type, conn.status))
-
-def main(argv=None):
-    if argv is None:
-        argv = sys.argv
-    if len(argv) == 1:
-        sys.exit(run(os.getpid()))
-    elif len(argv) == 2:
-        sys.exit(run(int(argv[1])))
-    else:
-        sys.exit('usage: %s [pid]' % __file__)
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/contrib/psutil-0.6.1/examples/top.py b/contrib/psutil-0.6.1/examples/top.py
deleted file mode 100644
index a4d732c..0000000
--- a/contrib/psutil-0.6.1/examples/top.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: top.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of top / htop.
-
-Author: Giampaolo Rodola' <g.rodola@gmail.com>
-"""
-
-import os
-import sys
-if os.name != 'posix':
-    sys.exit('platform not supported')
-import time
-import curses
-import atexit
-from datetime import datetime, timedelta
-
-import psutil
-
-
-# --- curses stuff
-def tear_down():
-    win.keypad(0)
-    curses.nocbreak()
-    curses.echo()
-    curses.endwin()
-
-win = curses.initscr()
-atexit.register(tear_down)
-curses.endwin()
-lineno = 0
-
-def print_line(line, highlight=False):
-    """A thin wrapper around curses's addstr()."""
-    global lineno
-    try:
-        if highlight:
-            line += " " * (win.getmaxyx()[1] - len(line))
-            win.addstr(lineno, 0, line, curses.A_REVERSE)
-        else:
-            win.addstr(lineno, 0, line, 0)
-    except curses.error:
-        lineno = 0
-        win.refresh()
-        raise
-    else:
-        lineno += 1
-# --- /curses stuff
-
-
-def bytes2human(n):
-    """
-    >>> bytes2human(10000)
-    '9K'
-    >>> bytes2human(100001221)
-    '95M'
-    """
-    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
-    prefix = {}
-    for i, s in enumerate(symbols):
-        prefix[s] = 1 << (i+1)*10
-    for s in reversed(symbols):
-        if n >= prefix[s]:
-            value = int(float(n) / prefix[s])
-            return '%s%s' % (value, s)
-    return "%sB" % n
-
-def poll(interval):
-    # sleep some time
-    time.sleep(interval)
-    procs = []
-    procs_status = {}
-    for p in psutil.process_iter():
-        try:
-            p.dict = p.as_dict(['username', 'get_nice', 'get_memory_info',
-                                'get_memory_percent', 'get_cpu_percent',
-                                'get_cpu_times', 'name', 'status'])
-            try:
-                procs_status[str(p.dict['status'])] += 1
-            except KeyError:
-                procs_status[str(p.dict['status'])] = 1
-        except psutil.NoSuchProcess:
-            pass
-        else:
-            procs.append(p)
-
-    # return processes sorted by CPU percent usage
-    processes = sorted(procs, key=lambda p: p.dict['cpu_percent'], reverse=True)
-    return (processes, procs_status)
-
-def print_header(procs_status, num_procs):
-    """Print system-related info, above the process list."""
-
-    def get_dashes(perc):
-        dashes =  "|" * int((float(perc) / 10 * 4))
-        empty_dashes = " " * (40 - len(dashes))
-        return dashes, empty_dashes
-
-    # cpu usage
-    for cpu_num, perc in enumerate(psutil.cpu_percent(interval=0, percpu=True)):
-        dashes, empty_dashes = get_dashes(perc)
-        print_line(" CPU%-2s [%s%s] %5s%%" % (cpu_num, dashes, empty_dashes,
-                                              perc))
-    mem = psutil.virtual_memory()
-    dashes, empty_dashes = get_dashes(mem.percent)
-    used = mem.total - mem.available
-    line = " Mem   [%s%s] %5s%% %6s/%s" % (
-        dashes, empty_dashes,
-        mem.percent,
-        str(int(used / 1024 / 1024)) + "M",
-        str(int(mem.total / 1024 / 1024)) + "M"
-    )
-    print_line(line)
-
-    # swap usage
-    swap = psutil.swap_memory()
-    dashes, empty_dashes = get_dashes(swap.percent)
-    line = " Swap  [%s%s] %5s%% %6s/%s" % (
-        dashes, empty_dashes,
-        swap.percent,
-        str(int(swap.used / 1024 / 1024)) + "M",
-        str(int(swap.total / 1024 / 1024)) + "M"
-    )
-    print_line(line)
-
-    # processes number and status
-    st = []
-    for x, y in procs_status.items():
-        if y:
-            st.append("%s=%s" % (x, y))
-    st.sort(key=lambda x: x[:3] in ('run', 'sle'), reverse=1)
-    print_line(" Processes: %s (%s)" % (num_procs, ' '.join(st)))
-    # load average, uptime
-    uptime = datetime.now() - datetime.fromtimestamp(psutil.BOOT_TIME)
-    av1, av2, av3 = os.getloadavg()
-    line = " Load average: %.2f %.2f %.2f  Uptime: %s" \
-            % (av1, av2, av3, str(uptime).split('.')[0])
-    print_line(line)
-
-def refresh_window(procs, procs_status):
-    """Print results on screen by using curses."""
-    curses.endwin()
-    templ = "%-6s %-8s %4s %5s %5s %6s %4s %9s  %2s"
-    win.erase()
-    header = templ % ("PID", "USER", "NI", "VIRT", "RES", "CPU%", "MEM%",
-                      "TIME+", "NAME")
-    print_header(procs_status, len(procs))
-    print_line("")
-    print_line(header, highlight=True)
-    for p in procs:
-        # TIME+ column shows process CPU cumulative time and it
-        # is expressed as: "mm:ss.ms"
-        if p.dict['cpu_times'] != None:
-            ctime = timedelta(seconds=sum(p.dict['cpu_times']))
-            ctime = "%s:%s.%s" % (ctime.seconds // 60 % 60,
-                                  str((ctime.seconds % 60)).zfill(2),
-                                  str(ctime.microseconds)[:2])
-        else:
-            ctime = ''
-        if p.dict['memory_percent'] is not None:
-            p.dict['memory_percent'] = round(p.dict['memory_percent'], 1)
-        else:
-            p.dict['memory_percent'] = ''
-        if p.dict['cpu_percent'] is None:
-            p.dict['cpu_percent'] = ''
-        line = templ % (p.pid,
-                        p.dict['username'][:8],
-                        p.dict['nice'],
-                        bytes2human(getattr(p.dict['memory_info'], 'vms', 0)),
-                        bytes2human(getattr(p.dict['memory_info'], 'rss', 0)),
-                        p.dict['cpu_percent'],
-                        p.dict['memory_percent'],
-                        ctime,
-                        p.dict['name'] or '',
-                        )
-        try:
-            print_line(line)
-        except curses.error:
-            break
-        win.refresh()
-
-
-def main():
-    try:
-        interval = 0
-        while 1:
-            args = poll(interval)
-            refresh_window(*args)
-            interval = 1
-    except (KeyboardInterrupt, SystemExit):
-        pass
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/examples/who.py b/contrib/psutil-0.6.1/examples/who.py
deleted file mode 100644
index 4a28988..0000000
--- a/contrib/psutil-0.6.1/examples/who.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: who.py 1340 2012-06-09 13:42:21Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A clone of 'who' command; print information about users who are
-currently logged in.
-"""
-
-import sys
-from datetime import datetime
-
-import psutil
-from psutil._compat import print_
-
-
-def main():
-    users = psutil.get_users()
-    for user in users:
-        print_("%-15s %-15s %s  (%s)" % \
-            (user.name,
-             user.terminal or '-',
-             datetime.fromtimestamp(user.started).strftime("%Y-%m-%d %H:%M"),
-             user.host)
-        )
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/psutil.egg-info/PKG-INFO b/contrib/psutil-0.6.1/psutil.egg-info/PKG-INFO
deleted file mode 100644
index 6ce9d03..0000000
--- a/contrib/psutil-0.6.1/psutil.egg-info/PKG-INFO
+++ /dev/null
@@ -1,252 +0,0 @@
-Metadata-Version: 1.0
-Name: psutil
-Version: 0.6.1
-Summary: A process and system utilities module for Python
-Home-page: http://code.google.com/p/psutil/
-Author: Giampaolo Rodola
-Author-email: g.rodola <at> gmail <dot> com
-License: License :: OSI Approved :: BSD License
-Download-URL: http://psutil.googlecode.com/files/psutil-0.6.1.tar.gz
-Description: ===========
-        Quick links
-        ===========
-        
-        * `Home page <http://code.google.com/p/psutil>`_
-        * `Download <http://code.google.com/p/psutil/downloads/list>`_
-        * `Documentation <http://code.google.com/p/psutil/wiki/Documentation>`_
-        
-        =======
-        Summary
-        =======
-        
-        psutil is a module providing an interface for retrieving information on all
-        running processes and system utilization (CPU, memory, disks, network, users) in
-        a portable way by using Python, implementing many functionalities offered by
-        command line tools such as:  **ps, top, df, kill, free, lsof, free, netstat,
-        ifconfig, nice, ionice, iostat, iotop, uptime, pidof, tty, who, taskset, pmap**.
-        
-        It currently supports **Linux**, **Windows**, **OSX** and **FreeBSD** both
-        **32-bit** and **64-bit** with Python versions from **2.4** to **3.3** by using
-        a single code base.
-        
-        ==============
-        Example usages
-        ==============
-        
-        CPU
-        ===
-        
-        >>> import psutil
-        >>> psutil.cpu_times()
-        cputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540,
-                 iowait=629.509, irq=0.0, softirq=19.422)
-        >>>
-        >>> for x in range(3):
-        ...     psutil.cpu_percent(interval=1)
-        ...
-        4.0
-        5.9
-        3.8
-        >>>
-        >>> for x in range(3):
-        ...     psutil.cpu_percent(interval=1, percpu=True)
-        ...
-        [4.0, 6.9]
-        [7.0, 8.5]
-        [1.2, 9.0]
-        >>>
-        
-        
-        Memory
-        ======
-        
-        >>> psutil.virtual_memory()
-        vmem(total=8374149120L, available=2081050624L, percent=75.1, used=8074080256L,
-             free=300068864L, active=3294920704, inactive=1361616896, buffers=529895424L,
-             cached=1251086336)
-        >>> psutil.swap_memory()
-        swap(total=2097147904L, used=296128512L, free=1801019392L, percent=14.1,
-             sin=304193536, sout=677842944)
-        >>>
-        
-        
-        Disks
-        =====
-        
-        >>> psutil.disk_partitions()
-        [partition(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),
-         partition(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw')]
-        >>>
-        >>> psutil.disk_usage('/')
-        usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
-        >>>
-        >>> psutil.disk_io_counters()
-        iostat(read_count=719566, write_count=1082197, read_bytes=18626220032,
-               write_bytes=24081764352, read_time=5023392, write_time=63199568)
-        >>>
-        
-        
-        Network
-        =======
-        
-        >>> psutil.network_io_counters(pernic=True)
-        {'lo': iostat(bytes_sent=799953745, bytes_recv=799953745,
-                      packets_sent=453698, packets_recv=453698),
-         'eth0': iostat(bytes_sent=734324837, bytes_recv=4163935363,
-                        packets_sent=3605828, packets_recv=4096685)}
-        >>>
-        
-        
-        Users
-        =====
-        
-        >>> psutil.get_users()
-        [user(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0),
-         user(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0)]
-        >>>
-        
-        
-        Process management
-        ==================
-        
-        >>> import psutil
-        >>> psutil.get_pid_list()
-        [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
-        268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
-        2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245,
-        4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358,
-        4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235,
-        5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
-        >>>
-        >>> p = psutil.Process(7055)
-        >>> p.name
-        'python'
-        >>> p.exe
-        '/usr/bin/python'
-        >>> p.getcwd()
-        '/home/giampaolo'
-        >>> p.cmdline
-        ['/usr/bin/python', 'main.py']
-        >>>
-        >>> str(p.status)
-        'running'
-        >>> p.username
-        'giampaolo'
-        >>> p.create_time
-        1267551141.5019531
-        >>> p.terminal
-        '/dev/pts/0'
-        >>>
-        >>> p.uids
-        user(real=1000, effective=1000, saved=1000)
-        >>> p.gids
-        group(real=1000, effective=1000, saved=1000)
-        >>>
-        >>> p.get_cpu_times()
-        cputimes(user=1.02, system=0.31)
-        >>> p.get_cpu_percent(interval=1.0)
-        12.1
-        >>> p.get_cpu_affinity()
-        [0, 1, 2, 3]
-        >>> p.set_cpu_affinity([0])
-        >>>
-        >>> p.get_memory_percent()
-        0.63423
-        >>>
-        >>> p.get_memory_info()
-        meminfo(rss=7471104, vms=68513792)
-        >>> p.get_ext_memory_info()
-        meminfo(rss=9662464, vms=49192960, shared=3612672, text=2564096, lib=0, data=5754880, dirty=0)
-        >>> p.get_memory_maps()
-        [mmap(path='/lib/x86_64-linux-gnu/libutil-2.15.so', rss=16384, anonymous=8192, swap=0),
-         mmap(path='/lib/x86_64-linux-gnu/libc-2.15.so', rss=6384, anonymous=15, swap=0),
-         mmap(path='/lib/x86_64-linux-gnu/libcrypto.so.1.0.0', rss=34124, anonymous=1245, swap=0),
-         mmap(path='[heap]', rss=54653, anonymous=8192, swap=0),
-         mmap(path='[stack]', rss=1542, anonymous=166, swap=0),
-         ...]
-        >>>
-        >>> p.get_io_counters()
-        io(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632)
-        >>>
-        >>> p.get_open_files()
-        [openfile(path='/home/giampaolo/svn/psutil/somefile', fd=3)]
-        >>>
-        >>> p.get_connections()
-        [connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776),
-                    remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
-         connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761),
-                    remote_address=('72.14.234.100', 80), status='CLOSING'),
-         connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759),
-                    remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
-         connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314),
-                    remote_address=('72.14.234.83', 443), status='SYN_SENT')]
-        >>>
-        >>> p.get_num_threads()
-        4
-        >>> p.get_num_fds()
-        8
-        >>> p.get_threads()
-        [thread(id=5234, user_time=22.5, system_time=9.2891),
-         thread(id=5235, user_time=0.0, system_time=0.0),
-         thread(id=5236, user_time=0.0, system_time=0.0),
-         thread(id=5237, user_time=0.0707, system_time=1.1)]
-        >>>
-        >>> p.get_num_ctx_switches()
-        amount(voluntary=78, involuntary=19)
-        >>>
-        >>> p.get_nice()
-        0
-        >>> p.set_nice(10)
-        >>>
-        >>> p.suspend()
-        >>> p.resume()
-        >>>
-        >>> p.terminate()
-        >>> p.wait(timeout=3)
-        0
-        >>>
-        >>> psutil.test()
-        USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND
-        root           1  0.0  0.0   24584    2240 ?          Jun17   00:00  init
-        root           2  0.0  0.0       0       0 ?          Jun17   00:00  kthreadd
-        root           3  0.0  0.0       0       0 ?          Jun17   00:05  ksoftirqd/0
-        ...
-        giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4
-        giampaolo  31721  0.0  2.2  773060  181896 ?          00:04   10:30  chrome
-        root       31763  0.0  0.0       0       0 ?          00:05   00:00  kworker/0:1
-        >>>
-        
-Keywords: ps,top,kill,free,lsof,netstat,nice,tty,ionice,uptime,taskmgr,process,df,iotop,iostat,ifconfig,taskset,who,pidof,pmap,smem,monitoring
-Platform: Platform Independent
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft
-Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: POSIX :: BSD :: FreeBSD
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.0
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Topic :: System :: Monitoring
-Classifier: Topic :: System :: Networking
-Classifier: Topic :: System :: Networking :: Monitoring
-Classifier: Topic :: System :: Benchmark
-Classifier: Topic :: System :: Hardware
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: BSD License
diff --git a/contrib/psutil-0.6.1/psutil.egg-info/SOURCES.txt b/contrib/psutil-0.6.1/psutil.egg-info/SOURCES.txt
deleted file mode 100644
index 8cc3e6f..0000000
--- a/contrib/psutil-0.6.1/psutil.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-CREDITS
-HISTORY
-INSTALL
-LICENSE
-MANIFEST.in
-README
-setup.py
-examples/disk_usage.py
-examples/free.py
-examples/iotop.py
-examples/killall.py
-examples/meminfo.py
-examples/netstat.py
-examples/nettop.py
-examples/pmap.py
-examples/process_detail.py
-examples/top.py
-examples/who.py
-psutil/__init__.py
-psutil/_common.py
-psutil/_compat.py
-psutil/_psbsd.py
-psutil/_pslinux.py
-psutil/_psmswindows.py
-psutil/_psosx.py
-psutil/_psposix.py
-psutil/_psutil_bsd.c
-psutil/_psutil_bsd.h
-psutil/_psutil_common.c
-psutil/_psutil_common.h
-psutil/_psutil_linux.c
-psutil/_psutil_linux.h
-psutil/_psutil_mswindows.c
-psutil/_psutil_mswindows.h
-psutil/_psutil_osx.c
-psutil/_psutil_osx.h
-psutil/_psutil_posix.c
-psutil/_psutil_posix.h
-psutil/error.py
-psutil.egg-info/PKG-INFO
-psutil.egg-info/SOURCES.txt
-psutil.egg-info/dependency_links.txt
-psutil.egg-info/top_level.txt
-psutil/arch/bsd/process_info.c
-psutil/arch/bsd/process_info.h
-psutil/arch/mswindows/ntextapi.h
-psutil/arch/mswindows/process_handles.c
-psutil/arch/mswindows/process_handles.h
-psutil/arch/mswindows/process_info.c
-psutil/arch/mswindows/process_info.h
-psutil/arch/mswindows/security.c
-psutil/arch/mswindows/security.h
-psutil/arch/osx/process_info.c
-psutil/arch/osx/process_info.h
-test/_bsd.py
-test/_linux.py
-test/_osx.py
-test/_posix.py
-test/_windows.py
-test/test_memory_leaks.py
-test/test_psutil.py
\ No newline at end of file
diff --git a/contrib/psutil-0.6.1/psutil.egg-info/dependency_links.txt b/contrib/psutil-0.6.1/psutil.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/contrib/psutil-0.6.1/psutil.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/contrib/psutil-0.6.1/psutil.egg-info/top_level.txt b/contrib/psutil-0.6.1/psutil.egg-info/top_level.txt
deleted file mode 100644
index 2558a92..0000000
--- a/contrib/psutil-0.6.1/psutil.egg-info/top_level.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-psutil
-_psutil_linux
-_psutil_posix
diff --git a/contrib/psutil-0.6.1/psutil/__init__.py b/contrib/psutil-0.6.1/psutil/__init__.py
deleted file mode 100644
index 1215b81..0000000
--- a/contrib/psutil-0.6.1/psutil/__init__.py
+++ /dev/null
@@ -1,1195 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# $Id: __init__.py 1525 2012-08-16 16:32:03Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""psutil is a module providing convenience functions for managing
-processes and gather system information in a portable way by using
-Python.
-"""
-
-from __future__ import division
-
-__version__ = "0.6.1"
-version_info = tuple([int(num) for num in __version__.split('.')])
-
-__all__ = [
-    # exceptions
-    "Error", "NoSuchProcess", "AccessDenied", "TimeoutExpired",
-    # constants
-    "NUM_CPUS", "TOTAL_PHYMEM", "BOOT_TIME",
-    "version_info", "__version__",
-    "STATUS_RUNNING", "STATUS_IDLE", "STATUS_SLEEPING", "STATUS_DISK_SLEEP",
-    "STATUS_STOPPED", "STATUS_TRACING_STOP", "STATUS_ZOMBIE", "STATUS_DEAD",
-    "STATUS_WAKING", "STATUS_LOCKED",
-    # classes
-    "Process", "Popen",
-    # functions
-    "test", "pid_exists", "get_pid_list", "process_iter", "get_process_list",
-    "virtual_memory", "swap_memory",
-    "cpu_times", "cpu_percent", "per_cpu_percent",
-    "network_io_counters", "disk_io_counters",
-    ]
-
-import sys
-import os
-import time
-import signal
-import warnings
-import errno
-import subprocess
-try:
-    import pwd
-except ImportError:
-    pwd = None
-
-from psutil.error import Error, NoSuchProcess, AccessDenied, TimeoutExpired
-from psutil._compat import property, callable, defaultdict
-from psutil._common import cached_property
-from psutil._common import (deprecated as _deprecated,
-                            nt_disk_iostat as _nt_disk_iostat,
-                            nt_net_iostat as _nt_net_iostat,
-                            nt_sysmeminfo as _nt_sysmeminfo,
-                            isfile_strict as _isfile_strict)
-from psutil._common import (STATUS_RUNNING, STATUS_IDLE, STATUS_SLEEPING,
-                            STATUS_DISK_SLEEP, STATUS_STOPPED,
-                            STATUS_TRACING_STOP, STATUS_ZOMBIE, STATUS_DEAD,
-                            STATUS_WAKING, STATUS_LOCKED)
-
-# import the appropriate module for our platform only
-if sys.platform.startswith("linux"):
-    import psutil._pslinux as _psplatform
-    from psutil._pslinux import (phymem_buffers,
-                                 cached_phymem,
-                                 IOPRIO_CLASS_NONE,
-                                 IOPRIO_CLASS_RT,
-                                 IOPRIO_CLASS_BE,
-                                 IOPRIO_CLASS_IDLE)
-    phymem_buffers = _psplatform.phymem_buffers
-    cached_phymem = _psplatform.cached_phymem
-
-elif sys.platform.startswith("win32"):
-    import psutil._psmswindows as _psplatform
-    from psutil._psmswindows import (ABOVE_NORMAL_PRIORITY_CLASS,
-                                     BELOW_NORMAL_PRIORITY_CLASS,
-                                     HIGH_PRIORITY_CLASS,
-                                     IDLE_PRIORITY_CLASS,
-                                     NORMAL_PRIORITY_CLASS,
-                                     REALTIME_PRIORITY_CLASS)
-
-elif sys.platform.startswith("darwin"):
-    import psutil._psosx as _psplatform
-
-elif sys.platform.startswith("freebsd"):
-    import psutil._psbsd as _psplatform
-
-else:
-    raise NotImplementedError('platform %s is not supported' % sys.platform)
-
-__all__.extend(_psplatform.__extra__all__)
-
-NUM_CPUS = _psplatform.NUM_CPUS
-BOOT_TIME = _psplatform.BOOT_TIME
-TOTAL_PHYMEM = _psplatform.TOTAL_PHYMEM
-
-
-class Process(object):
-    """Represents an OS process."""
-
-    def __init__(self, pid):
-        """Create a new Process object for the given pid.
-        Raises NoSuchProcess if pid does not exist.
-        """
-        self._pid = pid
-        self._gone = False
-        # platform-specific modules define an _psplatform.Process
-        # implementation class
-        self._platform_impl = _psplatform.Process(pid)
-        self._last_sys_cpu_times = None
-        self._last_proc_cpu_times = None
-        # cache creation time for later use in is_running() method
-        try:
-            self.create_time
-        except AccessDenied:
-            pass
-        except NoSuchProcess:
-            raise NoSuchProcess(pid, None, 'no process found with pid %s' % pid)
-
-    def __str__(self):
-        try:
-            pid = self.pid
-            name = repr(self.name)
-        except NoSuchProcess:
-            details = "(pid=%s (terminated))" % self.pid
-        except AccessDenied:
-            details = "(pid=%s)" % (self.pid)
-        else:
-            details = "(pid=%s, name=%s)" % (pid, name)
-        return "%s.%s%s" % (self.__class__.__module__,
-                            self.__class__.__name__, details)
-
-    def __repr__(self):
-        return "<%s at %s>" % (self.__str__(), id(self))
-
-    def as_dict(self, attrs=[], ad_value=None):
-        """Utility method returning process information as a hashable
-        dictionary.
-
-        If 'attrs' is specified it must be a list of strings reflecting
-        available Process class's attribute names (e.g. ['get_cpu_times',
-        'name']) else all public (read only) attributes are assumed.
-
-        'ad_value' is the value which gets assigned to a dict key in case
-        AccessDenied exception is raised when retrieving that particular
-        process information.
-        """
-        excluded_names = set(['send_signal', 'suspend', 'resume', 'terminate',
-                              'kill', 'wait', 'is_running', 'as_dict', 'parent',
-                              'get_children', 'nice'])
-        retdict = dict()
-        for name in set(attrs or dir(self)):
-            if name.startswith('_'):
-                continue
-            if name.startswith('set_'):
-                continue
-            if name in excluded_names:
-                continue
-            try:
-                attr = getattr(self, name)
-                if callable(attr):
-                    if name == 'get_cpu_percent':
-                        ret = attr(interval=0)
-                    else:
-                        ret = attr()
-                else:
-                    ret = attr
-            except AccessDenied:
-                ret = ad_value
-            except NotImplementedError:
-                # in case of not implemented functionality (may happen
-                # on old or exotic systems) we want to crash only if
-                # the user explicitly asked for that particular attr
-                if attrs:
-                    raise
-                continue
-            if name.startswith('get'):
-                if name[3] == '_':
-                    name = name[4:]
-                elif name == 'getcwd':
-                    name = 'cwd'
-            retdict[name] = ret
-        return retdict
-
-    @property
-    def pid(self):
-        """The process pid."""
-        return self._pid
-
-    @cached_property
-    def ppid(self):
-        """The process parent pid."""
-        return self._platform_impl.get_process_ppid()
-
-    @property
-    def parent(self):
-        """Return the parent process as a Process object. If no parent
-        pid is known return None.
-        """
-        ppid = self.ppid
-        if ppid is not None:
-            try:
-                return Process(ppid)
-            except NoSuchProcess:
-                pass
-
-    @cached_property
-    def name(self):
-        """The process name."""
-        name = self._platform_impl.get_process_name()
-        if os.name == 'posix':
-            # On UNIX the name gets truncated to the first 15 characters.
-            # If it matches the first part of the cmdline we return that
-            # one instead because it's usually more explicative.
-            # Examples are "gnome-keyring-d" vs. "gnome-keyring-daemon".
-            try:
-                cmdline = self.cmdline
-            except AccessDenied:
-                pass
-            else:
-                if cmdline:
-                    extended_name = os.path.basename(cmdline[0])
-                    if extended_name.startswith(name):
-                        name = extended_name
-        # XXX - perhaps needs refactoring
-        self._platform_impl._process_name = name
-        return name
-
-    @cached_property
-    def exe(self):
-        """The process executable path. May also be an empty string."""
-        def guess_it(fallback):
-            # try to guess exe from cmdline[0] in absence of a native
-            # exe representation
-            cmdline = self.cmdline
-            if cmdline and hasattr(os, 'access') and hasattr(os, 'X_OK'):
-                exe = cmdline[0]  # the possible exe
-                rexe = os.path.realpath(exe)  # ...in case it's a symlink
-                if os.path.isabs(rexe) and os.path.isfile(rexe) \
-                and os.access(rexe, os.X_OK):
-                    return exe
-            if isinstance(fallback, AccessDenied):
-                raise fallback
-            return fallback
-
-        try:
-            exe = self._platform_impl.get_process_exe()
-        except AccessDenied:
-            err = sys.exc_info()[1]
-            return guess_it(fallback=err)
-        else:
-            if not exe:
-                # underlying implementation can legitimately return an
-                # empty string; if that's the case we don't want to
-                # raise AD while guessing from the cmdline
-                try:
-                    exe = guess_it(fallback=exe)
-                except AccessDenied:
-                    pass
-            return exe
-
-    @cached_property
-    def cmdline(self):
-        """The command line process has been called with."""
-        return self._platform_impl.get_process_cmdline()
-
-    @property
-    def status(self):
-        """The process current status as a STATUS_* constant."""
-        return self._platform_impl.get_process_status()
-
-    if os.name == 'posix':
-
-        @property
-        def uids(self):
-            """Return a named tuple denoting the process real,
-            effective, and saved user ids.
-            """
-            return self._platform_impl.get_process_uids()
-
-        @property
-        def gids(self):
-            """Return a named tuple denoting the process real,
-            effective, and saved group ids.
-            """
-            return self._platform_impl.get_process_gids()
-
-        @property
-        def terminal(self):
-            """The terminal associated with this process, if any,
-            else None.
-            """
-            return self._platform_impl.get_process_terminal()
-
-    @property
-    def username(self):
-        """The name of the user that owns the process.
-        On UNIX this is calculated by using *real* process uid.
-        """
-        if os.name == 'posix':
-            if pwd is None:
-                # might happen if python was installed from sources
-                raise ImportError("requires pwd module shipped with standard python")
-            return pwd.getpwuid(self.uids.real).pw_name
-        else:
-            return self._platform_impl.get_process_username()
-
-    @cached_property
-    def create_time(self):
-        """The process creation time as a floating point number
-        expressed in seconds since the epoch, in UTC.
-        """
-        return self._platform_impl.get_process_create_time()
-
-    def getcwd(self):
-        """Return a string representing the process current working
-        directory.
-        """
-        return self._platform_impl.get_process_cwd()
-
-    # Linux, BSD and Windows only
-    if hasattr(_psplatform.Process, "get_process_io_counters"):
-
-        def get_io_counters(self):
-            """Return process I/O statistics as a namedtuple including
-            the number of read/write calls performed and the amount of
-            bytes read and written by the process.
-            """
-            return self._platform_impl.get_process_io_counters()
-
-    def get_nice(self):
-        """Get process niceness (priority)."""
-        return self._platform_impl.get_process_nice()
-
-    def set_nice(self, value):
-        """Set process niceness (priority)."""
-        return self._platform_impl.set_process_nice(value)
-
-    # available only on Linux
-    if hasattr(_psplatform.Process, "get_process_ionice"):
-
-        def get_ionice(self):
-            """Return process I/O niceness (priority) as a namedtuple."""
-            return self._platform_impl.get_process_ionice()
-
-        def set_ionice(self, ioclass, value=None):
-            """Set process I/O niceness (priority).
-            ioclass is one of the IOPRIO_CLASS_* constants.
-            iodata is a number which goes from 0 to 7. The higher the
-            value, the lower the I/O priority of the process.
-            """
-            return self._platform_impl.set_process_ionice(ioclass, value)
-
-    # available on Windows and Linux only
-    if hasattr(_psplatform.Process, "get_process_cpu_affinity"):
-
-        def get_cpu_affinity(self):
-            """Get process current CPU affinity."""
-            return self._platform_impl.get_process_cpu_affinity()
-
-        def set_cpu_affinity(self, cpus):
-            """Set process current CPU affinity.
-            'cpus' is a list of CPUs for which you want to set the
-            affinity (e.g. [0, 1]).
-            """
-            return self._platform_impl.set_process_cpu_affinity(cpus)
-
-    if os.name == 'nt':
-
-        def get_num_handles(self):
-            """Return the number of handles opened by this process
-            (Windows only).
-            """
-            return self._platform_impl.get_num_handles()
-
-    if os.name == 'posix':
-
-        def get_num_fds(self):
-            """Return the number of file descriptors opened by this
-            process (POSIX only).
-            """
-            return self._platform_impl.get_num_fds()
-
-    def get_num_ctx_switches(self):
-        """Return the number voluntary and involuntary context switches
-        performed by this process.
-        """
-        return self._platform_impl.get_num_ctx_switches()
-
-    def get_num_threads(self):
-        """Return the number of threads used by this process."""
-        return self._platform_impl.get_process_num_threads()
-
-    def get_threads(self):
-        """Return threads opened by process as a list of namedtuples
-        including thread id and thread CPU times (user/system).
-        """
-        return self._platform_impl.get_process_threads()
-
-    def get_children(self, recursive=False):
-        """Return the children of this process as a list of Process
-        objects.
-        If recursive is True return all the parent descendants.
-
-        Example (A == this process):
-
-         A ─┐
-            │
-            ├─ B (child) ─┐
-            │             └─ X (grandchild) ─┐
-            │                                └─ Y (great grandchild)
-            ├─ C (child)
-            └─ D (child)
-
-        >>> p.get_children()
-        B, C, D
-        >>> p.get_children(recursive=True)
-        B, X, Y, C, D
-
-        Note that in the example above if process X disappears
-        process Y won't be returned either as the reference to
-        process A is lost.
-        """
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-
-        ret = []
-        if not recursive:
-            for p in process_iter():
-                try:
-                    if p.ppid == self.pid:
-                        # if child happens to be older than its parent
-                        # (self) it means child's PID has been reused
-                        if self.create_time <= p.create_time:
-                            ret.append(p)
-                except NoSuchProcess:
-                    pass
-        else:
-            # construct a dict where 'values' are all the processes
-            # having 'key' as their parent
-            table = defaultdict(list)
-            for p in process_iter():
-                try:
-                    table[p.ppid].append(p)
-                except NoSuchProcess:
-                    pass
-            # At this point we have a mapping table where table[self.pid]
-            # are the current process's children.
-            # Below, we look for all descendants recursively, similarly
-            # to a recursive function call.
-            checkpids = [self.pid]
-            for pid in checkpids:
-                for child in table[pid]:
-                    try:
-                        # if child happens to be older than its parent
-                        # (self) it means child's PID has been reused
-                        intime = self.create_time <= child.create_time
-                    except NoSuchProcess:
-                        pass
-                    else:
-                        if intime:
-                            ret.append(child)
-                            if child.pid not in checkpids:
-                                checkpids.append(child.pid)
-        return ret
-
-    def get_cpu_percent(self, interval=0.1):
-        """Return a float representing the current process CPU
-        utilization as a percentage.
-
-        When interval is > 0.0 compares process times to system CPU
-        times elapsed before and after the interval (blocking).
-
-        When interval is 0.0 or None compares process times to system CPU
-        times elapsed since last call, returning immediately.
-        In this case is recommended for accuracy that this function be
-        called with at least 0.1 seconds between calls.
-        """
-        blocking = interval is not None and interval > 0.0
-        if blocking:
-            st1 = sum(cpu_times())
-            pt1 = self._platform_impl.get_cpu_times()
-            time.sleep(interval)
-            st2 = sum(cpu_times())
-            pt2 = self._platform_impl.get_cpu_times()
-        else:
-            st1 = self._last_sys_cpu_times
-            pt1 = self._last_proc_cpu_times
-            st2 = sum(cpu_times())
-            pt2 = self._platform_impl.get_cpu_times()
-            if st1 is None or pt1 is None:
-                self._last_sys_cpu_times = st2
-                self._last_proc_cpu_times = pt2
-                return 0.0
-
-        delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system)
-        delta_time = st2 - st1
-        # reset values for next call in case of interval == None
-        self._last_sys_cpu_times = st2
-        self._last_proc_cpu_times = pt2
-
-        try:
-            # the utilization split between all CPUs
-            overall_percent = (delta_proc / delta_time) * 100
-        except ZeroDivisionError:
-            # interval was too low
-            return 0.0
-        # the utilization of a single CPU
-        single_cpu_percent = overall_percent * NUM_CPUS
-        # on posix a percentage > 100 is legitimate
-        # http://stackoverflow.com/questions/1032357/comprehending-top-cpu-usage
-        # on windows we use this ugly hack to avoid troubles with float
-        # precision issues
-        if os.name != 'posix':
-            if single_cpu_percent > 100.0:
-                return 100.0
-        return round(single_cpu_percent, 1)
-
-    def get_cpu_times(self):
-        """Return a tuple whose values are process CPU user and system
-        times. The same as os.times() but per-process.
-        """
-        return self._platform_impl.get_cpu_times()
-
-    def get_memory_info(self):
-        """Return a tuple representing RSS (Resident Set Size) and VMS
-        (Virtual Memory Size) in bytes.
-
-        On UNIX RSS and VMS are the same values shown by ps.
-
-        On Windows RSS and VMS refer to "Mem Usage" and "VM Size" columns
-        of taskmgr.exe.
-        """
-        return self._platform_impl.get_memory_info()
-
-    def get_ext_memory_info(self):
-        """Return a namedtuple with variable fields depending on the
-        platform representing extended memory information about
-        the process. All numbers are expressed in bytes.
-        """
-        return self._platform_impl.get_ext_memory_info()
-
-    def get_memory_percent(self):
-        """Compare physical system memory to process resident memory and
-        calculate process memory utilization as a percentage.
-        """
-        rss = self._platform_impl.get_memory_info()[0]
-        try:
-            return (rss / float(TOTAL_PHYMEM)) * 100
-        except ZeroDivisionError:
-            return 0.0
-
-    def get_memory_maps(self, grouped=True):
-        """Return process's mapped memory regions as a list of nameduples
-        whose fields are variable depending on the platform.
-
-        If 'grouped' is True the mapped regions with the same 'path'
-        are grouped together and the different memory fields are summed.
-
-        If 'grouped' is False every mapped region is shown as a single
-        entity and the namedtuple will also include the mapped region's
-        address space ('addr') and permission set ('perms').
-        """
-        it = self._platform_impl.get_memory_maps()
-        if grouped:
-            d = {}
-            for tupl in it:
-                path = tupl[2]
-                nums = tupl[3:]
-                try:
-                    d[path] = map(lambda x, y: x+y, d[path], nums)
-                except KeyError:
-                    d[path] = nums
-            nt = self._platform_impl.nt_mmap_grouped
-            return [nt(path, *d[path]) for path in d]
-        else:
-            nt = self._platform_impl.nt_mmap_ext
-            return [nt(*x) for x in it]
-
-    def get_open_files(self):
-        """Return files opened by process as a list of namedtuples
-        including absolute file name and file descriptor number.
-        """
-        return self._platform_impl.get_open_files()
-
-    def get_connections(self, kind='inet'):
-        """Return connections opened by process as a list of namedtuples.
-        The kind parameter filters for connections that fit the following
-        criteria:
-
-        Kind Value      Connections using
-        inet            IPv4 and IPv6
-        inet4           IPv4
-        inet6           IPv6
-        tcp             TCP
-        tcp4            TCP over IPv4
-        tcp6            TCP over IPv6
-        udp             UDP
-        udp4            UDP over IPv4
-        udp6            UDP over IPv6
-        unix            UNIX socket (both UDP and TCP protocols)
-        all             the sum of all the possible families and protocols
-        """
-        return self._platform_impl.get_connections(kind)
-
-    def is_running(self):
-        """Return whether this process is running."""
-        if self._gone:
-            return False
-        try:
-            # Checking if pid is alive is not enough as the pid might
-            # have been reused by another process.
-            # pid + creation time, on the other hand, is supposed to
-            # identify a process univocally.
-            return self.create_time == \
-                   self._platform_impl.get_process_create_time()
-        except NoSuchProcess:
-            self._gone = True
-            return False
-
-    def send_signal(self, sig):
-        """Send a signal to process (see signal module constants).
-        On Windows only SIGTERM is valid and is treated as an alias
-        for kill().
-        """
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        if os.name == 'posix':
-            try:
-                os.kill(self.pid, sig)
-            except OSError:
-                err = sys.exc_info()[1]
-                name = self._platform_impl._process_name
-                if err.errno == errno.ESRCH:
-                    raise NoSuchProcess(self.pid, name)
-                if err.errno == errno.EPERM:
-                    raise AccessDenied(self.pid, name)
-                raise
-        else:
-            if sig == signal.SIGTERM:
-                self._platform_impl.kill_process()
-            else:
-                raise ValueError("only SIGTERM is supported on Windows")
-
-    def suspend(self):
-        """Suspend process execution."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        # windows
-        if hasattr(self._platform_impl, "suspend_process"):
-            self._platform_impl.suspend_process()
-        else:
-            # posix
-            self.send_signal(signal.SIGSTOP)
-
-    def resume(self):
-        """Resume process execution."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        # windows
-        if hasattr(self._platform_impl, "resume_process"):
-            self._platform_impl.resume_process()
-        else:
-            # posix
-            self.send_signal(signal.SIGCONT)
-
-    def terminate(self):
-        """Terminate the process with SIGTERM.
-        On Windows this is an alias for kill().
-        """
-        self.send_signal(signal.SIGTERM)
-
-    def kill(self):
-        """Kill the current process."""
-        # safety measure in case the current process has been killed in
-        # meantime and the kernel reused its PID
-        if not self.is_running():
-            name = self._platform_impl._process_name
-            raise NoSuchProcess(self.pid, name)
-        if os.name == 'posix':
-            self.send_signal(signal.SIGKILL)
-        else:
-            self._platform_impl.kill_process()
-
-    def wait(self, timeout=None):
-        """Wait for process to terminate and, if process is a children
-        of the current one also return its exit code, else None.
-        """
-        if timeout is not None and not timeout >= 0:
-            raise ValueError("timeout must be a positive integer")
-        return self._platform_impl.process_wait(timeout)
-
-    # --- deprecated API
-
-    @property
-    def nice(self):
-        """Get or set process niceness (priority).
-        Deprecated, use get_nice() instead.
-        """
-        msg = "this property is deprecated; use Process.get_nice() method instead"
-        warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
-        return self.get_nice()
-
-    @nice.setter
-    def nice(self, value):
-        # invoked on "p.nice = num"; change process niceness
-        # deprecated in favor of set_nice()
-        msg = "this property is deprecated; use Process.set_nice() method instead"
-        warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
-        return self.set_nice(value)
-
-
-class Popen(Process):
-    """A more convenient interface to stdlib subprocess module.
-    It starts a sub process and deals with it exactly as when using
-    subprocess.Popen class but in addition also provides all the
-    property and methods of psutil.Process class in a single interface:
-
-      >>> import psutil
-      >>> from subprocess import PIPE
-      >>> p = psutil.Popen(["/usr/bin/python", "-c", "print 'hi'"], stdout=PIPE)
-      >>> p.name
-      'python'
-      >>> p.uids
-      user(real=1000, effective=1000, saved=1000)
-      >>> p.username
-      'giampaolo'
-      >>> p.communicate()
-      ('hi\n', None)
-      >>> p.terminate()
-      >>> p.wait(timeout=2)
-      0
-      >>>
-
-    For method names common to both classes such as kill(), terminate()
-    and wait(), psutil.Process implementation takes precedence.
-
-    For a complete documentation refers to:
-    http://docs.python.org/library/subprocess.html
-    """
-
-    def __init__(self, *args, **kwargs):
-        self.__subproc = subprocess.Popen(*args, **kwargs)
-        self._pid = self.__subproc.pid
-        self._gone = False
-        self._platform_impl = _psplatform.Process(self._pid)
-        self._last_sys_cpu_times = None
-        self._last_proc_cpu_times = None
-        try:
-            self.create_time
-        except AccessDenied:
-            pass
-        except NoSuchProcess:
-            raise NoSuchProcess(self._pid, None,
-                                "no process found with pid %s" % pid)
-
-    def __dir__(self):
-        return list(set(dir(Popen) + dir(subprocess.Popen)))
-
-    def __getattribute__(self, name):
-        try:
-            return object.__getattribute__(self, name)
-        except AttributeError:
-            try:
-                return object.__getattribute__(self.__subproc, name)
-            except AttributeError:
-                raise AttributeError("%s instance has no attribute '%s'"
-                                      %(self.__class__.__name__, name))
-
-
-# =====================================================================
-# --- system processes related functions
-# =====================================================================
-
-get_pid_list = _psplatform.get_pid_list
-pid_exists = _psplatform.pid_exists
-
-_pmap = {}
-
-def process_iter():
-    """Return a generator yielding a Process class instance for all
-    running processes on the local machine.
-
-    Every new Process instance is only created once and then cached
-    into an internal table which is updated every time this is used.
-
-    The sorting order in which processes are yielded is based on
-    their PIDs.
-    """
-    def add(pid):
-        proc = Process(pid)
-        _pmap[proc.pid] = proc
-        return proc
-
-    def remove(pid):
-        _pmap.pop(pid, None)
-
-    a = set(get_pid_list())
-    b = set(_pmap.keys())
-    new_pids = a - b
-    gone_pids = b - a
-
-    for pid in gone_pids:
-        remove(pid)
-    for pid, proc in sorted(list(_pmap.items()) + \
-                            list(dict.fromkeys(new_pids).items())):
-        try:
-            if proc is None:  # new process
-                yield add(pid)
-            else:
-                # use is_running() to check whether PID has been reused by
-                # another process in which case yield a new Process instance
-                if proc.is_running():
-                    yield proc
-                else:
-                    yield add(pid)
-        except NoSuchProcess:
-            remove(pid)
-        except AccessDenied:
-            # Process creation time can't be determined hence there's
-            # no way to tell whether the pid of the cached process
-            # has been reused. Just return the cached version.
-            yield proc
-
-# =====================================================================
-# --- CPU related functions
-# =====================================================================
-
-def cpu_times(percpu=False):
-    """Return system-wide CPU times as a namedtuple object.
-    Every CPU time represents the time CPU has spent in the given mode.
-    The attributes availability varies depending on the platform.
-    Here follows a list of all available attributes:
-     - user
-     - system
-     - idle
-     - nice (UNIX)
-     - iowait (Linux)
-     - irq (Linux, FreeBSD)
-     - softirq (Linux)
-
-    When percpu is True return a list of nameduples for each CPU.
-    First element of the list refers to first CPU, second element
-    to second CPU and so on.
-    The order of the list is consistent across calls.
-    """
-    if not percpu:
-        return _psplatform.get_system_cpu_times()
-    else:
-        return _psplatform.get_system_per_cpu_times()
-
-
-_last_cpu_times = cpu_times()
-_last_per_cpu_times = cpu_times(percpu=True)
-
-def cpu_percent(interval=0.1, percpu=False):
-    """Return a float representing the current system-wide CPU
-    utilization as a percentage.
-
-    When interval is > 0.0 compares system CPU times elapsed before
-    and after the interval (blocking).
-
-    When interval is 0.0 or None compares system CPU times elapsed
-    since last call or module import, returning immediately.
-    In this case is recommended for accuracy that this function be
-    called with at least 0.1 seconds between calls.
-
-    When percpu is True returns a list of floats representing the
-    utilization as a percentage for each CPU.
-    First element of the list refers to first CPU, second element
-    to second CPU and so on.
-    The order of the list is consistent across calls.
-    """
-    global _last_cpu_times
-    global _last_per_cpu_times
-    blocking = interval is not None and interval > 0.0
-
-    def calculate(t1, t2):
-        t1_all = sum(t1)
-        t1_busy = t1_all - t1.idle
-
-        t2_all = sum(t2)
-        t2_busy = t2_all - t2.idle
-
-        # this usually indicates a float precision issue
-        if t2_busy <= t1_busy:
-            return 0.0
-
-        busy_delta = t2_busy - t1_busy
-        all_delta = t2_all - t1_all
-        busy_perc = (busy_delta / all_delta) * 100
-        return round(busy_perc, 1)
-
-    # system-wide usage
-    if not percpu:
-        if blocking:
-            t1 = cpu_times()
-            time.sleep(interval)
-        else:
-            t1 = _last_cpu_times
-        _last_cpu_times = cpu_times()
-        return calculate(t1, _last_cpu_times)
-    # per-cpu usage
-    else:
-        ret = []
-        if blocking:
-            tot1 = cpu_times(percpu=True)
-            time.sleep(interval)
-        else:
-            tot1 = _last_per_cpu_times
-        _last_per_cpu_times = cpu_times(percpu=True)
-        for t1, t2 in zip(tot1, _last_per_cpu_times):
-            ret.append(calculate(t1, t2))
-        return ret
-
-# =====================================================================
-# --- system memory related functions
-# =====================================================================
-
-def virtual_memory():
-    """Return statistics about system memory usage as a namedtuple
-    including the following fields, expressed in bytes:
-
-     - total:
-       total physical memory available.
-
-     - available:
-       the actual amount of available memory that can be given
-       instantly to processes that request more memory in bytes; this
-       is calculated by summing different memory values depending on
-       the platform (e.g. free + buffers + cached on Linux) and it is
-       supposed to be used to monitor actual memory usage in a cross
-       platform fashion.
-
-     - percent:
-       the percentage usage calculated as (total - available) / total * 100
-
-     - used:
-       memory used, calculated differently depending on the platform and
-       designed for informational purposes only:
-        OSX: active + inactive + wired
-        BSD: active + wired + cached
-        LINUX: total - free
-
-     - free:
-       memory not being used at all (zeroed) that is readily available;
-       note that this doesn't reflect the actual memory available
-       (use 'available' instead)
-
-    Platform-specific fields:
-
-     - active (UNIX):
-       memory currently in use or very recently used, and so it is in RAM.
-
-     - inactive (UNIX):
-       memory that is marked as not used.
-
-     - buffers (BSD, Linux):
-       cache for things like file system metadata.
-
-     - cached (BSD, OSX):
-       cache for various things.
-
-     - wired (OSX, BSD):
-       memory that is marked to always stay in RAM. It is never moved to disk.
-
-     - shared (BSD):
-       memory that may be simultaneously accessed by multiple processes.
-
-    The sum of 'used' and 'available' does not necessarily equal total.
-    On Windows 'available' and 'free' are the same.
-    """
-    return _psplatform.virtual_memory()
-
-def swap_memory():
-    """Return system swap memory statistics as a namedtuple including
-    the following attributes:
-
-     - total:   total swap memory in bytes
-     - used:    used swap memory in bytes
-     - free:    free swap memory in bytes
-     - percent: the percentage usage
-     - sin:     no. of bytes the system has swapped in from disk (cumulative)
-     - sout:    no. of bytes the system has swapped out from disk (cumulative)
-
-    'sin' and 'sout' on Windows are meaningless and always set to 0.
-    """
-    return _psplatform.swap_memory()
-
-# =====================================================================
-# --- disks/paritions related functions
-# =====================================================================
-
-def disk_usage(path):
-    """Return disk usage statistics about the given path as a namedtuple
-    including total, used and free space expressed in bytes plus the
-    percentage usage.
-    """
-    return _psplatform.get_disk_usage(path)
-
-def disk_partitions(all=False):
-    """Return mounted partitions as a list of namedtuples including
-    device, mount point, filesystem type and mount options (a raw
-    string separated by commas which may vary depending on the platform).
-
-    If "all" parameter is False return physical devices only and ignore
-    all others.
-    """
-    return _psplatform.disk_partitions(all)
-
-def disk_io_counters(perdisk=False):
-    """Return system disk I/O statistics as a namedtuple including
-    the following attributes:
-
-     - read_count:  number of reads
-     - write_count: number of writes
-     - read_bytes:  number of bytes read
-     - write_bytes: number of bytes written
-     - read_time:   time spent reading from disk (in milliseconds)
-     - write_time:  time spent writing to disk (in milliseconds)
-
-    If perdisk is True return the same information for every
-    physical disk installed on the system as a dictionary
-    with partition names as the keys and the namedutuple
-    described above as the values.
-    """
-    rawdict = _psplatform.disk_io_counters()
-    if not rawdict:
-        raise RuntimeError("couldn't find any physical disk")
-    if perdisk:
-        for disk, fields in rawdict.items():
-            rawdict[disk] = _nt_disk_iostat(*fields)
-        return rawdict
-    else:
-        return _nt_disk_iostat(*[sum(x) for x in zip(*rawdict.values())])
-
-# =====================================================================
-# --- network related functions
-# =====================================================================
-
-def network_io_counters(pernic=False):
-    """Return network I/O statistics as a namedtuple including
-    the following attributes:
-
-     - bytes_sent:   number of bytes sent
-     - bytes_recv:   number of bytes received
-     - packets_sent: number of packets sent
-     - packets_recv: number of packets received
-     - errin:        total number of errors while receiving
-     - errout:       total number of errors while sending
-     - dropin:       total number of incoming packets which were dropped
-     - dropout:      total number of outgoing packets which were dropped
-                     (always 0 on OSX and BSD)
-
-    If pernic is True return the same information for every
-    network interface installed on the system as a dictionary
-    with network interface names as the keys and the namedtuple
-    described above as the values.
-    """
-    rawdict = _psplatform.network_io_counters()
-    if not rawdict:
-        raise RuntimeError("couldn't find any network interface")
-    if pernic:
-        for nic, fields in rawdict.items():
-            rawdict[nic] = _nt_net_iostat(*fields)
-        return rawdict
-    else:
-        return _nt_net_iostat(*[sum(x) for x in zip(*rawdict.values())])
-
-# =====================================================================
-# --- other system related functions
-# =====================================================================
-
-def get_users():
-    """Return users currently connected on the system as a list of
-    namedtuples including the following attributes.
-
-     - user: the name of the user
-     - terminal: the tty or pseudo-tty associated with the user, if any.
-     - host: the host name associated with the entry, if any.
-     - started: the creation time as a floating point number expressed in
-       seconds since the epoch.
-    """
-    return _psplatform.get_system_users()
-
-# =====================================================================
-# --- deprecated functions
-# =====================================================================
-
-@_deprecated()
-def get_process_list():
-    """Return a list of Process class instances for all running
-    processes on the local machine (deprecated).
-    """
-    return list(process_iter())
-
-@_deprecated()
-def phymem_usage():
-    """Return the amount of total, used and free physical memory
-    on the system in bytes plus the percentage usage.
-    Deprecated by psutil.virtual_memory().
-    """
-    mem = virtual_memory()
-    return _nt_sysmeminfo(mem.total, mem.used, mem.free, mem.percent)
-
-@_deprecated("psutil.swap_memory()")
-def virtmem_usage():
-    return swap_memory()
-
-@_deprecated("psutil.phymem_usage().free")
-def avail_phymem():
-    return phymem_usage().free
-
-@_deprecated("psutil.phymem_usage().used")
-def used_phymem():
-    return phymem_usage().used
-
-@_deprecated("psutil.virtmem_usage().total")
-def total_virtmem():
-    return virtmem_usage().total
-
-@_deprecated("psutil.virtmem_usage().used")
-def used_virtmem():
-    return virtmem_usage().used
-
-@_deprecated("psutil.virtmem_usage().free")
-def avail_virtmem():
-    return virtmem_usage().free
-
-def test():
-    """List info of all currently running processes emulating ps aux
-    output.
-    """
-    import datetime
-    from psutil._compat import print_
-
-    today_day = datetime.date.today()
-    templ = "%-10s %5s %4s %4s %7s %7s %-13s %5s %7s  %s"
-    attrs = ['pid', 'username', 'get_cpu_percent', 'get_memory_percent', 'name',
-             'get_cpu_times', 'create_time', 'get_memory_info']
-    if os.name == 'posix':
-        attrs.append('terminal')
-    print_(templ % ("USER", "PID", "%CPU", "%MEM", "VSZ", "RSS", "TTY", "START",
-                    "TIME", "COMMAND"))
-    for p in sorted(process_iter(), key=lambda p: p.pid):
-        try:
-            pinfo = p.as_dict(attrs, ad_value='')
-        except NoSuchProcess:
-            pass
-        else:
-            if pinfo['create_time']:
-                ctime = datetime.datetime.fromtimestamp(pinfo['create_time'])
-                if ctime.date() == today_day:
-                    ctime = ctime.strftime("%H:%M")
-                else:
-                    ctime = ctime.strftime("%b%d")
-            cputime = time.strftime("%M:%S", time.localtime(sum(pinfo['cpu_times'])))
-            user = pinfo['username']
-            if os.name == 'nt' and '\\' in user:
-                user = user.split('\\')[1]
-            vms = pinfo['memory_info'] and \
-                  int(pinfo['memory_info'].vms / 1024) or '?'
-            rss = pinfo['memory_info'] and \
-                  int(pinfo['memory_info'].rss / 1024) or '?'
-            memp = pinfo['memory_percent'] and \
-                   round(pinfo['memory_percent'], 1) or '?'
-            print_(templ % (user[:10],
-                            pinfo['pid'],
-                            pinfo['cpu_percent'],
-                            memp,
-                            vms,
-                            rss,
-                            pinfo.get('terminal', '') or '?',
-                            ctime,
-                            cputime,
-                            pinfo['name'].strip() or '?'))
-
-if __name__ == "__main__":
-    test()
-
-del property, cached_property, division
-if sys.version_info < (3, 0):
-    del num
diff --git a/contrib/psutil-0.6.1/psutil/__init__.pyc b/contrib/psutil-0.6.1/psutil/__init__.pyc
deleted file mode 100644
index 3d9d1eae87250725a3ae0d1d4e581dbef8d26c77..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 38539
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

diff --git a/contrib/psutil-0.6.1/psutil/_common.py b/contrib/psutil-0.6.1/psutil/_common.py
deleted file mode 100644
index f0431bc..0000000
--- a/contrib/psutil-0.6.1/psutil/_common.py
+++ /dev/null
@@ -1,193 +0,0 @@
-#/usr/bin/env python
-#
-#$Id: _common.py 1524 2012-08-16 15:06:32Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Common objects shared by all _ps* modules."""
-
-from __future__ import division
-import sys
-import os
-import stat
-import errno
-import warnings
-
-from psutil._compat import namedtuple, long, wraps
-
-# --- functions
-
-def usage_percent(used, total, _round=None):
-    """Calculate percentage usage of 'used' against 'total'."""
-    try:
-        ret = (used / total) * 100
-    except ZeroDivisionError:
-        ret = 0
-    if _round is not None:
-        return round(ret, _round)
-    else:
-        return ret
-
-class constant(int):
-    """A constant type; overrides base int to provide a useful name on str()."""
-
-    def __new__(cls, value, name, doc=None):
-        inst = super(constant, cls).__new__(cls, value)
-        inst._name = name
-        if doc is not None:
-            inst.__doc__ = doc
-        return inst
-
-    def __str__(self):
-        return self._name
-
-    def __eq__(self, other):
-        # Use both int or str values when comparing for equality
-        # (useful for serialization):
-        # >>> st = constant(0, "running")
-        # >>> st == 0
-        # True
-        # >>> st == 'running'
-        # True
-        if isinstance(other, int):
-            return int(self) == other
-        if isinstance(other, long):
-            return long(self) == other
-        if isinstance(other, str):
-            return self._name == other
-        return False
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-def memoize(f):
-    """A simple memoize decorator for functions."""
-    cache= {}
-    def memf(*x):
-        if x not in cache:
-            cache[x] = f(*x)
-        return cache[x]
-    return memf
-
-class cached_property(object):
-    """A memoize decorator for class properties."""
-    enabled = True
-
-    def __init__(self, func):
-        self.func = func
-
-    def __get__(self, instance, type):
-        ret = self.func(instance)
-        if self.enabled:
-            instance.__dict__[self.func.__name__] = ret
-        return ret
-
-# http://goo.gl/jYLvf
-def deprecated(replacement=None):
-    """A decorator which can be used to mark functions as deprecated."""
-    def outer(fun):
-        msg = "psutil.%s is deprecated" % fun.__name__
-        if replacement is not None:
-            msg += "; use %s instead" % replacement
-        if fun.__doc__ is None:
-            fun.__doc__ = msg
-
-        @wraps(fun)
-        def inner(*args, **kwargs):
-            warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
-            return fun(*args, **kwargs)
-
-        return inner
-    return outer
-
-
-def isfile_strict(path):
-    """Same as os.path.isfile() but does not swallow EACCES / EPERM
-    exceptions, see:
-    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
-    """
-    try:
-        st = os.stat(path)
-    except OSError:
-        err = sys.exc_info()[1]
-        if err.errno in (errno.EPERM, errno.EACCES):
-            raise
-        return False
-    else:
-        return stat.S_ISREG(st.st_mode)
-
-
-# --- constants
-
-STATUS_RUNNING = constant(0, "running")
-STATUS_SLEEPING = constant(1, "sleeping")
-STATUS_DISK_SLEEP = constant(2, "disk sleep")
-STATUS_STOPPED = constant(3, "stopped")
-STATUS_TRACING_STOP = constant(4, "tracing stop")
-STATUS_ZOMBIE = constant(5, "zombie")
-STATUS_DEAD = constant(6, "dead")
-STATUS_WAKE_KILL = constant(7, "wake kill")
-STATUS_WAKING = constant(8, "waking")
-STATUS_IDLE = constant(9, "idle")  # BSD
-STATUS_LOCKED = constant(10, "locked")  # BSD
-STATUS_WAITING = constant(11, "waiting")  # BSD
-
-# --- Process.get_connections() 'kind' parameter mapping
-
-import socket
-from socket import AF_INET, SOCK_STREAM, SOCK_DGRAM
-AF_INET6 = getattr(socket, 'AF_INET6', None)
-AF_UNIX = getattr(socket, 'AF_UNIX', None)
-
-conn_tmap = {
-    "all"  : ([AF_INET, AF_INET6, AF_UNIX], [SOCK_STREAM, SOCK_DGRAM]),
-    "tcp"  : ([AF_INET, AF_INET6], [SOCK_STREAM]),
-    "tcp4" : ([AF_INET],           [SOCK_STREAM]),
-    "udp"  : ([AF_INET, AF_INET6], [SOCK_DGRAM]),
-    "udp4" : ([AF_INET],           [SOCK_DGRAM]),
-    "inet" : ([AF_INET, AF_INET6], [SOCK_STREAM, SOCK_DGRAM]),
-    "inet4": ([AF_INET],           [SOCK_STREAM, SOCK_DGRAM]),
-    "inet6": ([AF_INET6],          [SOCK_STREAM, SOCK_DGRAM]),
-}
-
-if AF_INET6 is not None:
-    conn_tmap.update({
-        "tcp6" : ([AF_INET6],          [SOCK_STREAM]),
-        "udp6" : ([AF_INET6],          [SOCK_DGRAM]),
-    })
-
-if AF_UNIX is not None:
-    conn_tmap.update({
-        "unix" : ([AF_UNIX],           [SOCK_STREAM, SOCK_DGRAM]),
-    })
-
-
-del AF_INET, AF_INET6, AF_UNIX, SOCK_STREAM, SOCK_DGRAM, socket
-
-# --- namedtuples
-
-# system
-nt_sys_cputimes = namedtuple('cputimes', 'user nice system idle iowait irq softirq')
-nt_sysmeminfo = namedtuple('usage', 'total used free percent')
-# XXX - would 'available' be better than 'free' as for virtual_memory() nt?
-nt_swapmeminfo = namedtuple('swap', 'total used free percent sin sout')
-nt_diskinfo = namedtuple('usage', 'total used free percent')
-nt_partition = namedtuple('partition',  'device mountpoint fstype opts')
-nt_net_iostat = namedtuple('iostat',
-    'bytes_sent bytes_recv packets_sent packets_recv errin errout dropin dropout')
-nt_disk_iostat = namedtuple('iostat', 'read_count write_count read_bytes write_bytes read_time write_time')
-nt_user = namedtuple('user', 'name terminal host started')
-
-# processes
-nt_meminfo = namedtuple('meminfo', 'rss vms')
-nt_cputimes = namedtuple('cputimes', 'user system')
-nt_openfile = namedtuple('openfile', 'path fd')
-nt_connection = namedtuple('connection', 'fd family type local_address remote_address status')
-nt_thread = namedtuple('thread', 'id user_time system_time')
-nt_uids = namedtuple('user', 'real effective saved')
-nt_gids = namedtuple('group', 'real effective saved')
-nt_io = namedtuple('io', 'read_count write_count read_bytes write_bytes')
-nt_ionice = namedtuple('ionice', 'ioclass value')
-nt_ctxsw = namedtuple('amount', 'voluntary involuntary')
diff --git a/contrib/psutil-0.6.1/psutil/_common.pyc b/contrib/psutil-0.6.1/psutil/_common.pyc
deleted file mode 100644
index 41cb79034cccf9d80477651fded5716af60d5c90..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6810
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
E4}MyUWdHyG

diff --git a/contrib/psutil-0.6.1/psutil/_compat.py b/contrib/psutil-0.6.1/psutil/_compat.py
deleted file mode 100644
index dee9e05..0000000
--- a/contrib/psutil-0.6.1/psutil/_compat.py
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _compat.py 1524 2012-08-16 15:06:32Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Module which provides compatibility with older Python versions."""
-
-__all__ = ["PY3", "int", "long", "xrange", "exec_", "callable",
-           "namedtuple", "property", "defaultdict"]
-
-import sys
-
-
-# --- python 2/3 compatibility layer
-
-PY3 = sys.version_info >= (3,)
-
-try:
-    import __builtin__
-except ImportError:
-    import builtins as __builtin__  # py3
-
-if PY3:
-    int = int
-    long = int
-    xrange = range
-    exec_ = getattr(__builtin__, "exec")
-    print_ = getattr(__builtin__, "print")
-else:
-    int = int
-    long = long
-    xrange = xrange
-
-    def exec_(code, globs=None, locs=None):
-        if globs is None:
-            frame = _sys._getframe(1)
-            globs = frame.f_globals
-            if locs is None:
-                locs = frame.f_locals
-            del frame
-        elif locs is None:
-            locs = globs
-        exec("""exec code in globs, locs""")
-
-    def print_(s):
-        sys.stdout.write(s + '\n')
-        sys.stdout.flush()
-
-
-# removed in 3.0, reintroduced in 3.2
-try:
-    callable = callable
-except Exception:
-    def callable(obj):
-        for klass in type(obj).__mro__:
-            if "__call__" in klass.__dict__:
-                return True
-        return False
-
-
-# --- stdlib additions
-
-try:
-    from collections import namedtuple
-except ImportError:
-    from operator import itemgetter as _itemgetter
-    from keyword import iskeyword as _iskeyword
-    import sys as _sys
-
-    def namedtuple(typename, field_names, verbose=False, rename=False):
-        """A collections.namedtuple implementation written in Python
-        to support Python versions < 2.6.
-
-        Taken from: http://code.activestate.com/recipes/500261/
-        """
-        # Parse and validate the field names.  Validation serves two
-        # purposes, generating informative error messages and preventing
-        # template injection attacks.
-        if isinstance(field_names, basestring):
-             # names separated by whitespace and/or commas
-            field_names = field_names.replace(',', ' ').split()
-        field_names = tuple(map(str, field_names))
-        if rename:
-            names = list(field_names)
-            seen = set()
-            for i, name in enumerate(names):
-                if (not min(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
-                    or not name or name[0].isdigit() or name.startswith('_')
-                    or name in seen):
-                        names[i] = '_%d' % i
-                seen.add(name)
-            field_names = tuple(names)
-        for name in (typename,) + field_names:
-            if not min(c.isalnum() or c=='_' for c in name):
-                raise ValueError('Type names and field names can only contain ' \
-                                 'alphanumeric characters and underscores: %r'
-                                 % name)
-            if _iskeyword(name):
-                raise ValueError('Type names and field names cannot be a keyword: %r' \
-                                 % name)
-            if name[0].isdigit():
-                raise ValueError('Type names and field names cannot start with a ' \
-                                 'number: %r' % name)
-        seen_names = set()
-        for name in field_names:
-            if name.startswith('_') and not rename:
-                raise ValueError('Field names cannot start with an underscore: %r'
-                                 % name)
-            if name in seen_names:
-                raise ValueError('Encountered duplicate field name: %r' % name)
-            seen_names.add(name)
-
-        # Create and fill-in the class template
-        numfields = len(field_names)
-        # tuple repr without parens or quotes
-        argtxt = repr(field_names).replace("'", "")[1:-1]
-        reprtxt = ', '.join('%s=%%r' % name for name in field_names)
-        template = '''class %(typename)s(tuple):
-        '%(typename)s(%(argtxt)s)' \n
-        __slots__ = () \n
-        _fields = %(field_names)r \n
-        def __new__(_cls, %(argtxt)s):
-            return _tuple.__new__(_cls, (%(argtxt)s)) \n
-        @classmethod
-        def _make(cls, iterable, new=tuple.__new__, len=len):
-            'Make a new %(typename)s object from a sequence or iterable'
-            result = new(cls, iterable)
-            if len(result) != %(numfields)d:
-                raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result))
-            return result \n
-        def __repr__(self):
-            return '%(typename)s(%(reprtxt)s)' %% self \n
-        def _asdict(self):
-            'Return a new dict which maps field names to their values'
-            return dict(zip(self._fields, self)) \n
-        def _replace(_self, **kwds):
-            'Return a new %(typename)s object replacing specified fields with new values'
-            result = _self._make(map(kwds.pop, %(field_names)r, _self))
-            if kwds:
-                raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
-            return result \n
-        def __getnewargs__(self):
-            return tuple(self) \n\n''' % locals()
-        for i, name in enumerate(field_names):
-            template += '        %s = _property(_itemgetter(%d))\n' % (name, i)
-        if verbose:
-            sys.stdout.write(template + '\n')
-            sys.stdout.flush()
-
-        # Execute the template string in a temporary namespace
-        namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename,
-                         _property=property, _tuple=tuple)
-        try:
-            exec_(template, namespace)
-        except SyntaxError:
-            e = sys.exc_info()[1]
-            raise SyntaxError(e.message + ':\n' + template)
-        result = namespace[typename]
-
-        # For pickling to work, the __module__ variable needs to be set
-        # to the frame where the named tuple is created.  Bypass this
-        # step in enviroments where sys._getframe is not defined (Jython
-        # for example) or sys._getframe is not defined for arguments
-        # greater than 0 (IronPython).
-        try:
-            result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
-        except (AttributeError, ValueError):
-            pass
-
-        return result
-
-
-# hack to support property.setter/deleter on python < 2.6
-# http://docs.python.org/library/functions.html?highlight=property#property
-if hasattr(property, 'setter'):
-    property = property
-else:
-    class property(__builtin__.property):
-        __metaclass__ = type
-
-        def __init__(self, fget, *args, **kwargs):
-            super(property, self).__init__(fget, *args, **kwargs)
-            self.__doc__ = fget.__doc__
-
-        def getter(self, method):
-            return property(method, self.fset, self.fdel)
-
-        def setter(self, method):
-            return property(self.fget, method, self.fdel)
-
-        def deleter(self, method):
-            return property(self.fget, self.fset, method)
-
-
-# py 2.5 collections.defauldict
-# Taken from:
-# http://code.activestate.com/recipes/523034-emulate-collectionsdefaultdict/
-# credits: Jason Kirtland
-try:
-    from collections import defaultdict
-except ImportError:
-    class defaultdict(dict):
-
-        def __init__(self, default_factory=None, *a, **kw):
-            if (default_factory is not None and
-                not hasattr(default_factory, '__call__')):
-                raise TypeError('first argument must be callable')
-            dict.__init__(self, *a, **kw)
-            self.default_factory = default_factory
-
-        def __getitem__(self, key):
-            try:
-                return dict.__getitem__(self, key)
-            except KeyError:
-                return self.__missing__(key)
-
-        def __missing__(self, key):
-            if self.default_factory is None:
-                raise KeyError(key)
-            self[key] = value = self.default_factory()
-            return value
-
-        def __reduce__(self):
-            if self.default_factory is None:
-                args = tuple()
-            else:
-                args = self.default_factory,
-            return type(self), args, None, None, self.items()
-
-        def copy(self):
-            return self.__copy__()
-
-        def __copy__(self):
-            return type(self)(self.default_factory, self)
-
-        def __deepcopy__(self, memo):
-            import copy
-            return type(self)(self.default_factory,
-                              copy.deepcopy(self.items()))
-
-        def __repr__(self):
-            return 'defaultdict(%s, %s)' % (self.default_factory,
-                                            dict.__repr__(self))
-
-
-# py 2.5 functools.wraps
-try:
-    from functools import wraps
-except ImportError:
-    def wraps(original):
-        def inner(fn):
-            # see functools.WRAPPER_ASSIGNMENTS
-            for attribute in ['__module__',
-                              '__name__',
-                              '__doc__'
-                              ]:
-                setattr(fn, attribute, getattr(original, attribute))
-            # see functools.WRAPPER_UPDATES
-            for attribute in ['__dict__',
-                              ]:
-                if hasattr(fn, attribute):
-                    getattr(fn, attribute).update(getattr(original, attribute))
-                else:
-                    setattr(fn, attribute,
-                            getattr(original, attribute).copy())
-            return fn
-        return inner
diff --git a/contrib/psutil-0.6.1/psutil/_compat.pyc b/contrib/psutil-0.6.1/psutil/_compat.pyc
deleted file mode 100644
index 3d85fa4a1c94a649b4f896ee7a6c6d35183374cd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9098
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

diff --git a/contrib/psutil-0.6.1/psutil/_psbsd.py b/contrib/psutil-0.6.1/psutil/_psbsd.py
deleted file mode 100644
index 282765a..0000000
--- a/contrib/psutil-0.6.1/psutil/_psbsd.py
+++ /dev/null
@@ -1,328 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psbsd.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""FreeBSD platform implementation."""
-
-import errno
-import os
-import sys
-
-import _psutil_bsd
-import _psutil_posix
-from psutil import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-__extra__all__ = []
-
-# --- constants
-
-NUM_CPUS = _psutil_bsd.get_num_cpus()
-BOOT_TIME = _psutil_bsd.get_system_boot_time()
-TOTAL_PHYMEM = _psutil_bsd.get_virtual_mem()[0]
-_TERMINAL_MAP = _psposix._get_terminal_map()
-_PAGESIZE = os.sysconf("SC_PAGE_SIZE")
-_cputimes_ntuple = namedtuple('cputimes', 'user nice system idle irq')
-
-# --- public functions
-
-nt_virtmem_info = namedtuple('vmem', ' '.join([
-    # all platforms
-    'total', 'available', 'percent', 'used', 'free',
-    # FreeBSD specific
-    'active',
-    'inactive',
-    'buffers',
-    'cached',
-    'shared',
-    'wired']))
-
-def virtual_memory():
-    """System virtual memory as a namedutple."""
-    mem =  _psutil_bsd.get_virtual_mem()
-    total, free, active, inactive, wired, cached, buffers, shared = mem
-    avail = inactive + cached + free
-    used =  active + wired + cached
-    percent = usage_percent((total - avail), total, _round=1)
-    return nt_virtmem_info(total, avail, percent, used, free,
-                           active, inactive, buffers, cached, shared, wired)
-
-def swap_memory():
-    """System swap memory as (total, used, free, sin, sout) namedtuple."""
-    total, used, free, sin, sout = \
-        [x * _PAGESIZE for x in _psutil_bsd.get_swap_mem()]
-    percent = usage_percent(used, total, _round=1)
-    return nt_swapmeminfo(total, used, free, percent, sin, sout)
-
-def get_system_cpu_times():
-    """Return system per-CPU times as a named tuple"""
-    user, nice, system, idle, irq = _psutil_bsd.get_system_cpu_times()
-    return _cputimes_ntuple(user, nice, system, idle, irq)
-
-def get_system_per_cpu_times():
-    """Return system CPU times as a named tuple"""
-    ret = []
-    for cpu_t in _psutil_bsd.get_system_per_cpu_times():
-        user, nice, system, idle, irq = cpu_t
-        item = _cputimes_ntuple(user, nice, system, idle, irq)
-        ret.append(item)
-    return ret
-
-# XXX
-# Ok, this is very dirty.
-# On FreeBSD < 8 we cannot gather per-cpu information, see:
-# http://code.google.com/p/psutil/issues/detail?id=226
-# If NUM_CPUS > 1, on first call we return single cpu times to avoid a
-# crash at psutil import time.
-# Next calls will fail with NotImplementedError
-if not hasattr(_psutil_bsd, "get_system_per_cpu_times"):
-    def get_system_per_cpu_times():
-        if NUM_CPUS == 1:
-            return [get_system_cpu_times]
-        if get_system_per_cpu_times.__called__:
-            raise NotImplementedError("supported only starting from FreeBSD 8")
-        get_system_per_cpu_times.__called__ = True
-        return [get_system_cpu_times]
-get_system_per_cpu_times.__called__ = False
-
-def disk_partitions(all=False):
-    retlist = []
-    partitions = _psutil_bsd.get_disk_partitions()
-    for partition in partitions:
-        device, mountpoint, fstype, opts = partition
-        if device == 'none':
-            device = ''
-        if not all:
-            if not os.path.isabs(device) \
-            or not os.path.exists(device):
-                continue
-        ntuple = nt_partition(device, mountpoint, fstype, opts)
-        retlist.append(ntuple)
-    return retlist
-
-def get_system_users():
-    retlist = []
-    rawlist = _psutil_bsd.get_system_users()
-    for item in rawlist:
-        user, tty, hostname, tstamp = item
-        if tty == '~':
-            continue  # reboot or shutdown
-        nt = nt_user(user, tty or None, hostname, tstamp)
-        retlist.append(nt)
-    return retlist
-
-get_pid_list = _psutil_bsd.get_pid_list
-pid_exists = _psposix.pid_exists
-get_disk_usage = _psposix.get_disk_usage
-network_io_counters = _psutil_bsd.get_network_io_counters
-disk_io_counters = _psutil_bsd.get_disk_io_counters
-
-
-def wrap_exceptions(method):
-    """Call method(self, pid) into a try/except clause so that if an
-    OSError "No such process" exception is raised we assume the process
-    has died and raise psutil.NoSuchProcess instead.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return method(self, *args, **kwargs)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-_status_map = {
-    _psutil_bsd.SSTOP : STATUS_STOPPED,
-    _psutil_bsd.SSLEEP : STATUS_SLEEPING,
-    _psutil_bsd.SRUN : STATUS_RUNNING,
-    _psutil_bsd.SIDL : STATUS_IDLE,
-    _psutil_bsd.SWAIT : STATUS_WAITING,
-    _psutil_bsd.SLOCK : STATUS_LOCKED,
-    _psutil_bsd.SZOMB : STATUS_ZOMBIE,
-}
-
-
-class Process(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_bsd.get_process_name(self.pid)
-
-    @wrap_exceptions
-    def get_process_exe(self):
-        """Return process executable pathname."""
-        return _psutil_bsd.get_process_exe(self.pid)
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        return _psutil_bsd.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_terminal(self):
-        tty_nr = _psutil_bsd.get_process_tty_nr(self.pid)
-        try:
-            return _TERMINAL_MAP[tty_nr]
-        except KeyError:
-            return None
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_bsd.get_process_ppid(self.pid)
-
-    # XXX - available on FreeBSD >= 8 only
-    if hasattr(_psutil_bsd, "get_process_cwd"):
-        @wrap_exceptions
-        def get_process_cwd(self):
-            """Return process current working directory."""
-            # sometimes we get an empty string, in which case we turn
-            # it into None
-            return _psutil_bsd.get_process_cwd(self.pid) or None
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        """Return real, effective and saved user ids."""
-        real, effective, saved = _psutil_bsd.get_process_uids(self.pid)
-        return nt_uids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        """Return real, effective and saved group ids."""
-        real, effective, saved = _psutil_bsd.get_process_gids(self.pid)
-        return nt_gids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        """return a tuple containing process user/kernel time."""
-        user, system = _psutil_bsd.get_process_cpu_times(self.pid)
-        return nt_cputimes(user, system)
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Return a tuple with the process' RSS and VMS size."""
-        rss, vms = _psutil_bsd.get_process_memory_info(self.pid)[:2]
-        return nt_meminfo(rss, vms)
-
-    _nt_ext_mem = namedtuple('meminfo', 'rss vms text data stack')
-
-    @wrap_exceptions
-    def get_ext_memory_info(self):
-        return self._nt_ext_mem(*_psutil_bsd.get_process_memory_info(self.pid))
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        """Return the start time of the process as a number of seconds since
-        the epoch."""
-        return _psutil_bsd.get_process_create_time(self.pid)
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        """Return the number of threads belonging to the process."""
-        return _psutil_bsd.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_num_ctx_switches(self):
-        return nt_ctxsw(*_psutil_bsd.get_process_num_ctx_switches(self.pid))
-
-    @wrap_exceptions
-    def get_num_fds(self):
-        """Return the number of file descriptors opened by this process."""
-        return _psutil_bsd.get_process_num_fds(self.pid)
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        """Return the number of threads belonging to the process."""
-        rawlist = _psutil_bsd.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = nt_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_open_files(self):
-        """Return files opened by process as a list of namedtuples."""
-        # XXX - C implementation available on FreeBSD >= 8 only
-        # else fallback on lsof parser
-        if hasattr(_psutil_bsd, "get_process_open_files"):
-            rawlist = _psutil_bsd.get_process_open_files(self.pid)
-            return [nt_openfile(path, fd) for path, fd in rawlist]
-        else:
-            lsof = _psposix.LsofParser(self.pid, self._process_name)
-            return lsof.get_process_open_files()
-
-    @wrap_exceptions
-    def get_connections(self, kind='inet'):
-        """Return etwork connections opened by a process as a list of
-        namedtuples.
-        """
-        if kind not in conn_tmap:
-            raise ValueError("invalid %r kind argument; choose between %s"
-                             % (kind, ', '.join([repr(x) for x in conn_tmap])))
-        families, types = conn_tmap[kind]
-        ret = _psutil_bsd.get_process_connections(self.pid, families, types)
-        return [nt_connection(*conn) for conn in ret]
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        code = _psutil_bsd.get_process_status(self.pid)
-        if code in _status_map:
-            return _status_map[code]
-        return constant(-1, "?")
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        rc, wc, rb, wb = _psutil_bsd.get_process_io_counters(self.pid)
-        return nt_io(rc, wc, rb, wb)
-
-    nt_mmap_grouped = namedtuple('mmap',
-        'path rss, private, ref_count, shadow_count')
-    nt_mmap_ext = namedtuple('mmap',
-        'addr, perms path rss, private, ref_count, shadow_count')
-
-    @wrap_exceptions
-    def get_memory_maps(self):
-        return _psutil_bsd.get_process_memory_maps(self.pid)
-
-    # FreeBSD < 8 does not support kinfo_getfile() and kinfo_getvmmap()
-    if not hasattr(_psutil_bsd, 'get_process_open_files'):
-        def _not_implemented(self):
-            raise NotImplementedError("supported only starting from FreeBSD 8")
-        get_open_files = _not_implemented
-        get_process_cwd = _not_implemented
-        get_memory_maps = _not_implemented
-        get_num_fds = _not_implemented
diff --git a/contrib/psutil-0.6.1/psutil/_pslinux.py b/contrib/psutil-0.6.1/psutil/_pslinux.py
deleted file mode 100755
index 70fb8d3..0000000
--- a/contrib/psutil-0.6.1/psutil/_pslinux.py
+++ /dev/null
@@ -1,1011 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _pslinux.py 1513 2012-08-14 11:01:37Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Linux platform implementation."""
-
-from __future__ import division
-
-import os
-import errno
-import socket
-import struct
-import sys
-import base64
-import re
-
-import _psutil_posix
-import _psutil_linux
-from psutil import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._common import *
-from psutil._compat import PY3, xrange, long, namedtuple
-
-__extra__all__ = [
-    "IOPRIO_CLASS_NONE", "IOPRIO_CLASS_RT", "IOPRIO_CLASS_BE",
-    "IOPRIO_CLASS_IDLE",
-    "phymem_buffers", "cached_phymem"]
-
-
-def _get_boot_time():
-    """Return system boot time (epoch in seconds)"""
-    f = open('/proc/stat', 'r')
-    try:
-        for line in f:
-            if line.startswith('btime'):
-                return float(line.strip().split()[1])
-        raise RuntimeError("line not found")
-    finally:
-        f.close()
-
-def _get_num_cpus():
-    """Return the number of CPUs on the system"""
-    # we try to determine num CPUs by using different approaches.
-    # SC_NPROCESSORS_ONLN seems to be the safer and it is also
-    # used by multiprocessing module
-    try:
-        return os.sysconf("SC_NPROCESSORS_ONLN")
-    except ValueError:
-        # as a second fallback we try to parse /proc/cpuinfo
-        num = 0
-        f = open('/proc/cpuinfo', 'r')
-        try:
-            lines = f.readlines()
-        finally:
-            f.close()
-        for line in lines:
-            if line.lower().startswith('processor'):
-                num += 1
-
-    # unknown format (e.g. amrel/sparc architectures), see:
-    # http://code.google.com/p/psutil/issues/detail?id=200
-    # try to parse /proc/stat as a last resort
-    if num == 0:
-        f = open('/proc/stat', 'r')
-        try:
-            lines = f.readlines()
-        finally:
-            f.close()
-        search = re.compile('cpu\d')
-        for line in lines:
-            line = line.split(' ')[0]
-            if search.match(line):
-                num += 1
-
-    if num == 0:
-        raise RuntimeError("can't determine number of CPUs")
-    return num
-
-
-# Number of clock ticks per second
-_CLOCK_TICKS = os.sysconf(os.sysconf_names["SC_CLK_TCK"])
-_PAGESIZE = os.sysconf("SC_PAGE_SIZE")
-_TERMINAL_MAP = _psposix._get_terminal_map()
-BOOT_TIME = _get_boot_time()
-NUM_CPUS = _get_num_cpus()
-TOTAL_PHYMEM = _psutil_linux.get_sysinfo()[0]
-# ioprio_* constants http://linux.die.net/man/2/ioprio_get
-IOPRIO_CLASS_NONE = 0
-IOPRIO_CLASS_RT = 1
-IOPRIO_CLASS_BE = 2
-IOPRIO_CLASS_IDLE = 3
-
-# http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
-_TCP_STATES_TABLE = {"01" : "ESTABLISHED",
-                     "02" : "SYN_SENT",
-                     "03" : "SYN_RECV",
-                     "04" : "FIN_WAIT1",
-                     "05" : "FIN_WAIT2",
-                     "06" : "TIME_WAIT",
-                     "07" : "CLOSE",
-                     "08" : "CLOSE_WAIT",
-                     "09" : "LAST_ACK",
-                     "0A" : "LISTEN",
-                     "0B" : "CLOSING"
-                     }
-
-# --- system memory functions
-
-nt_virtmem_info = namedtuple('vmem', ' '.join([
-    # all platforms
-    'total', 'available', 'percent', 'used', 'free',
-    # linux specific
-    'active',
-    'inactive',
-    'buffers',
-    'cached']))
-
-def virtual_memory():
-    total, free, buffers, shared, _, _ = _psutil_linux.get_sysinfo()
-    cached = active = inactive = None
-    f = open('/proc/meminfo', 'r')
-    try:
-        for line in f:
-            if line.startswith('Cached:'):
-                cached = int(line.split()[1]) * 1024
-            elif line.startswith('Active:'):
-                active = int(line.split()[1]) * 1024
-            elif line.startswith('Inactive:'):
-                inactive = int(line.split()[1]) * 1024
-            if cached is not None \
-            and active is not None \
-            and inactive is not None:
-                break
-        else:
-            raise RuntimeError("line(s) not found")
-    finally:
-        f.close()
-    avail = free + buffers + cached
-    used = total - free
-    percent = usage_percent((total - avail), total, _round=1)
-    return nt_virtmem_info(total, avail, percent, used, free,
-                           active, inactive, buffers, cached)
-
-def swap_memory():
-    _, _, _, _, total, free = _psutil_linux.get_sysinfo()
-    used = total - free
-    percent = usage_percent(used, total, _round=1)
-    # get pgin/pgouts
-    f = open("/proc/vmstat", "r")
-    sin = sout = None
-    try:
-        for line in f:
-            # values are expressed in 4 kilo bytes, we want bytes instead
-            if line.startswith('pswpin'):
-                sin = int(line.split(' ')[1]) * 4 * 1024
-            elif line.startswith('pswpout'):
-                sout = int(line.split(' ')[1])  * 4 * 1024
-            if sin is not None and sout is not None:
-                break
-        else:
-            raise RuntimeError("line(s) not found")
-    finally:
-        f.close()
-    return nt_swapmeminfo(total, used, free, percent, sin, sout)
-
-# --- XXX deprecated memory functions
-
-@deprecated('psutil.virtual_memory().cached')
-def cached_phymem():
-    return virtual_memory().cached
-
-@deprecated('psutil.virtual_memory().buffers')
-def phymem_buffers():
-    return virtual_memory().buffers
-
-
-# --- system CPU functions
-
-def get_system_cpu_times():
-    """Return a named tuple representing the following CPU times:
-    user, nice, system, idle, iowait, irq, softirq.
-    """
-    f = open('/proc/stat', 'r')
-    try:
-        values = f.readline().split()
-    finally:
-        f.close()
-
-    values = values[1:8]
-    values = tuple([float(x) / _CLOCK_TICKS for x in values])
-    return nt_sys_cputimes(*values[:7])
-
-def get_system_per_cpu_times():
-    """Return a list of namedtuple representing the CPU times
-    for every CPU available on the system.
-    """
-    cpus = []
-    f = open('/proc/stat', 'r')
-    # get rid of the first line who refers to system wide CPU stats
-    try:
-        f.readline()
-        for line in f.readlines():
-            if line.startswith('cpu'):
-                values = line.split()[1:8]
-                values = tuple([float(x) / _CLOCK_TICKS for x in values])
-                entry = nt_sys_cputimes(*values[:7])
-                cpus.append(entry)
-        return cpus
-    finally:
-        f.close()
-
-
-# --- system disk functions
-
-def disk_partitions(all=False):
-    """Return mounted disk partitions as a list of nameduples"""
-    phydevs = []
-    f = open("/proc/filesystems", "r")
-    try:
-        for line in f:
-            if not line.startswith("nodev"):
-                phydevs.append(line.strip())
-    finally:
-        f.close()
-
-    retlist = []
-    partitions = _psutil_linux.get_disk_partitions()
-    for partition in partitions:
-        device, mountpoint, fstype, opts = partition
-        if device == 'none':
-            device = ''
-        if not all:
-            if device == '' or fstype not in phydevs:
-                continue
-        ntuple = nt_partition(device, mountpoint, fstype, opts)
-        retlist.append(ntuple)
-    return retlist
-
-get_disk_usage = _psposix.get_disk_usage
-
-
-# --- other sysetm functions
-
-def get_system_users():
-    """Return currently connected users as a list of namedtuples."""
-    retlist = []
-    rawlist = _psutil_linux.get_system_users()
-    for item in rawlist:
-        user, tty, hostname, tstamp, user_process = item
-        # XXX the underlying C function includes entries about
-        # system boot, run level and others.  We might want
-        # to use them in the future.
-        if not user_process:
-            continue
-        if hostname == ':0.0':
-            hostname = 'localhost'
-        nt = nt_user(user, tty or None, hostname, tstamp)
-        retlist.append(nt)
-    return retlist
-
-# --- process functions
-
-def get_pid_list():
-    """Returns a list of PIDs currently running on the system."""
-    pids = [int(x) for x in os.listdir('/proc') if x.isdigit()]
-    return pids
-
-def pid_exists(pid):
-    """Check For the existence of a unix pid."""
-    return _psposix.pid_exists(pid)
-
-def network_io_counters():
-    """Return network I/O statistics for every network interface
-    installed on the system as a dict of raw tuples.
-    """
-    f = open("/proc/net/dev", "r")
-    try:
-        lines = f.readlines()
-    finally:
-        f.close()
-
-    retdict = {}
-    for line in lines[2:]:
-        colon = line.find(':')
-        assert colon > 0, line
-        name = line[:colon].strip()
-        fields = line[colon+1:].strip().split()
-        bytes_recv = int(fields[0])
-        packets_recv = int(fields[1])
-        errin = int(fields[2])
-        dropin = int(fields[2])
-        bytes_sent = int(fields[8])
-        packets_sent = int(fields[9])
-        errout = int(fields[10])
-        dropout = int(fields[11])
-        retdict[name] = (bytes_sent, bytes_recv, packets_sent, packets_recv,
-                         errin, errout, dropin, dropout)
-    return retdict
-
-def disk_io_counters():
-    """Return disk I/O statistics for every disk installed on the
-    system as a dict of raw tuples.
-    """
-    # man iostat states that sectors are equivalent with blocks and
-    # have a size of 512 bytes since 2.4 kernels. This value is
-    # needed to calculate the amount of disk I/O in bytes.
-    SECTOR_SIZE = 512
-
-    # determine partitions we want to look for
-    partitions = []
-    f = open("/proc/partitions", "r")
-    try:
-        lines = f.readlines()[2:]
-    finally:
-        f.close()
-    for line in lines:
-        _, _, _, name = line.split()
-        if name[-1].isdigit():
-            partitions.append(name)
-    #
-    retdict = {}
-    f = open("/proc/diskstats", "r")
-    try:
-        lines = f.readlines()
-    finally:
-        f.close()
-    for line in lines:
-        _, _, name, reads, _, rbytes, rtime, writes, _, wbytes, wtime = \
-            line.split()[:11]
-        if name in partitions:
-            rbytes = int(rbytes) * SECTOR_SIZE
-            wbytes = int(wbytes) * SECTOR_SIZE
-            reads = int(reads)
-            writes = int(writes)
-            # TODO: times are expressed in milliseconds while OSX/BSD has
-            # these expressed in nanoseconds; figure this out.
-            rtime = int(rtime)
-            wtime = int(wtime)
-            retdict[name] = (reads, writes, rbytes, wbytes, rtime, wtime)
-    return retdict
-
-
-# taken from /fs/proc/array.c
-_status_map = {"R" : STATUS_RUNNING,
-               "S" : STATUS_SLEEPING,
-               "D" : STATUS_DISK_SLEEP,
-               "T" : STATUS_STOPPED,
-               "t" : STATUS_TRACING_STOP,
-               "Z" : STATUS_ZOMBIE,
-               "X" : STATUS_DEAD,
-               "x" : STATUS_DEAD,
-               "K" : STATUS_WAKE_KILL,
-               "W" : STATUS_WAKING}
-
-# --- decorators
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause and translate ENOENT,
-    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except EnvironmentError:
-            # ENOENT (no such file or directory) gets raised on open().
-            # ESRCH (no such process) can get raised on read() if
-            # process is gone in meantime.
-            err = sys.exc_info()[1]
-            if err.errno in (errno.ENOENT, errno.ESRCH):
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-class Process(object):
-    """Linux process implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        if not isinstance(pid, int):
-            raise TypeError('pid must be an integer')
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        f = open("/proc/%s/stat" % self.pid)
-        try:
-            name = f.read().split(' ')[1].replace('(', '').replace(')', '')
-        finally:
-            f.close()
-        # XXX - gets changed later and probably needs refactoring
-        return name
-
-    def get_process_exe(self):
-        try:
-            exe = os.readlink("/proc/%s/exe" % self.pid)
-        except (OSError, IOError):
-            err = sys.exc_info()[1]
-            if err.errno == errno.ENOENT:
-                # no such file error; might be raised also if the
-                # path actually exists for system processes with
-                # low pids (about 0-20)
-                if os.path.lexists("/proc/%s/exe" % self.pid):
-                    return ""
-                else:
-                    # ok, it is a process which has gone away
-                    raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-
-        # readlink() might return paths containing null bytes causing
-        # problems when used with other fs-related functions (os.*,
-        # open(), ...)
-        exe = exe.replace('\x00', '')
-        # Certain names have ' (deleted)' appended. Usually this is
-        # bogus as the file actually exists. Either way that's not
-        # important as we don't want to discriminate executables which
-        # have been deleted.
-        if exe.endswith(" (deleted)") and not os.path.exists(exe):
-            exe = exe[:-10]
-        return exe
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        f = open("/proc/%s/cmdline" % self.pid)
-        try:
-            # return the args as a list
-            return [x for x in f.read().split('\x00') if x]
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_terminal(self):
-        f = open("/proc/%s/stat" % self.pid)
-        try:
-            tty_nr = int(f.read().split(' ')[6])
-        finally:
-            f.close()
-        try:
-            return _TERMINAL_MAP[tty_nr]
-        except KeyError:
-            return None
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        f = open("/proc/%s/io" % self.pid)
-        try:
-            for line in f:
-                if line.startswith("rchar"):
-                    read_count = int(line.split()[1])
-                elif line.startswith("wchar"):
-                    write_count = int(line.split()[1])
-                elif line.startswith("read_bytes"):
-                    read_bytes = int(line.split()[1])
-                elif line.startswith("write_bytes"):
-                    write_bytes = int(line.split()[1])
-            return nt_io(read_count, write_count, read_bytes, write_bytes)
-        finally:
-            f.close()
-
-    if not os.path.exists('/proc/%s/io' % os.getpid()):
-        def get_process_io_counters(self):
-            raise NotImplementedError('/proc/PID/io is not available')
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        f = open("/proc/%s/stat" % self.pid)
-        try:
-            st = f.read().strip()
-        finally:
-            f.close()
-        # ignore the first two values ("pid (exe)")
-        st = st[st.find(')') + 2:]
-        values = st.split(' ')
-        utime = float(values[11]) / _CLOCK_TICKS
-        stime = float(values[12]) / _CLOCK_TICKS
-        return nt_cputimes(utime, stime)
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        f = open("/proc/%s/stat" % self.pid)
-        try:
-            st = f.read().strip()
-        finally:
-            f.close()
-        # ignore the first two values ("pid (exe)")
-        st = st[st.rfind(')') + 2:]
-        values = st.split(' ')
-        # According to documentation, starttime is in field 21 and the
-        # unit is jiffies (clock ticks).
-        # We first divide it for clock ticks and then add uptime returning
-        # seconds since the epoch, in UTC.
-        starttime = (float(values[19]) / _CLOCK_TICKS) + BOOT_TIME
-        return starttime
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        f = open("/proc/%s/statm" % self.pid)
-        try:
-            vms, rss = f.readline().split()[:2]
-            return nt_meminfo(int(rss) * _PAGESIZE,
-                              int(vms) * _PAGESIZE)
-        finally:
-            f.close()
-
-    _nt_ext_mem = namedtuple('meminfo', 'rss vms shared text lib data dirty')
-
-    @wrap_exceptions
-    def get_ext_memory_info(self):
-        #  ============================================================
-        # | FIELD  | DESCRIPTION                         | AKA  | TOP  |
-        #  ============================================================
-        # | rss    | resident set size                   |      | RES  |
-        # | vms    | total program size                  | size | VIRT |
-        # | shared | shared pages (from shared mappings) |      | SHR  |
-        # | text   | text ('code')                       | trs  | CODE |
-        # | lib    | library (unused in Linux 2.6)       | lrs  |      |
-        # | data   | data + stack                        | drs  | DATA |
-        # | dirty  | dirty pages (unused in Linux 2.6)   | dt   |      |
-        #  ============================================================
-        f = open("/proc/%s/statm" % self.pid)
-        try:
-            vms, rss, shared, text, lib, data, dirty = \
-              [int(x) * _PAGESIZE for x in f.readline().split()[:7]]
-        finally:
-            f.close()
-        return self._nt_ext_mem(rss, vms, shared, text, lib, data, dirty)
-
-    _mmap_base_fields = ['path', 'rss', 'size', 'pss', 'shared_clean',
-                         'shared_dirty', 'private_clean', 'private_dirty',
-                         'referenced', 'anonymous', 'swap',]
-    nt_mmap_grouped = namedtuple('mmap', ' '.join(_mmap_base_fields))
-    nt_mmap_ext = namedtuple('mmap', 'addr perms ' + ' '.join(_mmap_base_fields))
-
-    def get_memory_maps(self):
-        """Return process's mapped memory regions as a list of nameduples.
-        Fields are explained in 'man proc'; here is an updated (Apr 2012)
-        version: http://goo.gl/fmebo
-        """
-        f = None
-        try:
-            f = open("/proc/%s/smaps" % self.pid)
-            first_line = f.readline()
-            current_block = [first_line]
-
-            def get_blocks():
-                data = {}
-                for line in f:
-                    fields = line.split(None, 5)
-                    if len(fields) >= 5:
-                        yield (current_block.pop(), data)
-                        current_block.append(line)
-                    else:
-                        data[fields[0]] = int(fields[1]) * 1024
-                yield (current_block.pop(), data)
-
-            if first_line:  # smaps file can be empty
-                for header, data in get_blocks():
-                    hfields = header.split(None, 5)
-                    try:
-                        addr, perms, offset, dev, inode, path = hfields
-                    except ValueError:
-                        addr, perms, offset, dev, inode, path = hfields + ['']
-                    if not path:
-                        path = '[anon]'
-                    else:
-                        path = path.strip()
-                    yield (addr, perms, path,
-                           data['Rss:'],
-                           data['Size:'],
-                           data.get('Pss:', 0),
-                           data['Shared_Clean:'], data['Shared_Clean:'],
-                           data['Private_Clean:'], data['Private_Dirty:'],
-                           data['Referenced:'],
-                           data['Anonymous:'],
-                           data['Swap:'])
-            f.close()
-        except EnvironmentError:
-            # XXX - Can't use wrap_exceptions decorator as we're
-            # returning a generator;  this probably needs some
-            # refactoring in order to avoid this code duplication.
-            if f is not None:
-                f.close()
-            err = sys.exc_info()[1]
-            if err.errno in (errno.ENOENT, errno.ESRCH):
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-        except:
-            if f is not None:
-                f.close()
-            raise
-
-    if not os.path.exists('/proc/%s/smaps' % os.getpid()):
-        def get_shared_libs(self, ext):
-            msg = "this Linux version does not support /proc/PID/smaps " \
-                  "(kernel < 2.6.14 or CONFIG_MMU kernel configuration " \
-                  "option is not enabled)"
-            raise NotImplementedError(msg)
-
-    @wrap_exceptions
-    def get_process_cwd(self):
-        # readlink() might return paths containing null bytes causing
-        # problems when used with other fs-related functions (os.*,
-        # open(), ...)
-        path = os.readlink("/proc/%s/cwd" % self.pid)
-        return path.replace('\x00', '')
-
-    @wrap_exceptions
-    def get_num_ctx_switches(self):
-        vol = unvol = None
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith("voluntary_ctxt_switches"):
-                    vol = int(line.split()[1])
-                elif line.startswith("nonvoluntary_ctxt_switches"):
-                    unvol = int(line.split()[1])
-                if vol is not None and unvol is not None:
-                    return nt_ctxsw(vol, unvol)
-            raise RuntimeError("line not found")
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith("Threads:"):
-                    return int(line.split()[1])
-            raise RuntimeError("line not found")
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        thread_ids = os.listdir("/proc/%s/task" % self.pid)
-        thread_ids.sort()
-        retlist = []
-        hit_enoent = False
-        for thread_id in thread_ids:
-            try:
-                f = open("/proc/%s/task/%s/stat" % (self.pid, thread_id))
-            except EnvironmentError:
-                err = sys.exc_info()[1]
-                if err.errno == errno.ENOENT:
-                    # no such file or directory; it means thread
-                    # disappeared on us
-                    hit_enoent = True
-                    continue
-                raise
-            try:
-                st = f.read().strip()
-            finally:
-                f.close()
-            # ignore the first two values ("pid (exe)")
-            st = st[st.find(')') + 2:]
-            values = st.split(' ')
-            utime = float(values[11]) / _CLOCK_TICKS
-            stime = float(values[12]) / _CLOCK_TICKS
-            ntuple = nt_thread(int(thread_id), utime, stime)
-            retlist.append(ntuple)
-        if hit_enoent:
-            # raise NSP if the process disappeared on us
-            os.stat('/proc/%s' % self.pid)
-        return retlist
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        #f = open('/proc/%s/stat' % self.pid, 'r')
-        #try:
-        #   data = f.read()
-        #   return int(data.split()[18])
-        #finally:
-        #   f.close()
-
-        # Use C implementation
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_cpu_affinity(self):
-        from_bitmask = lambda x: [i for i in xrange(64) if (1 << i) & x]
-        bitmask = _psutil_linux.get_process_cpu_affinity(self.pid)
-        return from_bitmask(bitmask)
-
-    @wrap_exceptions
-    def set_process_cpu_affinity(self, value):
-        def to_bitmask(l):
-            if not l:
-                raise ValueError("invalid argument %r" % l)
-            out = 0
-            for b in l:
-                if not isinstance(b, (int, long)) or b < 0:
-                    raise ValueError("invalid argument %r" % b)
-                out |= 2**b
-            return out
-
-        bitmask = to_bitmask(value)
-        try:
-            _psutil_linux.set_process_cpu_affinity(self.pid, bitmask)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno == errno.EINVAL:
-                allcpus = list(range(len(get_system_per_cpu_times())))
-                for cpu in value:
-                    if cpu not in allcpus:
-                        raise ValueError("invalid CPU %i" % cpu)
-            raise
-
-    # only starting from kernel 2.6.13
-    if hasattr(_psutil_linux, "ioprio_get"):
-
-        @wrap_exceptions
-        def get_process_ionice(self):
-            ioclass, value = _psutil_linux.ioprio_get(self.pid)
-            return nt_ionice(ioclass, value)
-
-        @wrap_exceptions
-        def set_process_ionice(self, ioclass, value):
-            if ioclass in (IOPRIO_CLASS_NONE, None):
-                if value:
-                    raise ValueError("can't specify value with IOPRIO_CLASS_NONE")
-                ioclass = IOPRIO_CLASS_NONE
-                value = 0
-            if ioclass in (IOPRIO_CLASS_RT, IOPRIO_CLASS_BE):
-                if value is None:
-                    value = 4
-            elif ioclass == IOPRIO_CLASS_IDLE:
-                if value:
-                    raise ValueError("can't specify value with IOPRIO_CLASS_IDLE")
-                value = 0
-            else:
-                value = 0
-            if not 0 <= value <= 8:
-                raise ValueError("value argument range expected is between 0 and 8")
-            return _psutil_linux.ioprio_set(self.pid, ioclass, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith("State:"):
-                    letter = line.split()[1]
-                    if letter in _status_map:
-                        return _status_map[letter]
-                    return constant(-1, '?')
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_open_files(self):
-        retlist = []
-        files = os.listdir("/proc/%s/fd" % self.pid)
-        hit_enoent = False
-        for fd in files:
-            file = "/proc/%s/fd/%s" % (self.pid, fd)
-            if os.path.islink(file):
-                try:
-                    file = os.readlink(file)
-                except OSError:
-                    # ENOENT == file which is gone in the meantime
-                    err = sys.exc_info()[1]
-                    if err.errno == errno.ENOENT:
-                        hit_enoent = True
-                        continue
-                    raise
-                else:
-                    # If file is not an absolute path there's no way
-                    # to tell whether it's a regular file or not,
-                    # so we skip it. A regular file is always supposed
-                    # to be absolutized though.
-                    if file.startswith('/') and isfile_strict(file):
-                        ntuple = nt_openfile(file, int(fd))
-                        retlist.append(ntuple)
-        if hit_enoent:
-            # raise NSP if the process disappeared on us
-            os.stat('/proc/%s' % self.pid)
-        return retlist
-
-    @wrap_exceptions
-    def get_connections(self, kind='inet'):
-        """Return connections opened by process as a list of namedtuples.
-        The kind parameter filters for connections that fit the following
-        criteria:
-
-        Kind Value      Number of connections using
-        inet            IPv4 and IPv6
-        inet4           IPv4
-        inet6           IPv6
-        tcp             TCP
-        tcp4            TCP over IPv4
-        tcp6            TCP over IPv6
-        udp             UDP
-        udp4            UDP over IPv4
-        udp6            UDP over IPv6
-        all             the sum of all the possible families and protocols
-        """
-        # Note: in case of UNIX sockets we're only able to determine the
-        # local bound path while the remote endpoint is not retrievable:
-        # http://goo.gl/R3GHM
-        inodes = {}
-        # os.listdir() is gonna raise a lot of access denied
-        # exceptions in case of unprivileged user; that's fine:
-        # lsof does the same so it's unlikely that we can to better.
-        for fd in os.listdir("/proc/%s/fd" % self.pid):
-            try:
-                inode = os.readlink("/proc/%s/fd/%s" % (self.pid, fd))
-            except OSError:
-                continue
-            if inode.startswith('socket:['):
-                # the process is using a socket
-                inode = inode[8:][:-1]
-                inodes[inode] = fd
-
-        if not inodes:
-            # no connections for this process
-            return []
-
-        def process(file, family, type_):
-            retlist = []
-            try:
-                f = open(file, 'r')
-            except IOError:
-                # IPv6 not supported on this platform
-                err = sys.exc_info()[1]
-                if err.errno == errno.ENOENT and file.endswith('6'):
-                    return []
-                else:
-                    raise
-            try:
-                f.readline()  # skip the first line
-                for line in f:
-                    # IPv4 / IPv6
-                    if family in (socket.AF_INET, socket.AF_INET6):
-                        _, laddr, raddr, status, _, _, _, _, _, inode = \
-                                                                line.split()[:10]
-                        if inode in inodes:
-                            laddr = self._decode_address(laddr, family)
-                            raddr = self._decode_address(raddr, family)
-                            if type_ == socket.SOCK_STREAM:
-                                status = _TCP_STATES_TABLE[status]
-                            else:
-                                status = ""
-                            fd = int(inodes[inode])
-                            conn = nt_connection(fd, family, type_, laddr,
-                                                 raddr, status)
-                            retlist.append(conn)
-                    elif family == socket.AF_UNIX:
-                        tokens = line.split()
-                        _, _, _, _, type_, _, inode = tokens[0:7]
-                        if inode in inodes:
-
-                            if len(tokens) == 8:
-                                path = tokens[-1]
-                            else:
-                                path = ""
-                            fd = int(inodes[inode])
-                            type_ = int(type_)
-                            conn = nt_connection(fd, family, type_, path,
-                                                 None, "")
-                            retlist.append(conn)
-                    else:
-                        raise ValueError(family)
-                return retlist
-            finally:
-                f.close()
-
-        tcp4 = ("tcp" , socket.AF_INET , socket.SOCK_STREAM)
-        tcp6 = ("tcp6", socket.AF_INET6, socket.SOCK_STREAM)
-        udp4 = ("udp" , socket.AF_INET , socket.SOCK_DGRAM)
-        udp6 = ("udp6", socket.AF_INET6, socket.SOCK_DGRAM)
-        unix = ("unix", socket.AF_UNIX, None)
-
-        tmap = {
-            "all"  : (tcp4, tcp6, udp4, udp6, unix),
-            "tcp"  : (tcp4, tcp6),
-            "tcp4" : (tcp4,),
-            "tcp6" : (tcp6,),
-            "udp"  : (udp4, udp6),
-            "udp4" : (udp4,),
-            "udp6" : (udp6,),
-            "unix" : (unix,),
-            "inet" : (tcp4, tcp6, udp4, udp6),
-            "inet4": (tcp4, udp4),
-            "inet6": (tcp6, udp6),
-        }
-        if kind not in tmap:
-            raise ValueError("invalid %r kind argument; choose between %s"
-                             % (kind, ', '.join([repr(x) for x in tmap])))
-        ret = []
-        for f, family, type_ in tmap[kind]:
-            ret += process("/proc/net/%s" % f, family, type_)
-        # raise NSP if the process disappeared on us
-        os.stat('/proc/%s' % self.pid)
-        return ret
-
-
-#    --- lsof implementation
-#
-#    def get_connections(self):
-#        lsof = _psposix.LsofParser(self.pid, self._process_name)
-#        return lsof.get_process_connections()
-
-    @wrap_exceptions
-    def get_num_fds(self):
-       return len(os.listdir("/proc/%s/fd" % self.pid))
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith("PPid:"):
-                    # PPid: nnnn
-                    return int(line.split()[1])
-            raise RuntimeError("line not found")
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith('Uid:'):
-                    _, real, effective, saved, fs = line.split()
-                    return nt_uids(int(real), int(effective), int(saved))
-            raise RuntimeError("line not found")
-        finally:
-            f.close()
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        f = open("/proc/%s/status" % self.pid)
-        try:
-            for line in f:
-                if line.startswith('Gid:'):
-                    _, real, effective, saved, fs = line.split()
-                    return nt_gids(int(real), int(effective), int(saved))
-            raise RuntimeError("line not found")
-        finally:
-            f.close()
-
-    @staticmethod
-    def _decode_address(addr, family):
-        """Accept an "ip:port" address as displayed in /proc/net/*
-        and convert it into a human readable form, like:
-
-        "0500000A:0016" -> ("10.0.0.5", 22)
-        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)
-
-        The IP address portion is a little or big endian four-byte
-        hexadecimal number; that is, the least significant byte is listed
-        first, so we need to reverse the order of the bytes to convert it
-        to an IP address.
-        The port is represented as a two-byte hexadecimal number.
-
-        Reference:
-        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
-        """
-        ip, port = addr.split(':')
-        port = int(port, 16)
-        if PY3:
-            ip = ip.encode('ascii')
-        # this usually refers to a local socket in listen mode with
-        # no end-points connected
-        if not port:
-            return ()
-        if family == socket.AF_INET:
-            # see: http://code.google.com/p/psutil/issues/detail?id=201
-            if sys.byteorder == 'little':
-                ip = socket.inet_ntop(family, base64.b16decode(ip)[::-1])
-            else:
-                ip = socket.inet_ntop(family, base64.b16decode(ip))
-        else:  # IPv6
-            # old version - let's keep it, just in case...
-            #ip = ip.decode('hex')
-            #return socket.inet_ntop(socket.AF_INET6,
-            #          ''.join(ip[i:i+4][::-1] for i in xrange(0, 16, 4)))
-            ip = base64.b16decode(ip)
-            # see: http://code.google.com/p/psutil/issues/detail?id=201
-            if sys.byteorder == 'little':
-                ip = socket.inet_ntop(socket.AF_INET6,
-                                struct.pack('>4I', *struct.unpack('<4I', ip)))
-            else:
-                ip = socket.inet_ntop(socket.AF_INET6,
-                                struct.pack('<4I', *struct.unpack('<4I', ip)))
-        return (ip, port)
diff --git a/contrib/psutil-0.6.1/psutil/_pslinux.pyc b/contrib/psutil-0.6.1/psutil/_pslinux.pyc
deleted file mode 100644
index 0f61f13a4721a4db190ac61bc4e6e34582989913..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 29038
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

diff --git a/contrib/psutil-0.6.1/psutil/_psmswindows.py b/contrib/psutil-0.6.1/psutil/_psmswindows.py
deleted file mode 100644
index aa57f87..0000000
--- a/contrib/psutil-0.6.1/psutil/_psmswindows.py
+++ /dev/null
@@ -1,423 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psmswindows.py 1514 2012-08-14 11:16:56Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Windows platform implementation."""
-
-import errno
-import os
-import sys
-import platform
-
-import _psutil_mswindows
-from _psutil_mswindows import ERROR_ACCESS_DENIED
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._common import *
-from psutil._compat import PY3, xrange, long
-
-# Windows specific extended namespace
-__extra__all__ = ["ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
-                  "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
-                  "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS"]
-
-
-# --- module level constants (gets pushed up to psutil module)
-
-NUM_CPUS = _psutil_mswindows.get_num_cpus()
-BOOT_TIME = _psutil_mswindows.get_system_uptime()
-TOTAL_PHYMEM = _psutil_mswindows.get_virtual_mem()[0]
-WAIT_TIMEOUT = 0x00000102 # 258 in decimal
-ACCESS_DENIED_SET = frozenset([errno.EPERM, errno.EACCES, ERROR_ACCESS_DENIED])
-
-# process priority constants:
-# http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx
-from _psutil_mswindows import (ABOVE_NORMAL_PRIORITY_CLASS,
-                               BELOW_NORMAL_PRIORITY_CLASS,
-                               HIGH_PRIORITY_CLASS,
-                               IDLE_PRIORITY_CLASS,
-                               NORMAL_PRIORITY_CLASS,
-                               REALTIME_PRIORITY_CLASS,
-                               INFINITE)
-
-@memoize
-def _win32_QueryDosDevice(s):
-    return _psutil_mswindows.win32_QueryDosDevice(s)
-
-def _convert_raw_path(s):
-    # convert paths using native DOS format like:
-    # "\Device\HarddiskVolume1\Windows\systemew\file.txt"
-    # into: "C:\Windows\systemew\file.txt"
-    if PY3 and not isinstance(s, str):
-        s = s.decode('utf8')
-    rawdrive = '\\'.join(s.split('\\')[:3])
-    driveletter = _win32_QueryDosDevice(rawdrive)
-    return os.path.join(driveletter, s[len(rawdrive):])
-
-
-# --- public functions
-
-nt_virtmem_info = namedtuple('vmem', ' '.join([
-    # all platforms
-    'total', 'available', 'percent', 'used', 'free']))
-
-def virtual_memory():
-    """System virtual memory as a namedtuple."""
-    mem = _psutil_mswindows.get_virtual_mem()
-    totphys, availphys, totpagef, availpagef, totvirt, freevirt = mem
-    #
-    total = totphys
-    avail = availphys
-    free = availphys
-    used = total - avail
-    percent = usage_percent((total - avail), total, _round=1)
-    return nt_virtmem_info(total, avail, percent, used, free)
-
-def swap_memory():
-    """Swap system memory as a (total, used, free, sin, sout) tuple."""
-    mem = _psutil_mswindows.get_virtual_mem()
-    total = mem[2]
-    free = mem[3]
-    used = total - free
-    percent = usage_percent(used, total, _round=1)
-    return nt_swapmeminfo(total, used, free, percent, 0, 0)
-
-def get_disk_usage(path):
-    """Return disk usage associated with path."""
-    try:
-        total, free = _psutil_mswindows.get_disk_usage(path)
-    except WindowsError:
-        err = sys.exc_info()[1]
-        if not os.path.exists(path):
-            raise OSError(errno.ENOENT, "No such file or directory: '%s'" % path)
-        raise
-    used = total - free
-    percent = usage_percent(used, total, _round=1)
-    return nt_diskinfo(total, used, free, percent)
-
-def disk_partitions(all):
-    """Return disk partitions."""
-    rawlist = _psutil_mswindows.get_disk_partitions(all)
-    return [nt_partition(*x) for x in rawlist]
-
-
-_cputimes_ntuple = namedtuple('cputimes', 'user system idle')
-
-def get_system_cpu_times():
-    """Return system CPU times as a named tuple."""
-    user, system, idle = 0, 0, 0
-    # computes system global times summing each processor value
-    for cpu_time in _psutil_mswindows.get_system_cpu_times():
-        user += cpu_time[0]
-        system += cpu_time[1]
-        idle += cpu_time[2]
-    return _cputimes_ntuple(user, system, idle)
-
-def get_system_per_cpu_times():
-    """Return system per-CPU times as a list of named tuples."""
-    ret = []
-    for cpu_t in _psutil_mswindows.get_system_cpu_times():
-        user, system, idle = cpu_t
-        item = _cputimes_ntuple(user, system, idle)
-        ret.append(item)
-    return ret
-
-def get_system_users():
-    """Return currently connected users as a list of namedtuples."""
-    retlist = []
-    rawlist = _psutil_mswindows.get_system_users()
-    for item in rawlist:
-        user, hostname, tstamp = item
-        nt = nt_user(user, None, hostname, tstamp)
-        retlist.append(nt)
-    return retlist
-
-get_pid_list = _psutil_mswindows.get_pid_list
-pid_exists = _psutil_mswindows.pid_exists
-network_io_counters = _psutil_mswindows.get_network_io_counters
-disk_io_counters = _psutil_mswindows.get_disk_io_counters
-
-# --- decorator
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause so that if a
-    WindowsError 5 AccessDenied exception is raised we translate it
-    into psutil.AccessDenied
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                raise AccessDenied(self.pid, self._process_name)
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-class Process(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_mswindows.get_process_name(self.pid)
-
-    @wrap_exceptions
-    def get_process_exe(self):
-        # Note: os.path.exists(path) may return False even if the file
-        # is there, see:
-        # http://stackoverflow.com/questions/3112546/os-path-exists-lies
-        return _convert_raw_path(_psutil_mswindows.get_process_exe(self.pid))
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        return _psutil_mswindows.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_mswindows.get_process_ppid(self.pid)
-
-    def _get_raw_meminfo(self):
-        try:
-            return _psutil_mswindows.get_process_memory_info(self.pid)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                return _psutil_mswindows.get_process_memory_info_2(self.pid)
-            raise
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Returns a tuple or RSS/VMS memory usage in bytes."""
-        # on Windows RSS == WorkingSetSize and VSM == PagefileUsage
-        # fields of PROCESS_MEMORY_COUNTERS struct:
-        # http://msdn.microsoft.com/en-us/library/windows/desktop/ms684877(v=vs.85).aspx
-        t = self._get_raw_meminfo()
-        return nt_meminfo(t[2], t[7])
-
-    _nt_ext_mem = namedtuple('meminfo',
-        ' '.join(['num_page_faults',
-                  'peak_wset',
-                  'wset',
-                  'peak_paged_pool',
-                  'paged_pool',
-                  'peak_nonpaged_pool',
-                  'nonpaged_pool',
-                  'pagefile',
-                  'peak_pagefile',
-                  'private',]))
-
-    @wrap_exceptions
-    def get_ext_memory_info(self):
-        return self._nt_ext_mem(*self._get_raw_meminfo())
-
-    nt_mmap_grouped = namedtuple('mmap', 'path rss')
-    nt_mmap_ext = namedtuple('mmap', 'addr perms path rss')
-
-    def get_memory_maps(self):
-        try:
-            raw = _psutil_mswindows.get_process_memory_maps(self.pid)
-        except OSError:
-            # XXX - can't use wrap_exceptions decorator as we're
-            # returning a generator; probably needs refactoring.
-            err = sys.exc_info()[1]
-            if err.errno in (errno.EPERM, errno.EACCES, ERROR_ACCESS_DENIED):
-                raise AccessDenied(self.pid, self._process_name)
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            raise
-        else:
-            for addr, perm, path, rss in raw:
-                path = _convert_raw_path(path)
-                addr = hex(addr)
-                yield (addr, perm, path, rss)
-
-    @wrap_exceptions
-    def kill_process(self):
-        """Terminates the process with the given PID."""
-        return _psutil_mswindows.kill_process(self.pid)
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        if timeout is None:
-            timeout = INFINITE
-        else:
-            # WaitForSingleObject() expects time in milliseconds
-            timeout = int(timeout * 1000)
-        ret = _psutil_mswindows.process_wait(self.pid, timeout)
-        if ret == WAIT_TIMEOUT:
-            raise TimeoutExpired(self.pid, self._process_name)
-        return ret
-
-    @wrap_exceptions
-    def get_process_username(self):
-        """Return the name of the user that owns the process"""
-        if self.pid in (0, 4):
-            return 'NT AUTHORITY\\SYSTEM'
-        return _psutil_mswindows.get_process_username(self.pid)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        # special case for kernel process PIDs; return system boot time
-        if self.pid in (0, 4):
-            return BOOT_TIME
-        try:
-            return _psutil_mswindows.get_process_create_time(self.pid)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                return _psutil_mswindows.get_process_create_time_2(self.pid)
-            raise
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        return _psutil_mswindows.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        rawlist = _psutil_mswindows.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = nt_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        try:
-            ret = _psutil_mswindows.get_process_cpu_times(self.pid)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                ret = _psutil_mswindows.get_process_cpu_times_2(self.pid)
-            else:
-                raise
-        return nt_cputimes(*ret)
-
-    @wrap_exceptions
-    def suspend_process(self):
-        return _psutil_mswindows.suspend_process(self.pid)
-
-    @wrap_exceptions
-    def resume_process(self):
-        return _psutil_mswindows.resume_process(self.pid)
-
-    @wrap_exceptions
-    def get_process_cwd(self):
-        if self.pid in (0, 4):
-            raise AccessDenied(self.pid, self._process_name)
-        # return a normalized pathname since the native C function appends
-        # "\\" at the and of the path
-        path = _psutil_mswindows.get_process_cwd(self.pid)
-        return os.path.normpath(path)
-
-    @wrap_exceptions
-    def get_open_files(self):
-        if self.pid in (0, 4):
-            return []
-        retlist = []
-        # Filenames come in in native format like:
-        # "\Device\HarddiskVolume1\Windows\systemew\file.txt"
-        # Convert the first part in the corresponding drive letter
-        # (e.g. "C:\") by using Windows's QueryDosDevice()
-        raw_file_names = _psutil_mswindows.get_process_open_files(self.pid)
-        for file in raw_file_names:
-            file = _convert_raw_path(file)
-            if isfile_strict(file) and file not in retlist:
-                ntuple = nt_openfile(file, -1)
-                retlist.append(ntuple)
-        return retlist
-
-    @wrap_exceptions
-    def get_connections(self, kind='inet'):
-        if kind not in conn_tmap:
-            raise ValueError("invalid %r kind argument; choose between %s"
-                             % (kind, ', '.join([repr(x) for x in conn_tmap])))
-        families, types = conn_tmap[kind]
-        ret = _psutil_mswindows.get_process_connections(self.pid, families, types)
-        return [nt_connection(*conn) for conn in ret]
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_mswindows.get_process_priority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_mswindows.set_process_priority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_io_counters(self):
-        try:
-            ret = _psutil_mswindows.get_process_io_counters(self.pid)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                ret = _psutil_mswindows.get_process_io_counters_2(self.pid)
-            else:
-                raise
-        return nt_io(*ret)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        suspended = _psutil_mswindows.is_process_suspended(self.pid)
-        if suspended:
-            return STATUS_STOPPED
-        else:
-            return STATUS_RUNNING
-
-    @wrap_exceptions
-    def get_process_cpu_affinity(self):
-        from_bitmask = lambda x: [i for i in xrange(64) if (1 << i) & x]
-        bitmask = _psutil_mswindows.get_process_cpu_affinity(self.pid)
-        return from_bitmask(bitmask)
-
-    @wrap_exceptions
-    def set_process_cpu_affinity(self, value):
-        def to_bitmask(l):
-            if not l:
-                raise ValueError("invalid argument %r" % l)
-            out = 0
-            for b in l:
-                if not isinstance(b, (int, long)) or b < 0:
-                    raise ValueError("invalid argument %r" % b)
-                out |= 2**b
-            return out
-
-        # SetProcessAffinityMask() states that ERROR_INVALID_PARAMETER
-        # is returned for an invalid CPU but this seems not to be true,
-        # therefore we check CPUs validy beforehand.
-        allcpus = list(range(len(get_system_per_cpu_times())))
-        for cpu in value:
-            if cpu not in allcpus:
-                raise ValueError("invalid CPU %i" % cpu)
-
-        bitmask = to_bitmask(value)
-        _psutil_mswindows.set_process_cpu_affinity(self.pid, bitmask)
-
-    @wrap_exceptions
-    def get_num_handles(self):
-        try:
-            return _psutil_mswindows.get_process_num_handles(self.pid)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                return _psutil_mswindows.get_process_num_handles_2(self.pid)
-            raise
-
-    @wrap_exceptions
-    def get_num_ctx_switches(self):
-        return nt_ctxsw(*_psutil_mswindows.get_process_num_ctx_switches(self.pid))
diff --git a/contrib/psutil-0.6.1/psutil/_psosx.py b/contrib/psutil-0.6.1/psutil/_psosx.py
deleted file mode 100644
index 90cead2..0000000
--- a/contrib/psutil-0.6.1/psutil/_psosx.py
+++ /dev/null
@@ -1,293 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psosx.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""OSX platform implementation."""
-
-import errno
-import os
-import sys
-
-import _psutil_osx
-import _psutil_posix
-from psutil import _psposix
-from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired
-from psutil._compat import namedtuple
-from psutil._common import *
-
-__extra__all__ = []
-
-# --- constants
-
-NUM_CPUS = _psutil_osx.get_num_cpus()
-BOOT_TIME = _psutil_osx.get_system_boot_time()
-TOTAL_PHYMEM = _psutil_osx.get_virtual_mem()[0]
-_PAGESIZE = os.sysconf("SC_PAGE_SIZE")
-_TERMINAL_MAP = _psposix._get_terminal_map()
-_cputimes_ntuple = namedtuple('cputimes', 'user nice system idle')
-
-# --- functions
-
-nt_virtmem_info = namedtuple('vmem', ' '.join([
-    # all platforms
-    'total', 'available', 'percent', 'used', 'free',
-    # OSX specific
-    'active',
-    'inactive',
-    'wired']))
-
-def virtual_memory():
-    """System virtual memory as a namedtuple."""
-    total, active, inactive, wired, free = _psutil_osx.get_virtual_mem()
-    avail = inactive + free
-    used = active + inactive + wired
-    percent = usage_percent((total - avail), total, _round=1)
-    return nt_virtmem_info(total, avail, percent, used, free,
-                           active, inactive, wired)
-
-def swap_memory():
-    """Swap system memory as a (total, used, free, sin, sout) tuple."""
-    total, used, free, sin, sout = _psutil_osx.get_swap_mem()
-    percent = usage_percent(used, total, _round=1)
-    return nt_swapmeminfo(total, used, free, percent, sin, sout)
-
-def get_system_cpu_times():
-    """Return system CPU times as a namedtuple."""
-    user, nice, system, idle = _psutil_osx.get_system_cpu_times()
-    return _cputimes_ntuple(user, nice, system, idle)
-
-def get_system_per_cpu_times():
-    """Return system CPU times as a named tuple"""
-    ret = []
-    for cpu_t in _psutil_osx.get_system_per_cpu_times():
-        user, nice, system, idle = cpu_t
-        item = _cputimes_ntuple(user, nice, system, idle)
-        ret.append(item)
-    return ret
-
-def disk_partitions(all=False):
-    retlist = []
-    partitions = _psutil_osx.get_disk_partitions()
-    for partition in partitions:
-        device, mountpoint, fstype, opts = partition
-        if device == 'none':
-            device = ''
-        if not all:
-            if not os.path.isabs(device) \
-            or not os.path.exists(device):
-                continue
-        ntuple = nt_partition(device, mountpoint, fstype, opts)
-        retlist.append(ntuple)
-    return retlist
-
-def get_system_users():
-    retlist = []
-    rawlist = _psutil_osx.get_system_users()
-    for item in rawlist:
-        user, tty, hostname, tstamp = item
-        if tty == '~':
-            continue  # reboot or shutdown
-        if not tstamp:
-            continue
-        nt = nt_user(user, tty or None, hostname or None, tstamp)
-        retlist.append(nt)
-    return retlist
-
-
-get_pid_list = _psutil_osx.get_pid_list
-pid_exists = _psposix.pid_exists
-get_disk_usage = _psposix.get_disk_usage
-network_io_counters = _psutil_osx.get_network_io_counters
-disk_io_counters = _psutil_osx.get_disk_io_counters
-
-# --- decorator
-
-def wrap_exceptions(callable):
-    """Call callable into a try/except clause so that if an
-    OSError EPERM exception is raised we translate it into
-    psutil.AccessDenied.
-    """
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno == errno.ESRCH:
-                raise NoSuchProcess(self.pid, self._process_name)
-            if err.errno in (errno.EPERM, errno.EACCES):
-                raise AccessDenied(self.pid, self._process_name)
-            raise
-    return wrapper
-
-
-_status_map = {
-    _psutil_osx.SIDL : STATUS_IDLE,
-    _psutil_osx.SRUN : STATUS_RUNNING,
-    _psutil_osx.SSLEEP : STATUS_SLEEPING,
-    _psutil_osx.SSTOP : STATUS_STOPPED,
-    _psutil_osx.SZOMB : STATUS_ZOMBIE,
-}
-
-class Process(object):
-    """Wrapper class around underlying C implementation."""
-
-    __slots__ = ["pid", "_process_name"]
-
-    def __init__(self, pid):
-        self.pid = pid
-        self._process_name = None
-
-    @wrap_exceptions
-    def get_process_name(self):
-        """Return process name as a string of limited len (15)."""
-        return _psutil_osx.get_process_name(self.pid)
-
-    @wrap_exceptions
-    def get_process_exe(self):
-        return _psutil_osx.get_process_exe(self.pid)
-
-    @wrap_exceptions
-    def get_process_cmdline(self):
-        """Return process cmdline as a list of arguments."""
-        if not pid_exists(self.pid):
-            raise NoSuchProcess(self.pid, self._process_name)
-        return _psutil_osx.get_process_cmdline(self.pid)
-
-    @wrap_exceptions
-    def get_process_ppid(self):
-        """Return process parent pid."""
-        return _psutil_osx.get_process_ppid(self.pid)
-
-    @wrap_exceptions
-    def get_process_cwd(self):
-        return _psutil_osx.get_process_cwd(self.pid)
-
-    @wrap_exceptions
-    def get_process_uids(self):
-        real, effective, saved = _psutil_osx.get_process_uids(self.pid)
-        return nt_uids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_process_gids(self):
-        real, effective, saved = _psutil_osx.get_process_gids(self.pid)
-        return nt_gids(real, effective, saved)
-
-    @wrap_exceptions
-    def get_process_terminal(self):
-        tty_nr = _psutil_osx.get_process_tty_nr(self.pid)
-        try:
-            return _TERMINAL_MAP[tty_nr]
-        except KeyError:
-            return None
-
-    @wrap_exceptions
-    def get_memory_info(self):
-        """Return a tuple with the process' RSS and VMS size."""
-        rss, vms = _psutil_osx.get_process_memory_info(self.pid)[:2]
-        return nt_meminfo(rss, vms)
-
-    _nt_ext_mem = namedtuple('meminfo', 'rss vms pfaults pageins')
-
-    @wrap_exceptions
-    def get_ext_memory_info(self):
-        """Return a tuple with the process' RSS and VMS size."""
-        rss, vms, pfaults, pageins = _psutil_osx.get_process_memory_info(self.pid)
-        return self._nt_ext_mem(rss, vms,
-                                pfaults * _PAGESIZE,
-                                pageins * _PAGESIZE)
-
-    @wrap_exceptions
-    def get_cpu_times(self):
-        user, system = _psutil_osx.get_process_cpu_times(self.pid)
-        return nt_cputimes(user, system)
-
-    @wrap_exceptions
-    def get_process_create_time(self):
-        """Return the start time of the process as a number of seconds since
-        the epoch."""
-        return _psutil_osx.get_process_create_time(self.pid)
-
-    @wrap_exceptions
-    def get_num_ctx_switches(self):
-        return nt_ctxsw(*_psutil_osx.get_process_num_ctx_switches(self.pid))
-
-    @wrap_exceptions
-    def get_process_num_threads(self):
-        """Return the number of threads belonging to the process."""
-        return _psutil_osx.get_process_num_threads(self.pid)
-
-    @wrap_exceptions
-    def get_open_files(self):
-        """Return files opened by process."""
-        if self.pid == 0:
-            return []
-        files = []
-        rawlist = _psutil_osx.get_process_open_files(self.pid)
-        for path, fd in rawlist:
-            if isfile_strict(path):
-                ntuple = nt_openfile(path, fd)
-                files.append(ntuple)
-        return files
-
-    @wrap_exceptions
-    def get_connections(self, kind='inet'):
-        """Return etwork connections opened by a process as a list of
-        namedtuples.
-        """
-        if kind not in conn_tmap:
-            raise ValueError("invalid %r kind argument; choose between %s"
-                             % (kind, ', '.join([repr(x) for x in conn_tmap])))
-        families, types = conn_tmap[kind]
-        ret = _psutil_osx.get_process_connections(self.pid, families, types)
-        return [nt_connection(*conn) for conn in ret]
-
-    @wrap_exceptions
-    def get_num_fds(self):
-        if self.pid == 0:
-            return 0
-        return _psutil_osx.get_process_num_fds(self.pid)
-
-    @wrap_exceptions
-    def process_wait(self, timeout=None):
-        try:
-            return _psposix.wait_pid(self.pid, timeout)
-        except TimeoutExpired:
-            raise TimeoutExpired(self.pid, self._process_name)
-
-    @wrap_exceptions
-    def get_process_nice(self):
-        return _psutil_posix.getpriority(self.pid)
-
-    @wrap_exceptions
-    def set_process_nice(self, value):
-        return _psutil_posix.setpriority(self.pid, value)
-
-    @wrap_exceptions
-    def get_process_status(self):
-        code = _psutil_osx.get_process_status(self.pid)
-        if code in _status_map:
-            return _status_map[code]
-        return constant(-1, "?")
-
-    @wrap_exceptions
-    def get_process_threads(self):
-        """Return the number of threads belonging to the process."""
-        rawlist = _psutil_osx.get_process_threads(self.pid)
-        retlist = []
-        for thread_id, utime, stime in rawlist:
-            ntuple = nt_thread(thread_id, utime, stime)
-            retlist.append(ntuple)
-        return retlist
-
-    nt_mmap_grouped = namedtuple('mmap',
-        'path rss private swapped dirtied ref_count shadow_depth')
-    nt_mmap_ext = namedtuple('mmap',
-        'addr perms path rss private swapped dirtied ref_count shadow_depth')
-
-    @wrap_exceptions
-    def get_memory_maps(self):
-        return _psutil_osx.get_process_memory_maps(self.pid)
diff --git a/contrib/psutil-0.6.1/psutil/_psposix.py b/contrib/psutil-0.6.1/psutil/_psposix.py
deleted file mode 100644
index 899f77a..0000000
--- a/contrib/psutil-0.6.1/psutil/_psposix.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _psposix.py 1409 2012-07-04 08:21:06Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Routines common to all posix systems."""
-
-import os
-import errno
-import psutil
-import sys
-import time
-import glob
-
-from psutil.error import TimeoutExpired
-from psutil._common import nt_diskinfo, usage_percent
-
-
-def pid_exists(pid):
-    """Check whether pid exists in the current process table."""
-    if not isinstance(pid, int):
-        raise TypeError('an integer is required')
-    if pid < 0:
-        return False
-    try:
-        os.kill(pid, 0)
-    except OSError:
-        e = sys.exc_info()[1]
-        return e.errno == errno.EPERM
-    else:
-        return True
-
-def wait_pid(pid, timeout=None):
-    """Wait for process with pid 'pid' to terminate and return its
-    exit status code as an integer.
-
-    If pid is not a children of os.getpid() (current process) just
-    waits until the process disappears and return None.
-
-    If pid does not exist at all return None immediately.
-
-    Raise TimeoutExpired on timeout expired.
-    """
-    def check_timeout(delay):
-        if timeout is not None:
-            if time.time() >= stop_at:
-                raise TimeoutExpired(pid)
-        time.sleep(delay)
-        return min(delay * 2, 0.04)
-
-    if timeout is not None:
-        waitcall = lambda: os.waitpid(pid, os.WNOHANG)
-        stop_at = time.time() + timeout
-    else:
-        waitcall = lambda: os.waitpid(pid, 0)
-
-    delay = 0.0001
-    while 1:
-        try:
-            retpid, status = waitcall()
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno == errno.EINTR:
-                delay = check_timeout(delay)
-                continue
-            elif err.errno == errno.ECHILD:
-                # This has two meanings:
-                # - pid is not a child of os.getpid() in which case
-                #   we keep polling until it's gone
-                # - pid never existed in the first place
-                # In both cases we'll eventually return None as we
-                # can't determine its exit status code.
-                while 1:
-                    if pid_exists(pid):
-                        delay = check_timeout(delay)
-                    else:
-                        return
-            else:
-                raise
-        else:
-            if retpid == 0:
-                # WNOHANG was used, pid is still running
-                delay = check_timeout(delay)
-                continue
-            # process exited due to a signal; return the integer of
-            # that signal
-            if os.WIFSIGNALED(status):
-                return os.WTERMSIG(status)
-            # process exited using exit(2) system call; return the
-            # integer exit(2) system call has been called with
-            elif os.WIFEXITED(status):
-                return os.WEXITSTATUS(status)
-            else:
-                # should never happen
-                raise RuntimeError("unknown process exit status")
-
-def get_disk_usage(path):
-    """Return disk usage associated with path."""
-    st = os.statvfs(path)
-    free = (st.f_bavail * st.f_frsize)
-    total = (st.f_blocks * st.f_frsize)
-    used = (st.f_blocks - st.f_bfree) * st.f_frsize
-    percent = usage_percent(used, total, _round=1)
-    # NB: the percentage is -5% than what shown by df due to
-    # reserved blocks that we are currently not considering:
-    # http://goo.gl/sWGbH
-    return nt_diskinfo(total, used, free, percent)
-
-def _get_terminal_map():
-    ret = {}
-    ls = glob.glob('/dev/tty*') + glob.glob('/dev/pts/*')
-    for name in ls:
-        assert name not in ret
-        ret[os.stat(name).st_rdev] = name
-    return ret
diff --git a/contrib/psutil-0.6.1/psutil/_psposix.pyc b/contrib/psutil-0.6.1/psutil/_psposix.pyc
deleted file mode 100644
index c93db54c07bc5c1bb7bb81636786d425140c75f0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3393
zcmb7G+iny`5UrlQ`ECcBYj_wbL@c1#JR}4~gp0s{C1TL5BcoN&Xgt$vk3BoHp6&&k
z*pY%!Ao+>B<T-!BLp~vS%^N?EoT^^iAqb)@OuH}D)zwv}PW5lE$49!an-5|d{6_Hi
zIzIC=nuMs0R#D>7hN3n)uJ2LX+wWJXUD@wfsa@Ug*Qj0F@7Jkamwtsd8k7xDdx#Y4
zs?x?VWh2xcp=^}eqnNGHa~wOyXC`%ej$<b%X~^UxB}3Ag;?-7jm<|0HO;Gf0nrq|7
zMYmhzzAgMH%luwp(k<U?8>_o!HvJ2~#ioM1oj|jcb~X0RZ}rkrCryv%N73XqOj5Iv
z=AFWhW862<st$X)jCF2f-p-<Rd^ho#@6lMI9khz}JnBu6vf`aRMb8xFiWC-M@H$aZ
z!(xS6YI}xkmC_pT!xHwX<@_R5ZJpLfs5nCkKii;mi1r{+p_99cb`+(<WQQpop>;Sw
zJ%qt6II-2Nu_>3>rZpXJ_)pffUDKuCOA}vjrN$aRg<ICNANR`=_wajV5o=?78?9t|
z)*QpuD2I^MtJs$szto$3c1(&DO8MH0%`vo=A(EOjH#W*+joV<DTUZ5`Zuj(jSr(;b
zdu~UW(QpN>ZE#tljWo+}C!+f;C&ha?JVW@ax8hKI&Rca^=7lJke=r|>CA*i(zIIXK
zZMYfy4ap`NlExh2c>^e9b79X&^k;k9Vlc!*=Lo*3nc+>|l$uiGs-`MxMopl9#EaQl
zwuY?~>oOej0{<1g@Ten5|AA=NqnCou^<gSLA_a+#qz1257zyy$9<k8zAAtd2Vjxl>
zCxWQ$R%vTgZBNrqg=N3-XtzeYbz07U0uX=~0O30agbJlq0YVKxXwVLTQ6u;#1zbET
zrU5aJb|9iy>*gcc)Jh#nHALzHsjUkHXTKyCEMU|dyIvvt>eSkNCA*&y>roGPki~BQ
z+ov$L9UOP+qH@BGN6C#_vN|>x6@%6B!&Rg<04{lg!}xTU)C=(Xa+F%XQvk#Rs6I*U
znjrctqIs5+-0HHM=8@HYlqW!}?U%r?H6uQL2)FeCQrl-<NFZY%wh!^y5fNJGh(_QY
zc=IDaUQ4qC3E~$Wzc90_+TyI{IluX@ygBEu_l*@5Phh9<`#E4I8MbdONF?g@bX4-O
z2i7eXxqkEPqyTa8>4Hx`f*Ihh!DU$7PrF^@A+DKi54HwTYPA0*gZWH+j?<t@NNrXO
zj5$yEV?a;iGXWaLFA?MSEP{3bSVikKfd&BRZ~_k7{FIc$8e$cuEQCxUDVe+!%{T&U
zHCg{+$|<z^?aZ%tet-JQH6bQRU%rWS*hV&h@e5lrt$RWuh@>NDo=$WYZHvNSl0`Wm
zjV*d%WTij2=zH^?$vb8`3<uJ4tc2-{koMC^`f(NWh<^vZVF!WFk-xY;cZ8i=a*{KM
zZ4o0l^2|d#vAlTy?v2GePK=!`cE8uYAxK@xqV7r(UHu$=gOA=eXbQ6j1|ejq6)ka;
zFtadXz!n6j(EN|{gVT`z0-v0_`pM1HfBtdl)HPh3qlkvghiLlwMqWJ053=wdY1QP=
z1kAbtdoAD+5U_s(uA_le3l8S|!s1eZ%7)&}y9@Vj1t0LTxRC{y7jCx}?kwK8H-Aei
z!SWI)A2U)?usHv4VF^nj%Kg^Tjis+!memKGc3oF<n(R;UdT@e!C((#L4pWSr3YhxE
z3?vuFjV*EnApk_taqeR*I7P>~$J*XiTlh@YA41<5mb;9GMvpee)ufv7CcQeUO9f!#
z`ZBG?R6|WSDgfS;H|h;};~r)zQ))s!NmMq9opuwS$<esjyQCXD0>Jf>i8H7}+(RY~
z#>mctag9#wPgnWgs1K+#?g_W&DHIzZ7c)E$JvG|nmjqwloJA8jI_0;JFK-|as3~IR
zp~QDw9ND#5@nTpO{X7xqxG+d?xnci4?zj@)30I=WQJP6qI$@_Y=~F!ztYk&JVI-9x
z)+x0Pm`DOfW0QR%+|k2{@}e+S#w;f^VhbB(GSxTQW#r(+=0XYu?~EZo20`@l>I>zj
z$TBjFFY+c4w<&d89j!`cvUd)m6JfB1g70D^TnJ+1c%cv4P;?vt+q%p#x%KEGzZ%%l
zVBH4w8p66DS1H0!;R(0OHU#v_<~dr1=zvuX=hj@JAJ194eO^dRMm=lh&L5KOYF4bs
z<MxIzy0mGL%R|fMS`{id9O7hS!xHKw+=71Ogm^Y{Z?!z?>i>2fCvwQX8&u*f?4suJ
zIqXzYb#+=bs1B+<rJ5`(XNO@@#9`=IOIU&f>|Sn;KZH*BIV)N2R%Vf(Md>OBYah&p
z?#(YiagY&q5mw?01fOy9C7Q$QNbh|qeWhC@{Y+nFuN%()IuiBZA0Cd!D#H_F*N4ac
E2HQNaApigX

diff --git a/contrib/psutil-0.6.1/psutil/_psutil_bsd.c b/contrib/psutil-0.6.1/psutil/_psutil_bsd.c
deleted file mode 100644
index 91bf658..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_bsd.c
+++ /dev/null
@@ -1,1777 +0,0 @@
-/*
- * $Id: _psutil_bsd.c 1513 2012-08-14 11:01:37Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * FreeBSD platform-specific module methods for _psutil_bsd
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <sys/proc.h>
-#include <sys/file.h>
-#include <net/route.h>
-
-#include <sys/socket.h>
-#include <sys/socketvar.h>    /* for struct socket */
-#include <sys/protosw.h>      /* for struct proto */
-#include <sys/domain.h>       /* for struct domain */
-
-#include <sys/un.h>           /* for unpcb struct (UNIX sockets) */
-#include <sys/unpcb.h>        /* for unpcb struct (UNIX sockets) */
-#include <sys/mbuf.h>         /* for mbuf struct (UNIX sockets) */
-/* for in_pcb struct */
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/in_pcb.h>
-#include <netinet/tcp_var.h>   /* for struct tcpcb */
-#include <netinet/tcp_fsm.h>   /* for TCP connection states */
-#include <arpa/inet.h>         /* for inet_ntop() */
-
-#if __FreeBSD_version < 900000
-    #include <utmp.h>         /* system users */
-#else
-    #include <utmpx.h>
-#endif
-#include <devstat.h>      /* get io counters */
-#include <sys/vmmeter.h>  /* needed for vmtotal struct */
-#include <libutil.h>      /* process open files, shared libs (kinfo_getvmmap) */
-#include <sys/mount.h>
-
-#include <net/if.h>       /* net io counters */
-#include <net/if_dl.h>
-#include <net/route.h>
-
-#include <netinet/in.h>   /* process open files/connections */
-#include <sys/un.h>
-
-#include "_psutil_bsd.h"
-#include "_psutil_common.h"
-#include "arch/bsd/process_info.h"
-
-
-// convert a timeval struct to a double
-#define TV2DOUBLE(t)    ((t).tv_sec + (t).tv_usec / 1000000.0)
-
-
-/*
- * Utility function which fills a kinfo_proc struct based on process pid
- */
-static int
-get_kinfo_proc(const pid_t pid, struct kinfo_proc *proc)
-{
-    int mib[4];
-    size_t size;
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID;
-    mib[3] = pid;
-
-    size = sizeof(struct kinfo_proc);
-
-    if (sysctl((int*)mib, 4, proc, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return -1;
-    }
-
-    /*
-     * sysctl stores 0 in the size if we can't find the process information.
-     */
-    if (size == 0) {
-        NoSuchProcess();
-        return -1;
-    }
-    return 0;
-}
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    kinfo_proc *proclist = NULL;
-    kinfo_proc *orig_address = NULL;
-    size_t num_processes;
-    size_t idx;
-    PyObject* retlist = PyList_New(0);
-    PyObject* pid = NULL;
-
-    if (get_proc_list(&proclist, &num_processes) != 0) {
-        PyErr_SetString(PyExc_RuntimeError, "failed to retrieve process list.");
-        goto error;
-    }
-
-    if (num_processes > 0) {
-        orig_address = proclist; // save so we can free it after we're done
-        for (idx=0; idx < num_processes; idx++) {
-            pid = Py_BuildValue("i", proclist->ki_pid);
-            if (!pid)
-                goto error;
-            if (PyList_Append(retlist, pid))
-                goto error;
-            Py_DECREF(pid);
-            proclist++;
-        }
-        free(orig_address);
-    }
-
-    return retlist;
-
-error:
-    Py_XDECREF(pid);
-    Py_DECREF(retlist);
-    if (orig_address != NULL) {
-        free(orig_address);
-    }
-    return NULL;
-}
-
-
-/*
- * Return a Python float indicating the system boot time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_system_boot_time(PyObject* self, PyObject* args)
-{
-    /* fetch sysctl "kern.boottime" */
-    static int request[2] = { CTL_KERN, KERN_BOOTTIME };
-    struct timeval result;
-    size_t result_len = sizeof result;
-    time_t boot_time = 0;
-
-    if (sysctl(request, 2, &result, &result_len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    boot_time = result.tv_sec;
-    return Py_BuildValue("f", (float)boot_time);
-}
-
-
-/*
- * Return process name from kinfo_proc as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("s", kp.ki_comm);
-}
-
-
-/*
- * Return process pathname executable.
- * Thanks to Robert N. M. Watson:
- * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_bin.c?v=8-CURRENT
- */
-static PyObject*
-get_process_exe(PyObject* self, PyObject* args)
-{
-    long pid;
-    char pathname[PATH_MAX];
-    int error;
-    int mib[4];
-    size_t size;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (pid == 0) {
-        // ...otherwise we'd get '\x98\xd5\xbf\xbf\xfb\xf3\x10\x08H\x01'
-        return Py_BuildValue("s", "");
-    }
-
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PATHNAME;
-    mib[3] = pid;
-
-    size = sizeof(pathname);
-    error = sysctl(mib, 4, pathname, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-    }
-
-    return Py_BuildValue("s", pathname);
-}
-
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args)
-{
-    long pid;
-    PyObject* arglist = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // get the commandline, defined in arch/bsd/process_info.c
-    arglist = get_arg_list(pid);
-
-    // get_arg_list() returns NULL only if getcmdargs failed with ESRCH
-    // (no process with that PID)
-    if (NULL == arglist) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("N", arglist);
-}
-
-
-/*
- * Return process parent pid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.ki_ppid);
-}
-
-
-/*
- * Return process status as a Python integer.
- */
-static PyObject*
-get_process_status(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", (int)kp.ki_stat);
-}
-
-
-/*
- * Return process real, effective and saved user ids from kinfo_proc
- * as a Python tuple.
- */
-static PyObject*
-get_process_uids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.ki_ruid,
-                                (long)kp.ki_uid,
-                                (long)kp.ki_svuid);
-}
-
-
-/*
- * Return process real, effective and saved group ids from kinfo_proc
- * as a Python tuple.
- */
-static PyObject*
-get_process_gids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.ki_rgid,
-                                (long)kp.ki_groups[0],
-                                (long)kp.ki_svuid);
-}
-
-
-/*
- * Return process real, effective and saved group ids from kinfo_proc
- * as a Python tuple.
- */
-static PyObject*
-get_process_tty_nr(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", kp.ki_tdev);
-}
-
-
-/*
- * Return the number of context switches performed by process as a tuple.
- */
-static PyObject*
-get_process_num_ctx_switches(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("(ll)", kp.ki_rusage.ru_nvcsw,
-                                 kp.ki_rusage.ru_nivcsw);
-}
-
-
-
-/*
- * Return number of threads used by process as a Python integer.
- */
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.ki_numthreads);
-}
-
-
-/*
- * Retrieves all threads used by process returning a list of tuples
- * including thread id, user time and system time.
- * Thanks to Robert N. M. Watson:
- * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_threads.c?v=8-CURRENT
- */
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int mib[4];
-    struct kinfo_proc *kip = NULL;
-    struct kinfo_proc *kipp;
-    int error;
-    unsigned int i;
-    size_t size;
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-
-    /*
-     * We need to re-query for thread information, so don't use *kipp.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
-    mib[3] = pid;
-
-    size = 0;
-    error = sysctl(mib, 4, NULL, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-    if (size == 0) {
-        NoSuchProcess();
-        goto error;
-    }
-
-    kip = malloc(size);
-    if (kip == NULL) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-
-    error = sysctl(mib, 4, kip, &size, NULL, 0);
-    if (error == -1) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-    if (size == 0) {
-        NoSuchProcess();
-        goto error;
-    }
-
-    for (i = 0; i < size / sizeof(*kipp); i++) {
-        kipp = &kip[i];
-        pyTuple = Py_BuildValue("Idd", kipp->ki_tid,
-                                       TV2DOUBLE(kipp->ki_rusage.ru_utime),
-                                       TV2DOUBLE(kipp->ki_rusage.ru_stime)
-                                );
-        if (pyTuple == NULL)
-            goto error;
-        if (PyList_Append(retList, pyTuple))
-            goto error;
-        Py_DECREF(pyTuple);
-    }
-    free(kip);
-    return retList;
-
-error:
-    Py_XDECREF(pyTuple);
-    Py_DECREF(retList);
-    if (kip != NULL) {
-        free(kip);
-    }
-    return NULL;
-}
-
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_process_cpu_times(PyObject* self, PyObject* args)
-{
-    long pid;
-    double user_t, sys_t;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    // convert from microseconds to seconds
-    user_t = TV2DOUBLE(kp.ki_rusage.ru_utime);
-    sys_t = TV2DOUBLE(kp.ki_rusage.ru_stime);
-    return Py_BuildValue("(dd)", user_t, sys_t);
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    int ncpu;
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_NCPU;
-    len = sizeof(ncpu);
-
-    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("i", ncpu);
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("d", TV2DOUBLE(kp.ki_start));
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_io_counters(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    // there's apparently no way to determine bytes count, hence return -1.
-    return Py_BuildValue("(llll)", kp.ki_rusage.ru_inblock,
-                                   kp.ki_rusage.ru_oublock,
-                                   -1, -1);
-}
-
-
-/*
- * Return extended memory info for a process as a Python tuple.
- */
-static PyObject*
-get_process_memory_info(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("(lllll)", ptoa(kp.ki_rssize),    // rss
-                                    (long)kp.ki_size,      // vms
-                                    ptoa(kp.ki_tsize),     // text
-                                    ptoa(kp.ki_dsize),     // data
-                                    ptoa(kp.ki_ssize));    // stack
-}
-
-
-/*
- * Return virtual memory usage statistics.
- */
-static PyObject*
-get_virtual_mem(PyObject* self, PyObject* args)
-{
-    unsigned int   total, active, inactive, wired, cached, free, buffers;
-    size_t		   size = sizeof(total);
-	struct vmtotal vm;
-	int            mib[] = {CTL_VM, VM_METER};
-	long           pagesize = getpagesize();
-
-    if (sysctlbyname("vm.stats.vm.v_page_count", &total, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vm.stats.vm.v_active_count", &active, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vm.stats.vm.v_wire_count", &wired, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vm.stats.vm.v_cache_count", &cached, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vm.stats.vm.v_free_count", &free, &size, NULL, 0))
-        goto error;
-    if (sysctlbyname("vfs.bufspace", &buffers, &size, NULL, 0))
-        goto error;
-
-    size = sizeof(vm);
-    if (sysctl(mib, 2, &vm, &size, NULL, 0) != 0)
-        goto error;
-
-    return Py_BuildValue("KKKKKKKK",
-        (unsigned long long) total    * pagesize,
-        (unsigned long long) free     * pagesize,
-        (unsigned long long) active   * pagesize,
-        (unsigned long long) inactive * pagesize,
-        (unsigned long long) wired    * pagesize,
-        (unsigned long long) cached   * pagesize,
-        (unsigned long long) buffers,
-        (unsigned long long) (vm.t_vmshr + vm.t_rmshr) * pagesize  // shared
-    );
-
-error:
-    PyErr_SetFromErrno(0);
-    return NULL;
-}
-
-
-/*
- * Return swap memory stats (see 'swapinfo' cmdline tool)
- */
-static PyObject*
-get_swap_mem(PyObject* self, PyObject* args)
-{
-    kvm_t *kd;
-    struct kvm_swap kvmsw[1];
-    unsigned int swapin, swapout, nodein, nodeout;
-    size_t size = sizeof(unsigned int);
-
-    if (kvm_getswapinfo(kd, kvmsw, 1, 0) < 0) {
-        PyErr_SetString(PyExc_RuntimeError, "kvm_getswapinfo failed");
-        return NULL;
-    }
-
-    if (sysctlbyname("vm.stats.vm.v_swapin", &swapin, &size, NULL, 0) == -1)
-        goto sbn_error;
-    if (sysctlbyname("vm.stats.vm.v_swapout", &swapout, &size, NULL, 0) == -1)
-        goto sbn_error;
-    if (sysctlbyname("vm.stats.vm.v_vnodein", &nodein, &size, NULL, 0) == -1)
-        goto sbn_error;
-    if (sysctlbyname("vm.stats.vm.v_vnodeout", &nodeout, &size, NULL, 0) == -1)
-        goto sbn_error;
-
-    return Py_BuildValue("(iiiII)",
-                            kvmsw[0].ksw_total,                     // total
-                            kvmsw[0].ksw_used,                      // used
-                            kvmsw[0].ksw_total - kvmsw[0].ksw_used, // free
-                            swapin + swapout,                       // swap in
-                            nodein + nodeout);                      // swap out
-
-sbn_error:
-    PyErr_SetFromErrno(0);
-    return NULL;
-}
-
-
-/*
- * Return a Python tuple representing user, kernel and idle CPU times
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    long cpu_time[CPUSTATES];
-    size_t size;
-
-    size = sizeof(cpu_time);
-
-    if (sysctlbyname("kern.cp_time", &cpu_time, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("(ddddd)",
-                         (double)cpu_time[CP_USER] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_NICE] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_SYS] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_IDLE] / CLOCKS_PER_SEC,
-                         (double)cpu_time[CP_INTR] / CLOCKS_PER_SEC
-    );
-}
-
-/*
- * XXX
- * These functions are available on FreeBSD 8 only.
- * In the upper python layer we do various tricks to avoid crashing
- * and/or to provide alternatives where possible.
- */
-
-
-#if defined(__FreeBSD_version) && __FreeBSD_version >= 800000
-/*
- * Return files opened by process as a list of (path, fd) tuples
- */
-static PyObject*
-get_process_open_files(PyObject* self, PyObject* args)
-{
-    long pid;
-    int i, cnt;
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-
-    struct kinfo_file *freep = NULL;
-    struct kinfo_file *kif;
-    struct kinfo_proc kipp;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        goto error;
-    if (get_kinfo_proc(pid, &kipp) == -1)
-        goto error;
-
-    freep = kinfo_getfile(pid, &cnt);
-    if (freep == NULL) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    for (i = 0; i < cnt; i++) {
-        kif = &freep[i];
-        if ((kif->kf_type == KF_TYPE_VNODE) &&
-            (kif->kf_vnode_type == KF_VTYPE_VREG))
-        {
-            tuple = Py_BuildValue("(si)", kif->kf_path, kif->kf_fd);
-            if (tuple == NULL)
-                goto error;
-            if (PyList_Append(retList, tuple))
-                goto error;
-            Py_DECREF(tuple);
-        }
-    }
-    free(freep);
-    return retList;
-
-error:
-    Py_XDECREF(tuple);
-    Py_DECREF(retList);
-    if (freep != NULL)
-        free(freep);
-    return NULL;
-}
-
-
-/*
- * Return files opened by process as a list of (path, fd) tuples
- */
-static PyObject*
-get_process_num_fds(PyObject* self, PyObject* args)
-{
-    long pid;
-    int cnt;
-
-    struct kinfo_file *freep;
-    struct kinfo_proc kipp;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        return NULL;
-    if (get_kinfo_proc(pid, &kipp) == -1)
-        return NULL;
-
-    freep = kinfo_getfile(pid, &cnt);
-    if (freep == NULL) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    free(freep);
-
-    return Py_BuildValue("i", cnt);
-}
-
-
-/*
- * Return process current working directory.
- */
-static PyObject*
-get_process_cwd(PyObject* self, PyObject* args)
-{
-    long pid;
-    PyObject *path = NULL;
-    struct kinfo_file *freep = NULL;
-    struct kinfo_file *kif;
-    struct kinfo_proc kipp;
-
-    int i, cnt;
-
-    if (! PyArg_ParseTuple(args, "l", &pid))
-        goto error;
-    if (get_kinfo_proc(pid, &kipp) == -1)
-        goto error;
-
-    freep = kinfo_getfile(pid, &cnt);
-    if (freep == NULL) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    for (i = 0; i < cnt; i++) {
-        kif = &freep[i];
-        if (kif->kf_fd == KF_FD_TYPE_CWD) {
-            path = Py_BuildValue("s", kif->kf_path);
-            if (!path)
-                goto error;
-            break;
-        }
-    }
-    /*
-     * For lower pids it seems we can't retrieve any information
-     * (lsof can't do that it either).  Since this happens even
-     * as root we return an empty string instead of AccessDenied.
-     */
-    if (path == NULL) {
-        path = Py_BuildValue("s", "");
-    }
-    free(freep);
-    return path;
-
-error:
-    Py_XDECREF(path);
-    if (freep != NULL)
-        free(freep);
-    return NULL;
-}
-
-
-/*
- * mathes Linux net/tcp_states.h:
- * http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
- */
-static char *
-get_connection_status(int st) {
-    switch (st) {
-        case TCPS_CLOSED:
-            return "CLOSE";
-        case TCPS_CLOSING:
-            return "CLOSING";
-        case TCPS_CLOSE_WAIT:
-            return "CLOSE_WAIT";
-        case TCPS_LISTEN:
-            return "LISTEN";
-        case TCPS_ESTABLISHED:
-            return "ESTABLISHED";
-        case TCPS_SYN_SENT:
-            return "SYN_SENT";
-        case TCPS_SYN_RECEIVED:
-            return "SYN_RECV";
-        case TCPS_FIN_WAIT_1:
-            return "FIN_WAIT_1";
-        case TCPS_FIN_WAIT_2:
-            return "FIN_WAIT_2";
-        case TCPS_LAST_ACK:
-            return "LAST_ACK";
-        case TCPS_TIME_WAIT:
-            return "TIME_WAIT";
-        default:
-            return "?";
-    }
-}
-
-// a kvm_read that returns true if everything is read
-#define KVM_READ(kaddr, paddr, len) \
-    ((len) < SSIZE_MAX && \
-    kvm_read(kd, (u_long)(kaddr), (char *)(paddr), (len)) == (ssize_t)(len))
-
-// XXX - copied from sys/file.h to make compiler happy
-struct file {
-    void        *f_data;    /* file descriptor specific data */
-    struct fileops  *f_ops;     /* File operations */
-    struct ucred    *f_cred;    /* associated credentials. */
-    struct vnode    *f_vnode;   /* NULL or applicable vnode */
-    short       f_type;     /* descriptor type */
-    short       f_vnread_flags; /* (f) Sleep lock for f_offset */
-    volatile u_int  f_flag;     /* see fcntl.h */
-    volatile u_int  f_count;    /* reference count */
-    int     f_seqcount; /* Count of sequential accesses. */
-    off_t       f_nextoff;  /* next expected read/write offset. */
-    struct cdev_privdata *f_cdevpriv; /* (d) Private data for the cdev. */
-    off_t       f_offset;
-    void        *f_label;   /* Place-holder for MAC label. */
-};
-
-
-/*
- * Return connections opened by process.
- * fstat.c source code was used as an example.
- */
-static PyObject*
-get_process_connections(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc *p;
-    struct file **ofiles = NULL;
-    char buf[_POSIX2_LINE_MAX];
-    char path[PATH_MAX];
-    int cnt;
-    int i;
-    kvm_t *kd = NULL;
-    struct file file;
-    struct filedesc filed;
-    struct nlist nl[] = {{ "" },};
-    struct socket   so;
-    struct protosw  proto;
-    struct domain   dom;
-    struct inpcb    inpcb;
-    struct tcpcb    tcpcb;
-    struct unpcb    unpcb;
-
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-    PyObject *laddr = NULL;
-    PyObject *raddr = NULL;
-    PyObject *af_filter = NULL;
-    PyObject *type_filter = NULL;
-    PyObject* _family = NULL;
-    PyObject* _type = NULL;
-
-    if (! PyArg_ParseTuple(args, "lOO", &pid, &af_filter, &type_filter)) {
-        goto error;
-    }
-    if (!PySequence_Check(af_filter) || !PySequence_Check(type_filter)) {
-        PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence");
-        goto error;
-    }
-
-    kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf);
-    if (kd == NULL) {
-        AccessDenied();
-        goto error;
-    }
-
-    if (kvm_nlist(kd, nl) != 0) {
-        PyErr_SetString(PyExc_RuntimeError, "kvm_nlist() failed");
-        goto error;
-    }
-
-    p = kvm_getprocs(kd, KERN_PROC_PID, pid, &cnt);
-    if (p == NULL) {
-        NoSuchProcess();
-        goto error;
-    }
-    if (cnt != 1) {
-        NoSuchProcess();
-        goto error;
-    }
-    if (p->ki_fd == NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "no usable fd found");
-        goto error;
-    }
-    if (!KVM_READ(p->ki_fd, &filed, sizeof(filed))) {
-        PyErr_SetString(PyExc_RuntimeError, "kvm_read() failed");
-        goto error;
-    }
-
-    ofiles = malloc((filed.fd_lastfile+1) * sizeof(struct file *));
-    if (ofiles == NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "malloc() failed");
-        goto error;
-    }
-
-    if (!KVM_READ(filed.fd_ofiles, ofiles,
-                  (filed.fd_lastfile+1) * sizeof(struct file *))) {
-        PyErr_SetString(PyExc_RuntimeError, "kvm_read() failed");
-        goto error;
-    }
-
-    for (i = 0; i <= filed.fd_lastfile; i++) {
-        int lport, rport;
-        char lip[200], rip[200];
-        char *state;
-        int inseq;
-        tuple = NULL;
-        laddr = NULL;
-        raddr = NULL;
-
-        if (ofiles[i] == NULL) {
-            continue;
-        }
-        if (!KVM_READ(ofiles[i], &file, sizeof (struct file))) {
-            PyErr_SetString(PyExc_RuntimeError, "kvm_read() file failed");
-            goto error;
-        }
-        if (file.f_type == DTYPE_SOCKET) {
-            // fill in socket
-            if (!KVM_READ(file.f_data, &so, sizeof(struct socket))) {
-                PyErr_SetString(PyExc_RuntimeError, "kvm_read() socket failed");
-                goto error;
-            }
-            // fill in protosw entry
-            if (!KVM_READ(so.so_proto, &proto, sizeof(struct protosw))) {
-                PyErr_SetString(PyExc_RuntimeError, "kvm_read() proto failed");
-                goto error;
-            }
-            // fill in domain
-            if (!KVM_READ(proto.pr_domain, &dom, sizeof(struct domain))) {
-                PyErr_SetString(PyExc_RuntimeError, "kvm_read() domain failed");
-                goto error;
-            }
-
-            // apply filters
-            _family = PyLong_FromLong((long)dom.dom_family);
-            inseq = PySequence_Contains(af_filter, _family);
-            Py_DECREF(_family);
-            if (inseq == 0) {
-                continue;
-            }
-            _type = PyLong_FromLong((long)proto.pr_type);
-            inseq = PySequence_Contains(type_filter, _type);
-            Py_DECREF(_type);
-            if (inseq == 0) {
-                continue;
-            }
-
-            // IPv4 / IPv6 socket
-            if ((dom.dom_family == AF_INET) || (dom.dom_family == AF_INET6)) {
-                // fill inpcb
-                if (kvm_read(kd, (u_long)so.so_pcb, (char *)&inpcb,
-                             sizeof(struct inpcb)) != sizeof(struct inpcb)) {
-                    PyErr_SetString(PyExc_RuntimeError, "kvm_read() addr failed");
-                    goto error;
-                }
-
-                // fill status
-                if (proto.pr_type == SOCK_STREAM) {
-                    if (kvm_read(kd, (u_long)inpcb.inp_ppcb, (char *)&tcpcb,
-                                 sizeof(struct tcpcb)) != sizeof(struct tcpcb)) {
-                        PyErr_SetString(PyExc_RuntimeError, "kvm_read() state failed");
-                        goto error;
-                    }
-                    state = get_connection_status((int)tcpcb.t_state);
-                }
-                else {
-                    state = "";
-                }
-
-                // build addr and port
-                if (dom.dom_family == AF_INET) {
-                    inet_ntop(AF_INET, &inpcb.inp_laddr.s_addr, lip, sizeof(lip));
-                    inet_ntop(AF_INET, &inpcb.inp_faddr.s_addr, rip, sizeof(rip));
-                }
-                else {
-                    inet_ntop(AF_INET6, &inpcb.in6p_laddr.s6_addr, lip, sizeof(lip));
-                    inet_ntop(AF_INET6, &inpcb.in6p_faddr.s6_addr, rip, sizeof(rip));
-                }
-                lport = ntohs(inpcb.inp_lport);
-                rport = ntohs(inpcb.inp_fport);
-
-                // contruct python tuple/list
-                laddr = Py_BuildValue("(si)", lip, lport);
-                if (!laddr)
-                    goto error;
-                if (rport != 0) {
-                    raddr = Py_BuildValue("(si)", rip, rport);
-                }
-                else {
-                    raddr = Py_BuildValue("()");
-                }
-                if (!raddr)
-                    goto error;
-                tuple = Py_BuildValue("(iiiNNs)", i,
-                                                  dom.dom_family,
-                                                  proto.pr_type,
-                                                  laddr,
-                                                  raddr,
-                                                  state);
-                if (!tuple)
-                    goto error;
-                if (PyList_Append(retList, tuple))
-                    goto error;
-                Py_DECREF(tuple);
-            }
-            // UNIX socket
-            else if (dom.dom_family == AF_UNIX) {
-                struct sockaddr_un sun;
-                path[0] = '\0';
-
-                if (kvm_read(kd, (u_long)so.so_pcb, (char *)&unpcb,
-                             sizeof(struct unpcb)) != sizeof(struct unpcb)) {
-                    PyErr_SetString(PyExc_RuntimeError, "kvm_read() unpcb failed");
-                    goto error;
-                }
-                if (unpcb.unp_addr) {
-                    if (kvm_read(kd, (u_long)unpcb.unp_addr, (char *)&sun,
-                                 sizeof(sun)) != sizeof(sun)) {
-                        PyErr_SetString(PyExc_RuntimeError,
-                                        "kvm_read() sockaddr_un failed");
-                        goto error;
-                    }
-                    sprintf(path, "%.*s",
-                            (sun.sun_len - (sizeof(sun) - sizeof(sun.sun_path))),
-                             sun.sun_path);
-                }
-
-                tuple = Py_BuildValue("(iiisOs)", i,
-                                                  dom.dom_family,
-                                                  proto.pr_type,
-                                                  path,
-                                                  Py_None,
-                                                  "");
-                if (!tuple)
-                    goto error;
-                if (PyList_Append(retList, tuple))
-                    goto error;
-                Py_DECREF(tuple);
-                Py_INCREF(Py_None);
-            }
-        }
-    }
-
-    free(ofiles);
-    kvm_close(kd);
-    return retList;
-
-error:
-    Py_XDECREF(tuple);
-    Py_XDECREF(laddr);
-    Py_XDECREF(raddr);
-    Py_DECREF(retList);
-
-    if (kd != NULL) {
-        kvm_close(kd);
-    }
-    if (ofiles != NULL) {
-        free(ofiles);
-    }
-    return NULL;
-}
-
-
-/*
- * Return a Python list of tuple representing per-cpu times
- */
-static PyObject*
-get_system_per_cpu_times(PyObject* self, PyObject* args)
-{
-    static int maxcpus;
-    int mib[2];
-    int ncpu;
-    size_t len;
-    size_t size;
-    int i;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_cputime = NULL;
-
-    // retrieve maxcpus value
-    size = sizeof(maxcpus);
-    if (sysctlbyname("kern.smp.maxcpus", &maxcpus, &size, NULL, 0) < 0) {
-        Py_DECREF(py_retlist);
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    long cpu_time[maxcpus][CPUSTATES];
-
-    // retrieve the number of cpus
-    mib[0] = CTL_HW;
-    mib[1] = HW_NCPU;
-    len = sizeof(ncpu);
-    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    // per-cpu info
-    size = sizeof(cpu_time);
-    if (sysctlbyname("kern.cp_times", &cpu_time, &size, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    for (i = 0; i < ncpu; i++) {
-        py_cputime = Py_BuildValue("(ddddd)",
-                               (double)cpu_time[i][CP_USER] / CLOCKS_PER_SEC,
-                               (double)cpu_time[i][CP_NICE] / CLOCKS_PER_SEC,
-                               (double)cpu_time[i][CP_SYS] / CLOCKS_PER_SEC,
-                               (double)cpu_time[i][CP_IDLE] / CLOCKS_PER_SEC,
-                               (double)cpu_time[i][CP_INTR] / CLOCKS_PER_SEC
-                               );
-        if (!py_cputime)
-            goto error;
-        if (PyList_Append(py_retlist, py_cputime))
-            goto error;
-        Py_DECREF(py_cputime);
-    }
-
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_cputime);
-    Py_DECREF(py_retlist);
-    return NULL;
-}
-
-
-/*
- * Return a list of tuples for every process memory maps.
- * 'procstat' cmdline utility has been used as an example.
- */
-static PyObject*
-get_process_memory_maps(PyObject* self, PyObject* args)
-{
-    long pid;
-    int ptrwidth;
-    int i, cnt;
-    char addr[30];
-    char perms[10];
-    const char *path;
-    struct kinfo_proc kp;
-    struct kinfo_vmentry *freep = NULL;
-    struct kinfo_vmentry *kve;
-    PyObject* pytuple = NULL;
-    PyObject* retlist = PyList_New(0);
-
-    ptrwidth = 2*sizeof(void *);
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        goto error;
-    }
-
-    freep = kinfo_getvmmap(pid, &cnt);
-    if (freep == NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "kinfo_getvmmap() failed");
-        goto error;
-    }
-    for (i = 0; i < cnt; i++) {
-        pytuple = NULL;
-        kve = &freep[i];
-        addr[0] = '\0';
-        perms[0] = '\0';
-        sprintf(addr, "%#*jx-%#*jx", ptrwidth, (uintmax_t)kve->kve_start,
-                                     ptrwidth, (uintmax_t)kve->kve_end);
-        strlcat(perms, kve->kve_protection & KVME_PROT_READ ? "r" : "-",
-                sizeof(perms));
-        strlcat(perms, kve->kve_protection & KVME_PROT_WRITE ? "w" : "-",
-                sizeof(perms));
-        strlcat(perms, kve->kve_protection & KVME_PROT_EXEC ? "x" : "-",
-                sizeof(perms));
-
-        if (strlen(kve->kve_path) == 0) {
-            switch (kve->kve_type) {
-            case KVME_TYPE_NONE:
-                path = "[none]";
-                break;
-            case KVME_TYPE_DEFAULT:
-                path = "[default]";
-                break;
-            case KVME_TYPE_VNODE:
-                path = "[vnode]";
-                break;
-            case KVME_TYPE_SWAP:
-                path = "[swap]";
-                break;
-            case KVME_TYPE_DEVICE:
-                path = "[device]";
-                break;
-            case KVME_TYPE_PHYS:
-                path = "[phys]";
-                break;
-            case KVME_TYPE_DEAD:
-                path = "[dead]";
-                break;
-            case KVME_TYPE_SG:
-                path = "[sg]";
-                break;
-            case KVME_TYPE_UNKNOWN:
-                path = "[unknown]";
-                break;
-            default:
-                path = "[?]";
-                break;
-            }
-        }
-        else {
-            path = kve->kve_path;
-        }
-
-        pytuple = Py_BuildValue("sssiiii",
-            addr,                       // "start-end" address
-            perms,                      // "rwx" permissions
-            path,                       // path
-            kve->kve_resident,          // rss
-            kve->kve_private_resident,  // private
-            kve->kve_ref_count,         // ref count
-            kve->kve_shadow_count       // shadow count
-        );
-        if (!pytuple)
-            goto error;
-        if (PyList_Append(retlist, pytuple))
-            goto error;
-        Py_DECREF(pytuple);
-    }
-    free(freep);
-    return retlist;
-
-error:
-    Py_XDECREF(pytuple);
-    Py_DECREF(retlist);
-    if (freep != NULL)
-        free(freep);
-    return NULL;
-}
-#endif
-
-
-/*
- * Return a list of tuples including device, mount point and fs type
- * for all partitions mounted on the system.
- */
-static PyObject*
-get_disk_partitions(PyObject* self, PyObject* args)
-{
-    int num;
-    int i;
-    long len;
-    uint64_t flags;
-    char opts[200];
-    struct statfs *fs = NULL;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_tuple = NULL;
-
-    // get the number of mount points
-    Py_BEGIN_ALLOW_THREADS
-    num = getfsstat(NULL, 0, MNT_NOWAIT);
-    Py_END_ALLOW_THREADS
-    if (num == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    len = sizeof(*fs) * num;
-    fs = malloc(len);
-
-    Py_BEGIN_ALLOW_THREADS
-    num = getfsstat(fs, len, MNT_NOWAIT);
-    Py_END_ALLOW_THREADS
-    if (num == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    for (i = 0; i < num; i++) {
-        py_tuple = NULL;
-        opts[0] = 0;
-        flags = fs[i].f_flags;
-
-        // see sys/mount.h
-        if (flags & MNT_RDONLY)
-            strlcat(opts, "ro", sizeof(opts));
-        else
-            strlcat(opts, "rw", sizeof(opts));
-        if (flags & MNT_SYNCHRONOUS)
-            strlcat(opts, ",sync", sizeof(opts));
-        if (flags & MNT_NOEXEC)
-            strlcat(opts, ",noexec", sizeof(opts));
-        if (flags & MNT_NOSUID)
-            strlcat(opts, ",nosuid", sizeof(opts));
-        if (flags & MNT_UNION)
-            strlcat(opts, ",union", sizeof(opts));
-        if (flags & MNT_ASYNC)
-            strlcat(opts, ",async", sizeof(opts));
-        if (flags & MNT_SUIDDIR)
-            strlcat(opts, ",suiddir", sizeof(opts));
-        if (flags & MNT_SOFTDEP)
-            strlcat(opts, ",softdep", sizeof(opts));
-        if (flags & MNT_NOSYMFOLLOW)
-            strlcat(opts, ",nosymfollow", sizeof(opts));
-        if (flags & MNT_GJOURNAL)
-            strlcat(opts, ",gjournal", sizeof(opts));
-        if (flags & MNT_MULTILABEL)
-            strlcat(opts, ",multilabel", sizeof(opts));
-        if (flags & MNT_ACLS)
-            strlcat(opts, ",acls", sizeof(opts));
-        if (flags & MNT_NOATIME)
-            strlcat(opts, ",noatime", sizeof(opts));
-        if (flags & MNT_NOCLUSTERR)
-            strlcat(opts, ",noclusterr", sizeof(opts));
-        if (flags & MNT_NOCLUSTERW)
-            strlcat(opts, ",noclusterw", sizeof(opts));
-        if (flags & MNT_NFS4ACLS)
-            strlcat(opts, ",nfs4acls", sizeof(opts));
-
-        py_tuple = Py_BuildValue("(ssss)", fs[i].f_mntfromname,  // device
-                                           fs[i].f_mntonname,    // mount point
-                                           fs[i].f_fstypename,   // fs type
-                                           opts);                // options
-        if (!py_tuple)
-            goto error;
-        if (PyList_Append(py_retlist, py_tuple))
-            goto error;
-        Py_DECREF(py_tuple);
-    }
-
-    free(fs);
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_retlist);
-    if (fs != NULL)
-        free(fs);
-    return NULL;
-}
-
-
-/*
- * Return a Python list of named tuples with overall network I/O information
- */
-static PyObject*
-get_network_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_ifc_info = NULL;
-
-    char *buf = NULL, *lim, *next;
-    struct if_msghdr *ifm;
-    int mib[6];
-    size_t len;
-
-    mib[0] = CTL_NET;          // networking subsystem
-    mib[1] = PF_ROUTE;         // type of information
-    mib[2] = 0;                // protocol (IPPROTO_xxx)
-    mib[3] = 0;                // address family
-    mib[4] = NET_RT_IFLIST;   // operation
-    mib[5] = 0;
-
-    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-
-    buf = malloc(len);
-
-    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    lim = buf + len;
-
-    for (next = buf; next < lim; ) {
-        py_ifc_info = NULL;
-        ifm = (struct if_msghdr *)next;
-        next += ifm->ifm_msglen;
-
-        if (ifm->ifm_type == RTM_IFINFO) {
-            struct if_msghdr *if2m = (struct if_msghdr *)ifm;
-            struct sockaddr_dl *sdl = (struct sockaddr_dl *)(if2m + 1);
-            char ifc_name[32];
-
-            strncpy(ifc_name, sdl->sdl_data, sdl->sdl_nlen);
-            ifc_name[sdl->sdl_nlen] = 0;
-
-            py_ifc_info = Py_BuildValue("(kkkkkkki)",
-                                        if2m->ifm_data.ifi_obytes,
-                                        if2m->ifm_data.ifi_ibytes,
-                                        if2m->ifm_data.ifi_opackets,
-                                        if2m->ifm_data.ifi_ipackets,
-                                        if2m->ifm_data.ifi_ierrors,
-                                        if2m->ifm_data.ifi_oerrors,
-                                        if2m->ifm_data.ifi_iqdrops,
-                                        0);  // dropout not supported
-            if (!py_ifc_info)
-                goto error;
-            if (PyDict_SetItemString(py_retdict, ifc_name, py_ifc_info))
-                goto error;
-            Py_DECREF(py_ifc_info);
-        }
-        else {
-            continue;
-        }
-    }
-
-    free(buf);
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_ifc_info);
-    Py_DECREF(py_retdict);
-    if (buf != NULL)
-        free(buf);
-    return NULL;
-}
-
-
-/*
- * Return a Python dict of tuples for disk I/O information
- */
-static PyObject*
-get_disk_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_disk_info = NULL;
-
-    int i;
-    struct statinfo stats;
-
-    if (devstat_checkversion(NULL) < 0) {
-        PyErr_Format(PyExc_RuntimeError, "devstat_checkversion() failed");
-        goto error;
-    }
-
-    stats.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
-    bzero(stats.dinfo, sizeof(struct devinfo));
-
-    if (devstat_getdevs(NULL, &stats) == -1) {
-        PyErr_Format(PyExc_RuntimeError, "devstat_getdevs() failed");
-        goto error;
-    }
-
-    for (i = 0; i < stats.dinfo->numdevs; i++) {
-        py_disk_info = NULL;
-        struct devstat current;
-        char disk_name[128];
-        current = stats.dinfo->devices[i];
-        snprintf(disk_name, sizeof(disk_name), "%s%d",
-                                current.device_name,
-                                current.unit_number);
-
-        py_disk_info = Py_BuildValue("(KKKKLL)",
-            current.operations[DEVSTAT_READ],   // no reads
-            current.operations[DEVSTAT_WRITE],  // no writes
-            current.bytes[DEVSTAT_READ],        // bytes read
-            current.bytes[DEVSTAT_WRITE],       // bytes written
-            (long long)devstat_compute_etime(
-                &current.duration[DEVSTAT_READ], NULL),  // r time
-            (long long)devstat_compute_etime(
-                &current.duration[DEVSTAT_WRITE], NULL)  // w time
-        );
-        if (!py_disk_info)
-            goto error;
-        if (PyDict_SetItemString(py_retdict, disk_name, py_disk_info))
-            goto error;
-        Py_DECREF(py_disk_info);
-    }
-
-    if (stats.dinfo->mem_ptr) {
-        free(stats.dinfo->mem_ptr);
-    }
-    free(stats.dinfo);
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_disk_info);
-    Py_DECREF(py_retdict);
-    if (stats.dinfo != NULL)
-        free(stats.dinfo);
-    return NULL;
-}
-
-
-/*
- * Return currently connected users as a list of tuples.
- */
-static PyObject*
-get_system_users(PyObject* self, PyObject* args)
-{
-    PyObject *ret_list = PyList_New(0);
-    PyObject *tuple = NULL;
-
-#if __FreeBSD_version < 900000
-    struct utmp ut;
-    FILE *fp;
-
-    fp = fopen(_PATH_UTMP, "r");
-    if (fp == NULL) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    while (fread(&ut, sizeof(ut), 1, fp) == 1) {
-        if (*ut.ut_name == '\0')
-            continue;
-        tuple = Py_BuildValue("(sssf)",
-            ut.ut_name,              // username
-            ut.ut_line,              // tty
-            ut.ut_host,              // hostname
-            (float)ut.ut_time        // start time
-        );
-        if (!tuple) {
-            fclose(fp);
-            goto error;
-        }
-        if (PyList_Append(ret_list, tuple)) {
-            fclose(fp);
-            goto error;
-        }
-        Py_DECREF(tuple);
-    }
-
-    fclose(fp);
-#else
-    struct utmpx *utx;
-
-    while ((utx = getutxent()) != NULL) {
-        if (utx->ut_type != USER_PROCESS)
-            continue;
-        tuple = Py_BuildValue("(sssf)",
-            utx->ut_user,             // username
-            utx->ut_line,             // tty
-            utx->ut_host,             // hostname
-            (float)utx->ut_tv.tv_sec  // start time
-        );
-        if (!tuple) {
-            endutxent();
-            goto error;
-        }
-        if (PyList_Append(ret_list, tuple)) {
-            endutxent();
-            goto error;
-        }
-        Py_DECREF(tuple);
-    }
-
-    endutxent();
-#endif
-    return ret_list;
-
-error:
-    Py_XDECREF(tuple);
-    Py_DECREF(ret_list);
-    return NULL;
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     // --- per-process functions
-
-     {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-     {"get_process_connections", get_process_connections, METH_VARARGS,
-        "Return connections opened by process"},
-     {"get_process_exe", get_process_exe, METH_VARARGS,
-        "Return process pathname executable"},
-     {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-     {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-     {"get_process_uids", get_process_uids, METH_VARARGS,
-        "Return process real effective and saved user ids as a Python tuple"},
-     {"get_process_gids", get_process_gids, METH_VARARGS,
-        "Return process real effective and saved group ids as a Python tuple"},
-     {"get_process_cpu_times", get_process_cpu_times, METH_VARARGS,
-           "Return tuple of user/kern time for the given PID"},
-     {"get_process_create_time", get_process_create_time, METH_VARARGS,
-         "Return a float indicating the process create time expressed in "
-         "seconds since the epoch"},
-     {"get_process_memory_info", get_process_memory_info, METH_VARARGS,
-         "Return extended memory info for a process as a Python tuple."},
-     {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-         "Return number of threads used by process"},
-     {"get_process_num_ctx_switches", get_process_num_ctx_switches, METH_VARARGS,
-         "Return the number of context switches performed by process"},
-     {"get_process_threads", get_process_threads, METH_VARARGS,
-         "Return process threads"},
-     {"get_process_status", get_process_status, METH_VARARGS,
-         "Return process status as an integer"},
-     {"get_process_io_counters", get_process_io_counters, METH_VARARGS,
-         "Return process IO counters"},
-     {"get_process_tty_nr", get_process_tty_nr, METH_VARARGS,
-         "Return process tty (terminal) number"},
-#if defined(__FreeBSD_version) && __FreeBSD_version >= 800000
-     {"get_process_open_files", get_process_open_files, METH_VARARGS,
-         "Return files opened by process as a list of (path, fd) tuples"},
-     {"get_process_cwd", get_process_cwd, METH_VARARGS,
-         "Return process current working directory."},
-     {"get_process_memory_maps", get_process_memory_maps, METH_VARARGS,
-         "Return a list of tuples for every process's memory map"},
-     {"get_process_num_fds", get_process_num_fds, METH_VARARGS,
-         "Return the number of file descriptors opened by this process"},
-#endif
-
-     // --- system-related functions
-
-     {"get_pid_list", get_pid_list, METH_VARARGS,
-         "Returns a list of PIDs currently running on the system"},
-     {"get_num_cpus", get_num_cpus, METH_VARARGS,
-           "Return number of CPUs on the system"},
-     {"get_virtual_mem", get_virtual_mem, METH_VARARGS,
-         "Return system virtual memory usage statistics"},
-     {"get_swap_mem", get_swap_mem, METH_VARARGS,
-         "Return swap mem stats"},
-     {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-         "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
-#if defined(__FreeBSD_version) && __FreeBSD_version >= 800000
-     {"get_system_per_cpu_times", get_system_per_cpu_times, METH_VARARGS,
-         "Return system per-cpu times as a list of tuples"},
-#endif
-     {"get_system_boot_time", get_system_boot_time, METH_VARARGS,
-         "Return a float indicating the system boot time expressed in "
-         "seconds since the epoch"},
-     {"get_disk_partitions", get_disk_partitions, METH_VARARGS,
-         "Return a list of tuples including device, mount point and "
-         "fs type for all partitions mounted on the system."},
-     {"get_network_io_counters", get_network_io_counters, METH_VARARGS,
-         "Return dict of tuples of networks I/O information."},
-     {"get_disk_io_counters", get_disk_io_counters, METH_VARARGS,
-         "Return a Python dict of tuples for disk I/O information"},
-     {"get_system_users", get_system_users, METH_VARARGS,
-        "Return currently connected users as a list of tuples"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_bsd_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_bsd_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_bsd",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_bsd_traverse,
-        psutil_bsd_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_bsd(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_bsd(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_bsd", PsutilMethods);
-#endif
-    PyModule_AddIntConstant(module, "SSTOP", SSTOP);
-    PyModule_AddIntConstant(module, "SSLEEP", SSLEEP);
-    PyModule_AddIntConstant(module, "SRUN", SRUN);
-    PyModule_AddIntConstant(module, "SIDL", SIDL);
-    PyModule_AddIntConstant(module, "SWAIT", SWAIT);
-    PyModule_AddIntConstant(module, "SLOCK", SLOCK);
-    PyModule_AddIntConstant(module, "SZOMB", SZOMB);
-
-    if (module == NULL) {
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_bsd.h b/contrib/psutil-0.6.1/psutil/_psutil_bsd.h
deleted file mode 100644
index 3c87a86..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_bsd.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * $Id: _psutil_bsd.h 1498 2012-07-24 21:41:28Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * BSD platform-specific module methods for _psutil_bsd
- */
-
-#include <Python.h>
-
-// --- per-process functions
-
-static PyObject* get_process_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_exe(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_uids(PyObject* self, PyObject* args);
-static PyObject* get_process_gids(PyObject* self, PyObject* args);
-static PyObject* get_process_connections(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_num_fds(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_status(PyObject* self, PyObject* args);
-static PyObject* get_process_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_process_tty_nr(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_maps(PyObject* self, PyObject* args);
-static PyObject* get_process_num_ctx_switches(PyObject* self, PyObject* args);
-#if defined(__FreeBSD_version) && __FreeBSD_version >= 800000
-static PyObject* get_process_open_files(PyObject* self, PyObject* args);
-static PyObject* get_process_cwd(PyObject* self, PyObject* args);
-#endif
-
-// --- system-related functions
-
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_virtual_mem(PyObject* self, PyObject* args);
-static PyObject* get_swap_mem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-#if defined(__FreeBSD_version) && __FreeBSD_version >= 800000
-static PyObject* get_system_per_cpu_times(PyObject* self, PyObject* args);
-#endif
-static PyObject* get_system_boot_time(PyObject* self, PyObject* args);
-static PyObject* get_disk_partitions(PyObject* self, PyObject* args);
-static PyObject* get_network_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_disk_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_system_users(PyObject* self, PyObject* args);
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_common.c b/contrib/psutil-0.6.1/psutil/_psutil_common.c
deleted file mode 100644
index 79aef97..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_common.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * $Id: _psutil_common.c 1142 2011-10-05 18:45:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Routines common to all platforms.
- */
-
-#include <Python.h>
-
-
-/*
- * Set OSError(errno=ESRCH, strerror="No such process") Python exception.
- */
-PyObject *
-NoSuchProcess(void) {
-    PyObject *exc;
-    char *msg = strerror(ESRCH);
-    exc = PyObject_CallFunction(PyExc_OSError, "(is)", ESRCH, msg);
-    PyErr_SetObject(PyExc_OSError, exc);
-    Py_XDECREF(exc);
-    return NULL;
-}
-
-/*
- * Set OSError(errno=EACCES, strerror="Permission denied") Python exception.
- */
-PyObject *
-AccessDenied(void) {
-    PyObject *exc;
-    char *msg = strerror(EACCES);
-    exc = PyObject_CallFunction(PyExc_OSError, "(is)", EACCES, msg);
-    PyErr_SetObject(PyExc_OSError, exc);
-    Py_XDECREF(exc);
-    return NULL;
-}
-
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_common.h b/contrib/psutil-0.6.1/psutil/_psutil_common.h
deleted file mode 100644
index cfe9493..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_common.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * $Id: _psutil_common.h 1142 2011-10-05 18:45:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <Python.h>
-
-PyObject* NoSuchProcess(void);
-PyObject* AccessDenied(void);
-
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_linux.c b/contrib/psutil-0.6.1/psutil/_psutil_linux.c
deleted file mode 100644
index 5093e61..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_linux.c
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * $Id: _psutil_linux.c 1498 2012-07-24 21:41:28Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Linux-specific functions.
- */
-
-#include <Python.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <mntent.h>
-#include <utmp.h>
-#include <sched.h>
-#include <sys/syscall.h>
-#include <sys/sysinfo.h>
-#include <linux/unistd.h>
-
-#include "_psutil_linux.h"
-
-
-#define HAS_IOPRIO defined(__NR_ioprio_get) && defined(__NR_ioprio_set)
-
-#if HAS_IOPRIO
-enum {
-    IOPRIO_WHO_PROCESS = 1,
-};
-
-static inline int
-ioprio_get(int which, int who)
-{
-    return syscall(__NR_ioprio_get, which, who);
-}
-
-static inline int
-ioprio_set(int which, int who, int ioprio)
-{
-    return syscall(__NR_ioprio_set, which, who, ioprio);
-}
-
-#define IOPRIO_CLASS_SHIFT  13
-#define IOPRIO_PRIO_MASK  ((1UL << IOPRIO_CLASS_SHIFT) - 1)
-
-#define IOPRIO_PRIO_CLASS(mask)  ((mask) >> IOPRIO_CLASS_SHIFT)
-#define IOPRIO_PRIO_DATA(mask)  ((mask) & IOPRIO_PRIO_MASK)
-#define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)
-
-
-/*
- * Return a (ioclass, iodata) Python tuple representing process I/O priority.
- */
-static PyObject*
-linux_ioprio_get(PyObject* self, PyObject* args)
-{
-    long pid;
-    int ioprio, ioclass, iodata;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid);
-    if (ioprio == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    ioclass = IOPRIO_PRIO_CLASS(ioprio);
-    iodata = IOPRIO_PRIO_DATA(ioprio);
-    return Py_BuildValue("ii", ioclass, iodata);
-}
-
-
-/*
- * A wrapper around ioprio_set(); sets process I/O priority.
- * ioclass can be either IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE
- * or 0. iodata goes from 0 to 7 depending on ioclass specified.
- */
-static PyObject*
-linux_ioprio_set(PyObject* self, PyObject* args)
-{
-    long pid;
-    int ioprio, ioclass, iodata;
-    int retval;
-
-    if (! PyArg_ParseTuple(args, "lii", &pid, &ioclass, &iodata)) {
-        return NULL;
-    }
-    ioprio = IOPRIO_PRIO_VALUE(ioclass, iodata);
-    retval = ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio);
-    if (retval == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-
-/*
- * Return disk mounted partitions as a list of tuples including device,
- * mount point and filesystem type
- */
-static PyObject*
-get_disk_partitions(PyObject* self, PyObject* args)
-{
-    FILE *file = NULL;
-    struct mntent *entry;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_tuple = NULL;
-
-    // MOUNTED constant comes from mntent.h and it's == '/etc/mtab'
-    Py_BEGIN_ALLOW_THREADS
-    file = setmntent(MOUNTED, "r");
-    Py_END_ALLOW_THREADS
-    if ((file == 0) || (file == NULL)) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-
-    while ((entry = getmntent(file))) {
-        if (entry == NULL) {
-            PyErr_Format(PyExc_RuntimeError, "getmntent() failed");
-            goto error;
-        }
-        py_tuple = Py_BuildValue("(ssss)", entry->mnt_fsname,  // device
-                                           entry->mnt_dir,     // mount point
-                                           entry->mnt_type,    // fs type
-                                           entry->mnt_opts);   // options
-        if (! py_tuple)
-            goto error;
-        if (PyList_Append(py_retlist, py_tuple))
-            goto error;
-        Py_DECREF(py_tuple);
-    }
-    endmntent(file);
-    return py_retlist;
-
-error:
-    if (file != NULL)
-        endmntent(file);
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_retlist);
-    return NULL;
-}
-
-
-/*
- * A wrapper around sysinfo(), return system memory usage statistics.
- */
-static PyObject*
-get_sysinfo(PyObject* self, PyObject* args)
-{
-    struct sysinfo info;
-    if (sysinfo(&info) != 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("(KKKKKK)",
-        (unsigned long long)info.totalram  * info.mem_unit,   // total
-        (unsigned long long)info.freeram   * info.mem_unit,   // free
-        (unsigned long long)info.bufferram * info.mem_unit,   // buffer
-        (unsigned long long)info.sharedram * info.mem_unit,   // shared
-        (unsigned long long)info.totalswap * info.mem_unit,   // swap tot
-        (unsigned long long)info.freeswap  * info.mem_unit);  // swap free
-    // TODO: we can also determine BOOT_TIME here
-}
-
-
-/*
- * Return process CPU affinity as a Python long (the bitmask)
- */
-static PyObject*
-get_process_cpu_affinity(PyObject* self, PyObject* args)
-{
-    unsigned long mask;
-    unsigned int len = sizeof(mask);
-    long pid;
-
-    if (!PyArg_ParseTuple(args, "i", &pid)) {
-        return NULL;
-    }
-    if (sched_getaffinity(pid, len, (cpu_set_t *)&mask) < 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("l", mask);
-}
-
-
-/*
- * Set process CPU affinity; expects a bitmask
- */
-static PyObject*
-set_process_cpu_affinity(PyObject* self, PyObject* args)
-{
-    unsigned long mask;
-    unsigned int len = sizeof(mask);
-    long pid;
-
-    if (!PyArg_ParseTuple(args, "ll", &pid, &mask)) {
-        return NULL;
-    }
-    if (sched_setaffinity(pid, len, (cpu_set_t *)&mask)) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Return currently connected users as a list of tuples.
- */
-static PyObject*
-get_system_users(PyObject* self, PyObject* args)
-{
-    PyObject *ret_list = PyList_New(0);
-    PyObject *tuple = NULL;
-    PyObject *user_proc = NULL;
-    struct utmp *ut;
-
-    setutent();
-    while (NULL != (ut = getutent())) {
-        tuple = NULL;
-        user_proc = NULL;
-        if (ut->ut_type == USER_PROCESS)
-            user_proc = Py_True;
-        else
-            user_proc = Py_False;
-        tuple = Py_BuildValue("(sssfO)",
-            ut->ut_user,              // username
-            ut->ut_line,              // tty
-            ut->ut_host,              // hostname
-            (float)ut->ut_tv.tv_sec,  // tstamp
-            user_proc                 // (bool) user process
-        );
-        if (! tuple)
-            goto error;
-        if (PyList_Append(ret_list, tuple))
-            goto error;
-        Py_DECREF(tuple);
-    }
-    endutent();
-    return ret_list;
-
-error:
-    Py_XDECREF(tuple);
-    Py_XDECREF(user_proc);
-    Py_DECREF(ret_list);
-    endutent();
-    return NULL;
-}
-
-
-/*
- * Define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-#if HAS_IOPRIO
-     {"ioprio_get", linux_ioprio_get, METH_VARARGS,
-        "Get process I/O priority"},
-     {"ioprio_set", linux_ioprio_set, METH_VARARGS,
-        "Set process I/O priority"},
-#endif
-     {"get_disk_partitions", get_disk_partitions, METH_VARARGS,
-        "Return disk mounted partitions as a list of tuples including "
-        "device, mount point and filesystem type"},
-     {"get_sysinfo", get_sysinfo, METH_VARARGS,
-        "A wrapper around sysinfo(), return system memory usage statistics"},
-     {"get_process_cpu_affinity", get_process_cpu_affinity, METH_VARARGS,
-        "Return process CPU affinity as a Python long (the bitmask)."},
-     {"set_process_cpu_affinity", set_process_cpu_affinity, METH_VARARGS,
-        "Set process CPU affinity; expects a bitmask."},
-     {"get_system_users", get_system_users, METH_VARARGS,
-        "Return currently connected users as a list of tuples"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_linux_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_linux_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_linux",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_linux_traverse,
-        psutil_linux_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_linux(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_linux(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_linux", PsutilMethods);
-#endif
-    if (module == NULL) {
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_linux.h b/contrib/psutil-0.6.1/psutil/_psutil_linux.h
deleted file mode 100644
index b62906a..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_linux.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * $Id: _psutil_linux.h 1498 2012-07-24 21:41:28Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * LINUX specific module methods for _psutil_linux
- */
-
-#include <Python.h>
-
-static PyObject* linux_ioprio_get(PyObject* self, PyObject* args);
-static PyObject* linux_ioprio_set(PyObject* self, PyObject* args);
-static PyObject* get_disk_partitions(PyObject* self, PyObject* args);
-static PyObject* get_sysinfo(PyObject* self, PyObject* args);
-static PyObject* get_process_cpu_affinity(PyObject* self, PyObject* args);
-static PyObject* set_process_cpu_affinity(PyObject* self, PyObject* args);
-static PyObject* get_system_users(PyObject* self, PyObject* args);
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_mswindows.c b/contrib/psutil-0.6.1/psutil/_psutil_mswindows.c
deleted file mode 100644
index 50c5d24..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_mswindows.c
+++ /dev/null
@@ -1,2904 +0,0 @@
-/*
- * $Id: _psutil_mswindows.c 1525 2012-08-16 16:32:03Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Windows platform-specific module methods for _psutil_mswindows
- */
-
-// Fixes clash between winsock2.h and windows.h
-#define WIN32_LEAN_AND_MEAN
-
-#include <Python.h>
-#include <windows.h>
-#include <Psapi.h>
-#include <time.h>
-#include <lm.h>
-#include <WinIoCtl.h>
-#include <tchar.h>
-#include <tlhelp32.h>
-#include <winsock2.h>
-#include <iphlpapi.h>
-#include <wtsapi32.h>
-
-// Link with Iphlpapi.lib
-#pragma comment(lib, "IPHLPAPI.lib")
-
-#include "_psutil_mswindows.h"
-#include "_psutil_common.h"
-#include "arch/mswindows/security.h"
-#include "arch/mswindows/process_info.h"
-#include "arch/mswindows/process_handles.h"
-#include "arch/mswindows/ntextapi.h"
-
-
-/*
- * Return a Python float representing the system uptime expressed in seconds
- * since the epoch.
- */
-static PyObject*
-get_system_uptime(PyObject* self, PyObject* args)
-{
-    double uptime;
-    time_t pt;
-    FILETIME fileTime;
-    long long ll;
-
-    GetSystemTimeAsFileTime(&fileTime);
-
-    /*
-    HUGE thanks to:
-    http://johnstewien.spaces.live.com/blog/cns!E6885DB5CEBABBC8!831.entry
-
-    This function converts the FILETIME structure to the 32 bit
-    Unix time structure.
-    The time_t is a 32-bit value for the number of seconds since
-    January 1, 1970. A FILETIME is a 64-bit for the number of
-    100-nanosecond periods since January 1, 1601. Convert by
-    subtracting the number of 100-nanosecond period betwee 01-01-1970
-    and 01-01-1601, from time_t the divide by 1e+7 to get to the same
-    base granularity.
-    */
-    ll = (((LONGLONG)(fileTime.dwHighDateTime)) << 32) + fileTime.dwLowDateTime;
-    pt = (time_t)((ll - 116444736000000000ull) / 10000000ull);
-
-    // XXX - By using GetTickCount() time will wrap around to zero if the
-    // system is run continuously for 49.7 days.
-    uptime = GetTickCount() / 1000.00f;
-    return Py_BuildValue("d", (double)pt - uptime);
-}
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-static PyObject*
-pid_exists(PyObject* self, PyObject* args)
-{
-    long pid;
-    int status;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    status = pid_is_running(pid);
-    if (-1 == status) {
-        return NULL; // exception raised in pid_is_running()
-    }
-    return PyBool_FromLong(status);
-}
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    DWORD *proclist = NULL;
-    DWORD numberOfReturnedPIDs;
-    DWORD i;
-    PyObject* pid = NULL;
-    PyObject* retlist = PyList_New(0);
-
-    proclist = get_pids(&numberOfReturnedPIDs);
-    if (NULL == proclist) {
-        goto error;
-    }
-
-    for (i = 0; i < numberOfReturnedPIDs; i++) {
-        pid = Py_BuildValue("I", proclist[i]);
-        if (!pid)
-            goto error;
-        if (PyList_Append(retlist, pid))
-            goto error;
-        Py_DECREF(pid);
-    }
-
-    // free C array allocated for PIDs
-    free(proclist);
-    return retlist;
-
-error:
-    Py_XDECREF(pid);
-    Py_DECREF(retlist);
-    if (proclist != NULL)
-        free(proclist);
-    return NULL;
-}
-
-
-/*
- * Kill a process given its PID.
- */
-static PyObject*
-kill_process(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    long pid;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (pid == 0) {
-        return AccessDenied();
-    }
-
-    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            // see http://code.google.com/p/psutil/issues/detail?id=24
-            NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        return NULL;
-    }
-
-    // kill the process
-    if (! TerminateProcess(hProcess, 0)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hProcess);
-        return NULL;
-    }
-
-    CloseHandle(hProcess);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Wait for process to terminate and return its exit code.
- */
-static PyObject*
-process_wait(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    DWORD ExitCode;
-    DWORD retVal;
-    long pid;
-    long timeout;
-
-    if (! PyArg_ParseTuple(args, "ll", &pid, &timeout)) {
-        return NULL;
-    }
-    if (pid == 0) {
-        return AccessDenied();
-    }
-
-    hProcess = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            // no such process; we do not want to raise NSP but
-            // return None instead.
-            Py_INCREF(Py_None);
-            return Py_None;
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    }
-
-    // wait until the process has terminated
-    Py_BEGIN_ALLOW_THREADS
-    retVal = WaitForSingleObject(hProcess, timeout);
-    Py_END_ALLOW_THREADS
-
-    if (retVal == WAIT_FAILED) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(GetLastError());
-    }
-    if (retVal == WAIT_TIMEOUT) {
-        CloseHandle(hProcess);
-        return Py_BuildValue("l", WAIT_TIMEOUT);
-    }
-
-    // get the exit code; note: subprocess module (erroneously?) uses
-    // what returned by WaitForSingleObject
-    if (GetExitCodeProcess(hProcess, &ExitCode) == 0) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(GetLastError());
-    }
-    CloseHandle(hProcess);
-#if PY_MAJOR_VERSION >= 3
-    return PyLong_FromLong((long) ExitCode);
-#else
-    return PyInt_FromLong((long) ExitCode);
-#endif
-}
-
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_process_cpu_times(PyObject* self, PyObject* args)
-{
-    long        pid;
-    HANDLE      hProcess;
-    FILETIME    ftCreate, ftExit, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    if (! GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser)) {
-        CloseHandle(hProcess);
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            // usually means the process has died so we throw a NoSuchProcess
-            // here
-            return NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    }
-
-    CloseHandle(hProcess);
-
-    /*
-    user and kernel times are represented as a FILETIME structure wich contains
-    a 64-bit value representing the number of 100-nanosecond intervals since
-    January 1, 1601 (UTC).
-    http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx
-
-    To convert it into a float representing the seconds that the process has
-    executed in user/kernel mode I borrowed the code below from Python's
-    Modules/posixmodule.c
-    */
-
-    return Py_BuildValue(
-        "(dd)",
-        (double)(ftUser.dwHighDateTime*429.4967296 + \
-                 ftUser.dwLowDateTime*1e-7),
-        (double)(ftKernel.dwHighDateTime*429.4967296 + \
-                 ftKernel.dwLowDateTime*1e-7)
-        );
-}
-
-
-/*
- * Alternative implementation of the one above but bypasses ACCESS DENIED.
- */
-static PyObject*
-get_process_cpu_times_2(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    double user, kernel;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    user = (double)process->UserTime.HighPart * 429.4967296 + \
-           (double)process->UserTime.LowPart * 1e-7;
-    kernel = (double)process->KernelTime.HighPart * 429.4967296 + \
-             (double)process->KernelTime.LowPart * 1e-7;
-    free(buffer);
-    return Py_BuildValue("(dd)", user, kernel);
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long        pid;
-    long long   unix_time;
-    DWORD       exitCode;
-    HANDLE      hProcess;
-    BOOL        ret;
-    FILETIME    ftCreate, ftExit, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // special case for PIDs 0 and 4, return BOOT_TIME
-    if (0 == pid || 4 == pid) {
-        return get_system_uptime(NULL, NULL);
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    if (! GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser)) {
-        CloseHandle(hProcess);
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            // usually means the process has died so we throw a NoSuchProcess here
-            return NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    }
-
-    // Make sure the process is not gone as OpenProcess alone seems to be
-    // unreliable in doing so (it seems a previous call to p.wait() makes
-    // it unreliable).
-    // This check is important as creation time is used to make sure the
-    // process is still running.
-    ret = GetExitCodeProcess(hProcess, &exitCode);
-    CloseHandle(hProcess);
-    if (ret != 0) {
-        if (exitCode != STILL_ACTIVE) {
-            return NoSuchProcess();
-        }
-    }
-    else {
-        // Ignore access denied as it means the process is still alive.
-        // For all other errors, we want an exception.
-        if (GetLastError() != ERROR_ACCESS_DENIED) {
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    }
-
-    /*
-    Convert the FILETIME structure to a Unix time.
-    It's the best I could find by googling and borrowing code here and there.
-    The time returned has a precision of 1 second.
-    */
-    unix_time = ((LONGLONG)ftCreate.dwHighDateTime) << 32;
-    unix_time += ftCreate.dwLowDateTime - 116444736000000000LL;
-    unix_time /= 10000000;
-    return Py_BuildValue("d", (double)unix_time);
-}
-
-
-/*
- * Alternative implementation of the one above but bypasses ACCESS DENIED.
- */
-static PyObject*
-get_process_create_time_2(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    long long   unix_time;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    // special case for PIDs 0 and 4, return BOOT_TIME
-    if (0 == pid || 4 == pid) {
-        return get_system_uptime(NULL, NULL);
-    }
-    /*
-    Convert the LARGE_INTEGER union to a Unix time.
-    It's the best I could find by googling and borrowing code here and there.
-    The time returned has a precision of 1 second.
-    */
-    unix_time = ((LONGLONG)process->CreateTime.HighPart) << 32;
-    unix_time += process->CreateTime.LowPart - 116444736000000000LL;
-    unix_time /= 10000000;
-    free(buffer);
-    return Py_BuildValue("d", (double)unix_time);
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system.
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-    SYSTEM_INFO system_info;
-    system_info.dwNumberOfProcessors = 0;
-
-    GetSystemInfo(&system_info);
-    if (system_info.dwNumberOfProcessors == 0){
-        // GetSystemInfo failed for some reason; return 1 as default
-        return Py_BuildValue("I", 1);
-    }
-    return Py_BuildValue("I", system_info.dwNumberOfProcessors);
-}
-
-/*
- * Return process name as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* name;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (pid == 0) {
-        return Py_BuildValue("s", "System Idle Process");
-    }
-    else if (pid == 4) {
-        return Py_BuildValue("s", "System");
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    name = get_name(pid);
-    if (name == NULL) {
-        return NULL;  // exception set in get_name()
-    }
-    return name;
-}
-
-
-/*
- * Return process parent pid as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* ppid;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if ((pid == 0) || (pid == 4)) {
-        return Py_BuildValue("l", 0);
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    ppid = get_ppid(pid);
-    if (ppid == NULL) {
-        return NULL;  // exception set in get_ppid()
-    }
-    return ppid;
-}
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args) {
-    long pid;
-    int pid_return;
-    PyObject* arglist;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if ((pid == 0) || (pid == 4)) {
-        return Py_BuildValue("[]");
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        return NoSuchProcess();
-    }
-    if (pid_return == -1) {
-        return NULL;
-    }
-
-    // XXX the assumptio below probably needs to go away
-
-    // May fail any of several ReadProcessMemory calls etc. and not indicate
-    // a real problem so we ignore any errors and just live without commandline
-    arglist = get_arg_list(pid);
-    if ( NULL == arglist ) {
-        // carry on anyway, clear any exceptions too
-        PyErr_Clear();
-        return Py_BuildValue("[]");
-    }
-
-    return arglist;
-}
-
-
-/*
- * Return process executable path.
- */
-static PyObject*
-get_process_exe(PyObject* self, PyObject* args) {
-    long pid;
-    HANDLE hProcess;
-    wchar_t exe[MAX_PATH];
-    DWORD nSize = MAX_PATH;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid_waccess(pid, PROCESS_QUERY_INFORMATION);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-
-    if (GetProcessImageFileName(hProcess, &exe, nSize) == 0) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    CloseHandle(hProcess);
-    return Py_BuildValue("s", exe);
-}
-
-
-/*
- * Return process memory information as a Python tuple.
- */
-static PyObject*
-get_process_memory_info(PyObject* self, PyObject* args)
-{
-    HANDLE hProcess;
-    DWORD pid;
-#if (_WIN32_WINNT >= 0x0501)  // Windows XP with SP2
-    PROCESS_MEMORY_COUNTERS_EX cnt;
-#else
-    PROCESS_MEMORY_COUNTERS cnt;
-#endif
-    SIZE_T private = 0;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-
-    if (! GetProcessMemoryInfo(hProcess, &cnt, sizeof(cnt)) ) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-#if (_WIN32_WINNT >= 0x0501)
-    private = cnt.PrivateUsage;
-#endif
-
-    CloseHandle(hProcess);
-
-// py 2.4
-#if (PY_MAJOR_VERSION == 2) && (PY_MINOR_VERSION <= 4)
-    return Py_BuildValue("(kIIIIIIIII)",
-        cnt.PageFaultCount,
-        (unsigned int)cnt.PeakWorkingSetSize,
-        (unsigned int)cnt.WorkingSetSize,
-        (unsigned int)cnt.QuotaPeakPagedPoolUsage,
-        (unsigned int)cnt.QuotaPagedPoolUsage,
-        (unsigned int)cnt.QuotaPeakNonPagedPoolUsage,
-        (unsigned int)cnt.QuotaNonPagedPoolUsage,
-        (unsigned int)cnt.PagefileUsage,
-        (unsigned int)cnt.PeakPagefileUsage,
-        (unsigned int)private);
-#else
-// py >= 2.5
-    return Py_BuildValue("(knnnnnnnnn)",
-        cnt.PageFaultCount,
-        cnt.PeakWorkingSetSize,
-        cnt.WorkingSetSize,
-        cnt.QuotaPeakPagedPoolUsage,
-        cnt.QuotaPagedPoolUsage,
-        cnt.QuotaPeakNonPagedPoolUsage,
-        cnt.QuotaNonPagedPoolUsage,
-        cnt.PagefileUsage,
-        cnt.PeakPagefileUsage,
-        private);
-#endif
-}
-
-
-/*
- * Alternative implementation of the one above but bypasses ACCESS DENIED.
- */
-static PyObject*
-get_process_memory_info_2(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    ULONG m0;
-    SIZE_T m1, m2, m3, m4, m5, m6, m7, m8, m9;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    m0 = process->PageFaultCount;
-    m1 = process->PeakWorkingSetSize;
-    m2 = process->WorkingSetSize;
-    m3 = process->QuotaPeakPagedPoolUsage;
-    m4 = process->QuotaPagedPoolUsage;
-    m5 = process->QuotaPeakNonPagedPoolUsage;
-    m6 = process->QuotaNonPagedPoolUsage;
-    m7 = process->PagefileUsage;
-    m8 = process->PeakPagefileUsage;
-#if (_WIN32_WINNT >= 0x0501)
-    m9 = process->PrivatePageCount;  // private me
-#else
-    m9 = 0;
-#endif
-    free(buffer);
-
-// py 2.4
-#if (PY_MAJOR_VERSION == 2) && (PY_MINOR_VERSION <= 4)
-    return Py_BuildValue("(kIIIIIIIII)",
-        (unsigned int)m0, (unsigned int)m1, (unsigned int)m2, (unsigned int)m3,
-        (unsigned int)m4, (unsigned int)m5, (unsigned int)m6, (unsigned int)m7,
-        (unsigned int)m8, (unsigned int)m9);
-#else
-    return Py_BuildValue("(knnnnnnnnn)",
-        m0, m1, m2, m3, m4, m5, m6, m7, m8, m9);
-#endif
-}
-
-
-/*
- * Return a Python integer indicating the total amount of physical memory
- * in bytes.
- */
-static PyObject*
-get_virtual_mem(PyObject* self, PyObject* args)
-{
-    MEMORYSTATUSEX memInfo;
-    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
-
-    if (! GlobalMemoryStatusEx(&memInfo) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return Py_BuildValue("(LLLLLL)",
-        memInfo.ullTotalPhys,      // total
-        memInfo.ullAvailPhys,      // avail
-        memInfo.ullTotalPageFile,  // total page file
-        memInfo.ullAvailPageFile,  // avail page file
-        memInfo.ullTotalVirtual,   // total virtual
-        memInfo.ullAvailVirtual    // avail virtual
-    );
-}
-
-
-#define LO_T ((float)1e-7)
-#define HI_T (LO_T*4294967296.0)
-
-
-/*
- * Return a Python list of tuples representing user, kernel and idle
- * CPU times for every CPU on the system.
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    float idle, kernel, user;
-    typedef DWORD (_stdcall *NTQSI_PROC) (int, PVOID, ULONG, PULONG);
-    NTQSI_PROC NtQuerySystemInformation;
-    HINSTANCE hNtDll;
-    SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *sppi = NULL;
-    SYSTEM_INFO si;
-    UINT i;
-    PyObject *arg = NULL;
-    PyObject *retlist = PyList_New(0);
-
-    // dynamic linking is mandatory to use NtQuerySystemInformation
-    hNtDll = LoadLibrary(TEXT("ntdll.dll"));
-    if (hNtDll != NULL) {
-        // gets NtQuerySystemInformation address
-        NtQuerySystemInformation = (NTQSI_PROC)GetProcAddress(
-                                    hNtDll, "NtQuerySystemInformation");
-
-        if (NtQuerySystemInformation != NULL)
-        {
-            // retrives number of processors
-            GetSystemInfo(&si);
-
-            // allocates an array of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
-            // structures, one per processor
-            sppi = (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *) \
-                    malloc(si.dwNumberOfProcessors * \
-                         sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
-            if (sppi != NULL)
-            {
-                // gets cpu time informations
-                if (0 == NtQuerySystemInformation(
-                    SystemProcessorPerformanceInformation,
-                    sppi,
-                    si.dwNumberOfProcessors * sizeof
-                                (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION),
-                    NULL)
-                )
-                {
-                    // computes system global times summing each processor value
-                    idle = user = kernel = 0;
-                    for (i=0; i<si.dwNumberOfProcessors; i++) {
-                        arg = NULL;
-                        user = (float)((HI_T * sppi[i].UserTime.HighPart) + \
-                                       (LO_T * sppi[i].UserTime.LowPart));
-                        idle = (float)((HI_T * sppi[i].IdleTime.HighPart) + \
-                                       (LO_T * sppi[i].IdleTime.LowPart));
-                        kernel = (float)((HI_T * sppi[i].KernelTime.HighPart) + \
-                                         (LO_T * sppi[i].KernelTime.LowPart));
-                        // kernel time includes idle time on windows
-                        // we return only busy kernel time subtracting
-                        // idle time from kernel time
-                        arg = Py_BuildValue("(ddd)", user,
-                                                     kernel - idle,
-                                                     idle);
-                        if (!arg)
-                            goto error;
-                        if (PyList_Append(retlist, arg))
-                            goto error;
-                        Py_DECREF(arg);
-                    }
-                    free(sppi);
-                    FreeLibrary(hNtDll);
-                    return retlist;
-
-                }  // END NtQuerySystemInformation
-            }  // END malloc SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
-        }  // END GetProcAddress
-    }  // END LoadLibrary
-    goto error;
-
-error:
-    Py_XDECREF(arg);
-    Py_DECREF(retlist);
-    if (sppi) {
-        free(sppi);
-    }
-    if (hNtDll) {
-        FreeLibrary(hNtDll);
-    }
-    PyErr_SetFromWindowsErr(0);
-    return NULL;
-}
-
-
-/*
- * Return process current working directory as a Python string.
- */
-
-static PyObject*
-get_process_cwd(PyObject* self, PyObject* args)
-{
-    long pid;
-    HANDLE processHandle = NULL;
-    PVOID pebAddress;
-    PVOID rtlUserProcParamsAddress;
-    UNICODE_STRING currentDirectory;
-    WCHAR *currentDirectoryContent = NULL;
-    PyObject *returnPyObj = NULL;
-    PyObject *cwd_from_wchar = NULL;
-    PyObject *cwd = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid(pid);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    pebAddress = GetPebAddress(processHandle);
-
-    // get the address of ProcessParameters
-#ifdef _WIN64
-    if (!ReadProcessMemory(processHandle, (PCHAR)pebAddress + 32,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#else
-    if (!ReadProcessMemory(processHandle, (PCHAR)pebAddress + 0x10,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#endif
-    {
-        CloseHandle(processHandle);
-
-        if (GetLastError() == ERROR_PARTIAL_COPY) {
-            // this occurs quite often with system processes
-            return AccessDenied();
-        }
-        else {
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    // Read the currentDirectory UNICODE_STRING structure.
-    // 0x24 refers to "CurrentDirectoryPath" of RTL_USER_PROCESS_PARAMETERS
-    // structure, see:
-    // http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/
-#ifdef _WIN64
-    if (!ReadProcessMemory(processHandle, (PCHAR)rtlUserProcParamsAddress + 56,
-        &currentDirectory, sizeof(currentDirectory), NULL))
-#else
-    if (!ReadProcessMemory(processHandle, (PCHAR)rtlUserProcParamsAddress + 0x24,
-        &currentDirectory, sizeof(currentDirectory), NULL))
-#endif
-    {
-        CloseHandle(processHandle);
-        if (GetLastError() == ERROR_PARTIAL_COPY) {
-            // this occurs quite often with system processes
-            return AccessDenied();
-        }
-        else {
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    // allocate memory to hold cwd
-    currentDirectoryContent = (WCHAR *)malloc(currentDirectory.Length+1);
-
-    // read cwd
-    if (!ReadProcessMemory(processHandle, currentDirectory.Buffer,
-        currentDirectoryContent, currentDirectory.Length, NULL))
-    {
-        if (GetLastError() == ERROR_PARTIAL_COPY) {
-            // this occurs quite often with system processes
-            AccessDenied();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        goto error;
-    }
-
-    // null-terminate the string to prevent wcslen from returning
-    // incorrect length the length specifier is in characters, but
-    // currentDirectory.Length is in bytes
-    currentDirectoryContent[(currentDirectory.Length/sizeof(WCHAR))] = '\0';
-
-    // convert wchar array to a Python unicode string, and then to UTF8
-    cwd_from_wchar = PyUnicode_FromWideChar(currentDirectoryContent,
-                                            wcslen(currentDirectoryContent));
-    if (cwd_from_wchar == NULL)
-        goto error;
-
-    #if PY_MAJOR_VERSION >= 3
-        cwd = PyUnicode_FromObject(cwd_from_wchar);
-    #else
-        cwd = PyUnicode_AsUTF8String(cwd_from_wchar);
-    #endif
-    if (cwd == NULL)
-        goto error;
-
-    // decrement the reference count on our temp unicode str to avoid
-    // mem leak
-    returnPyObj = Py_BuildValue("N", cwd);
-    if (!returnPyObj)
-        goto error;
-
-    Py_DECREF(cwd_from_wchar);
-
-    CloseHandle(processHandle);
-    free(currentDirectoryContent);
-    return returnPyObj;
-
-error:
-    Py_XDECREF(cwd_from_wchar);
-    Py_XDECREF(cwd);
-    Py_XDECREF(returnPyObj);
-    if (currentDirectoryContent != NULL)
-        free(currentDirectoryContent);
-    if (processHandle != NULL)
-        CloseHandle(processHandle);
-    return NULL;
-}
-
-
-/*
- * Resume or suspends a process
- */
-int
-suspend_resume_process(DWORD pid, int suspend)
-{
-    // a huge thanks to http://www.codeproject.com/KB/threads/pausep.aspx
-    HANDLE hThreadSnap = NULL;
-    THREADENTRY32  te32 = {0};
-
-    if (pid == 0) {
-        AccessDenied();
-        return FALSE;
-    }
-
-    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
-    if (hThreadSnap == INVALID_HANDLE_VALUE) {
-        PyErr_SetFromWindowsErr(0);
-        return FALSE;
-    }
-
-    // Fill in the size of the structure before using it
-    te32.dwSize = sizeof(THREADENTRY32);
-
-    if (! Thread32First(hThreadSnap, &te32)) {
-        PyErr_SetFromWindowsErr(0);
-        CloseHandle(hThreadSnap);
-        return FALSE;
-    }
-
-    // Walk the thread snapshot to find all threads of the process.
-    // If the thread belongs to the process, add its information
-    // to the display list.
-    do
-    {
-        if (te32.th32OwnerProcessID == pid)
-        {
-            HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE,
-                                        te32.th32ThreadID);
-            if (hThread == NULL) {
-                PyErr_SetFromWindowsErr(0);
-                CloseHandle(hThread);
-                CloseHandle(hThreadSnap);
-                return FALSE;
-            }
-            if (suspend == 1)
-            {
-                if (SuspendThread(hThread) == (DWORD)-1) {
-                    PyErr_SetFromWindowsErr(0);
-                    CloseHandle(hThread);
-                    CloseHandle(hThreadSnap);
-                    return FALSE;
-                }
-            }
-            else
-            {
-                if (ResumeThread(hThread) == (DWORD)-1) {
-                    PyErr_SetFromWindowsErr(0);
-                    CloseHandle(hThread);
-                    CloseHandle(hThreadSnap);
-                    return FALSE;
-                }
-            }
-            CloseHandle(hThread);
-        }
-    } while (Thread32Next(hThreadSnap, &te32));
-
-    CloseHandle(hThreadSnap);
-    return TRUE;
-}
-
-
-static PyObject*
-suspend_process(PyObject* self, PyObject* args)
-{
-    long pid;
-    int suspend = 1;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (! suspend_resume_process(pid, suspend)) {
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-static PyObject*
-resume_process(PyObject* self, PyObject* args)
-{
-    long pid;
-    int suspend = 0;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (! suspend_resume_process(pid, suspend)) {
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    int num;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    num = (int)process->NumberOfThreads;
-    free(buffer);
-    return Py_BuildValue("i", num);
-}
-
-
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-    HANDLE hThreadSnap = NULL;
-    HANDLE hThread;
-    THREADENTRY32 te32 = {0};
-    long pid;
-    int pid_return;
-    int rc;
-    FILETIME ftDummy, ftKernel, ftUser;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-    if (pid == 0) {
-        // raise AD instead of returning 0 as procexp is able to
-        // retrieve useful information somehow
-        AccessDenied();
-        goto error;
-    }
-
-    pid_return = pid_is_running(pid);
-    if (pid_return == 0) {
-        NoSuchProcess();
-        goto error;
-    }
-    if (pid_return == -1) {
-        goto error;
-    }
-
-    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
-    if (hThreadSnap == INVALID_HANDLE_VALUE) {
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    // Fill in the size of the structure before using it
-    te32.dwSize = sizeof(THREADENTRY32);
-
-    if (! Thread32First(hThreadSnap, &te32)) {
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    // Walk the thread snapshot to find all threads of the process.
-    // If the thread belongs to the process, increase the counter.
-    do
-    {
-        if (te32.th32OwnerProcessID == pid)
-        {
-            pyTuple = NULL;
-            hThread = NULL;
-            hThread = OpenThread(THREAD_QUERY_INFORMATION,
-                                  FALSE, te32.th32ThreadID);
-            if (hThread == NULL) {
-                // thread has disappeared on us
-                continue;
-            }
-
-            rc = GetThreadTimes(hThread, &ftDummy, &ftDummy, &ftKernel, &ftUser);
-            if (rc == 0) {
-                PyErr_SetFromWindowsErr(0);
-                goto error;
-            }
-
-            /*
-            user and kernel times are represented as a FILETIME structure
-            wich contains a 64-bit value representing the number of
-            100-nanosecond intervals since January 1, 1601 (UTC).
-            http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx
-
-            To convert it into a float representing the seconds that the
-            process has executed in user/kernel mode I borrowed the code
-            below from Python's Modules/posixmodule.c
-            */
-            pyTuple = Py_BuildValue("kdd",
-                            te32.th32ThreadID,
-                            (double)(ftUser.dwHighDateTime*429.4967296 + \
-                                     ftUser.dwLowDateTime*1e-7),
-                            (double)(ftKernel.dwHighDateTime*429.4967296 + \
-                                     ftKernel.dwLowDateTime*1e-7));
-            if (!pyTuple)
-                goto error;
-            if (PyList_Append(retList, pyTuple))
-                goto error;
-            Py_DECREF(pyTuple);
-
-            CloseHandle(hThread);
-        }
-    } while (Thread32Next(hThreadSnap, &te32));
-
-    CloseHandle(hThreadSnap);
-    return retList;
-
-error:
-    Py_XDECREF(pyTuple);
-    Py_DECREF(retList);
-    if (hThread != NULL)
-        CloseHandle(hThread);
-    if (hThreadSnap != NULL) {
-        CloseHandle(hThreadSnap);
-    }
-    return NULL;
-}
-
-
-
-static PyObject*
-get_process_open_files(PyObject* self, PyObject* args)
-{
-    long       pid;
-    HANDLE     processHandle;
-    DWORD      access = PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION;
-    PyObject*  filesList;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid_waccess(pid, access);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    filesList = get_open_files(pid, processHandle);
-    CloseHandle(processHandle);
-    if (filesList == NULL) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-    return filesList;
-}
-
-
-/*
- Accept a filename's drive in native  format like "\Device\HarddiskVolume1\"
- and return the corresponding drive letter (e.g. "C:\\").
- If no match is found return an empty string.
-*/
-static PyObject*
-win32_QueryDosDevice(PyObject* self, PyObject* args)
-{
-    LPCTSTR   lpDevicePath;
-    TCHAR d = TEXT('A');
-    TCHAR     szBuff[5];
-
-    if (!PyArg_ParseTuple(args, "s", &lpDevicePath)) {
-        return NULL;
-    }
-
-    while(d <= TEXT('Z'))
-    {
-        TCHAR szDeviceName[3] = {d,TEXT(':'),TEXT('\0')};
-        TCHAR szTarget[512] = {0};
-        if (QueryDosDevice(szDeviceName, szTarget, 511) != 0){
-            //_tprintf (TEXT("%c:\\   =>   %s\n"), d, szTarget);
-            if(_tcscmp(lpDevicePath, szTarget) == 0) {
-                _stprintf(szBuff, TEXT("%c:"), d);
-                return Py_BuildValue("s", szBuff);
-            }
-        }
-        d++;
-    }
-    return Py_BuildValue("s", "");
-}
-
-/*
- * Return process username as a "DOMAIN//USERNAME" string.
- */
-static PyObject*
-get_process_username(PyObject* self, PyObject* args)
-{
-    long pid;
-    HANDLE processHandle;
-    HANDLE tokenHandle;
-    PTOKEN_USER user;
-    ULONG bufferSize;
-    PTSTR name;
-    ULONG nameSize;
-    PTSTR domainName;
-    ULONG domainNameSize;
-    SID_NAME_USE nameUse;
-    PTSTR fullName;
-    PyObject* returnObject;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    processHandle = handle_from_pid_waccess(pid, PROCESS_QUERY_INFORMATION);
-    if (processHandle == NULL) {
-        return NULL;
-    }
-
-    if (!OpenProcessToken(processHandle, TOKEN_QUERY, &tokenHandle)) {
-        CloseHandle(processHandle);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    CloseHandle(processHandle);
-
-    /* Get the user SID. */
-
-    bufferSize = 0x100;
-    user = malloc(bufferSize);
-
-    if (!GetTokenInformation(tokenHandle,
-                             TokenUser,
-                             user,
-                             bufferSize,
-                             &bufferSize))
-    {
-        free(user);
-        user = malloc(bufferSize);
-
-        if (!GetTokenInformation(tokenHandle,
-                                 TokenUser,
-                                 user,
-                                 bufferSize,
-                                 &bufferSize))
-        {
-            free(user);
-            CloseHandle(tokenHandle);
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    CloseHandle(tokenHandle);
-
-    /* Resolve the SID to a name. */
-
-    nameSize = 0x100;
-    domainNameSize = 0x100;
-
-    name = malloc(nameSize * sizeof(TCHAR));
-    domainName = malloc(domainNameSize * sizeof(TCHAR));
-
-    if (!LookupAccountSid(NULL, user->User.Sid, name, &nameSize, domainName,
-                          &domainNameSize, &nameUse))
-    {
-        free(name);
-        free(domainName);
-        name = malloc(nameSize * sizeof(TCHAR));
-        domainName = malloc(domainNameSize * sizeof(TCHAR));
-
-        if (!LookupAccountSid(NULL, user->User.Sid, name, &nameSize, domainName,
-                              &domainNameSize, &nameUse))
-        {
-            free(name);
-            free(domainName);
-            free(user);
-
-            return PyErr_SetFromWindowsErr(0);
-        }
-    }
-
-    nameSize = _tcslen(name);
-    domainNameSize = _tcslen(domainName);
-
-    /* Build the full username string. */
-    fullName = malloc((domainNameSize + 1 + nameSize + 1) * sizeof(TCHAR));
-    memcpy(fullName, domainName, domainNameSize);
-    fullName[domainNameSize] = '\\';
-    memcpy(&fullName[domainNameSize + 1], name, nameSize);
-    fullName[domainNameSize + 1 + nameSize] = '\0';
-
-    returnObject = Py_BuildValue("s", fullName);
-
-    free(fullName);
-    free(name);
-    free(domainName);
-    free(user);
-
-    return returnObject;
-}
-
-#define BYTESWAP_USHORT(x) ((((USHORT)(x) << 8) | ((USHORT)(x) >> 8)) & 0xffff)
-
-#ifndef AF_INET6
-#define AF_INET6 23
-#endif
-
-static char *state_to_string(ULONG state)
-{
-    switch (state)
-    {
-    case MIB_TCP_STATE_CLOSED:
-        return "CLOSE";
-    case MIB_TCP_STATE_LISTEN:
-        return "LISTEN";
-    case MIB_TCP_STATE_SYN_SENT:
-        return "SYN_SENT";
-    case MIB_TCP_STATE_SYN_RCVD:
-        return "SYN_RECV";
-    case MIB_TCP_STATE_ESTAB:
-        return "ESTABLISHED";
-    case MIB_TCP_STATE_FIN_WAIT1:
-        return "FIN_WAIT1";
-    case MIB_TCP_STATE_FIN_WAIT2:
-        return "FIN_WAIT2";
-    case MIB_TCP_STATE_CLOSE_WAIT:
-        return "CLOSE_WAIT";
-    case MIB_TCP_STATE_CLOSING:
-        return "CLOSING";
-    case MIB_TCP_STATE_LAST_ACK:
-        return "LAST_ACK";
-    case MIB_TCP_STATE_TIME_WAIT:
-        return "TIME_WAIT";
-    case MIB_TCP_STATE_DELETE_TCB:
-        return "DELETE_TCB";
-    default:
-        return "";
-    }
-}
-
-/* mingw support */
-#ifndef _IPRTRMIB_H
-typedef struct _MIB_TCP6ROW_OWNER_PID
-{
-    UCHAR           ucLocalAddr[16];
-    DWORD           dwLocalScopeId;
-    DWORD           dwLocalPort;
-    UCHAR           ucRemoteAddr[16];
-    DWORD           dwRemoteScopeId;
-    DWORD           dwRemotePort;
-    DWORD           dwState;
-    DWORD           dwOwningPid;
-} MIB_TCP6ROW_OWNER_PID, *PMIB_TCP6ROW_OWNER_PID;
-
-typedef struct _MIB_TCP6TABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_TCP6ROW_OWNER_PID   table[ANY_SIZE];
-} MIB_TCP6TABLE_OWNER_PID, *PMIB_TCP6TABLE_OWNER_PID;
-#endif
-
-#ifndef __IPHLPAPI_H__
-typedef struct in6_addr {
-    union {
-        UCHAR       Byte[16];
-        USHORT      Word[8];
-    } u;
-} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;
-
-
-typedef enum _UDP_TABLE_CLASS {
-    UDP_TABLE_BASIC,
-    UDP_TABLE_OWNER_PID,
-    UDP_TABLE_OWNER_MODULE
-} UDP_TABLE_CLASS, *PUDP_TABLE_CLASS;
-
-
-typedef struct _MIB_UDPROW_OWNER_PID {
-    DWORD dwLocalAddr;
-    DWORD dwLocalPort;
-    DWORD dwOwningPid;
-} MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID;
-
-typedef struct _MIB_UDPTABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_UDPROW_OWNER_PID    table[ANY_SIZE];
-} MIB_UDPTABLE_OWNER_PID, *PMIB_UDPTABLE_OWNER_PID;
-#endif
-/* end of mingw support */
-
-typedef struct _MIB_UDP6ROW_OWNER_PID {
-    UCHAR           ucLocalAddr[16];
-    DWORD           dwLocalScopeId;
-    DWORD           dwLocalPort;
-    DWORD           dwOwningPid;
-} MIB_UDP6ROW_OWNER_PID, *PMIB_UDP6ROW_OWNER_PID;
-
-typedef struct _MIB_UDP6TABLE_OWNER_PID
-{
-    DWORD                   dwNumEntries;
-    MIB_UDP6ROW_OWNER_PID   table[ANY_SIZE];
-} MIB_UDP6TABLE_OWNER_PID, *PMIB_UDP6TABLE_OWNER_PID;
-
-
-#define ConnDecrefPyObjs() Py_DECREF(_AF_INET); \
-                           Py_DECREF(_AF_INET6);\
-                           Py_DECREF(_SOCK_STREAM);\
-                           Py_DECREF(_SOCK_DGRAM);
-
-/*
- * Return a list of network connections opened by a process
- */
-static PyObject*
-get_process_connections(PyObject* self, PyObject* args)
-{
-    static long null_address[4] = { 0, 0, 0, 0 };
-
-    unsigned long pid;
-    PyObject* connectionsList;
-    PyObject* connectionTuple = NULL;
-    PyObject *af_filter = NULL;
-    PyObject *type_filter = NULL;
-
-    PyObject *_AF_INET = PyLong_FromLong((long)AF_INET);
-    PyObject *_AF_INET6 = PyLong_FromLong((long)AF_INET6);
-    PyObject *_SOCK_STREAM = PyLong_FromLong((long)SOCK_STREAM);
-    PyObject *_SOCK_DGRAM = PyLong_FromLong((long)SOCK_DGRAM);
-
-    typedef PSTR (NTAPI *_RtlIpv4AddressToStringA)(struct in_addr *,
-                                                   PSTR /* __out_ecount(16) */);
-    _RtlIpv4AddressToStringA rtlIpv4AddressToStringA;
-    typedef PSTR (NTAPI *_RtlIpv6AddressToStringA)(struct in6_addr *,
-                                                   PSTR /* __out_ecount(65) */);
-    _RtlIpv6AddressToStringA rtlIpv6AddressToStringA;
-    typedef DWORD (WINAPI *_GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG,
-                                                 TCP_TABLE_CLASS, ULONG);
-    _GetExtendedTcpTable getExtendedTcpTable;
-    typedef DWORD (WINAPI *_GetExtendedUdpTable)(PVOID, PDWORD, BOOL, ULONG,
-                                                 UDP_TABLE_CLASS, ULONG);
-    _GetExtendedUdpTable getExtendedUdpTable;
-    PVOID table = NULL;
-    DWORD tableSize;
-    PMIB_TCPTABLE_OWNER_PID tcp4Table;
-    PMIB_UDPTABLE_OWNER_PID udp4Table;
-    PMIB_TCP6TABLE_OWNER_PID tcp6Table;
-    PMIB_UDP6TABLE_OWNER_PID udp6Table;
-    ULONG i;
-    CHAR addressBufferLocal[65];
-    PyObject* addressTupleLocal = NULL;
-    CHAR addressBufferRemote[65];
-    PyObject* addressTupleRemote = NULL;
-
-    if (! PyArg_ParseTuple(args, "lOO", &pid, &af_filter, &type_filter)) {
-        ConnDecrefPyObjs();
-        return NULL;
-    }
-
-    if (!PySequence_Check(af_filter) || !PySequence_Check(type_filter)) {
-        ConnDecrefPyObjs();
-        PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence");
-        return NULL;
-    }
-
-    if (pid_is_running(pid) == 0) {
-        ConnDecrefPyObjs();
-        return NoSuchProcess();
-    }
-
-    /* Import some functions. */
-    {
-        HMODULE ntdll;
-        HMODULE iphlpapi;
-
-        ntdll = LoadLibrary(TEXT("ntdll.dll"));
-        rtlIpv4AddressToStringA = (_RtlIpv4AddressToStringA)GetProcAddress(ntdll,
-                                                     "RtlIpv4AddressToStringA");
-        rtlIpv6AddressToStringA = (_RtlIpv6AddressToStringA)GetProcAddress(ntdll,
-                                                     "RtlIpv6AddressToStringA");
-        /* TODO: Check these two function pointers */
-
-        iphlpapi = LoadLibrary(TEXT("iphlpapi.dll"));
-        getExtendedTcpTable = (_GetExtendedTcpTable)GetProcAddress(iphlpapi,
-                                                        "GetExtendedTcpTable");
-        getExtendedUdpTable = (_GetExtendedUdpTable)GetProcAddress(iphlpapi,
-                                                        "GetExtendedUdpTable");
-        FreeLibrary(ntdll);
-        FreeLibrary(iphlpapi);
-    }
-
-    if ((getExtendedTcpTable == NULL) || (getExtendedUdpTable == NULL)) {
-        PyErr_SetString(PyExc_NotImplementedError,
-                        "feature not supported on this Windows version");
-        ConnDecrefPyObjs();
-        return NULL;
-    }
-
-    connectionsList = PyList_New(0);
-
-    /* TCP IPv4 */
-
-    if ((PySequence_Contains(af_filter, _AF_INET) == 1) &&
-        (PySequence_Contains(type_filter, _SOCK_STREAM) == 1))
-    {
-        table = NULL;
-        connectionTuple = NULL;
-        addressTupleLocal = NULL;
-        addressTupleRemote = NULL;
-        tableSize = 0;
-        getExtendedTcpTable(NULL, &tableSize, FALSE, AF_INET,
-                            TCP_TABLE_OWNER_PID_ALL, 0);
-
-        table = malloc(tableSize);
-
-        if (getExtendedTcpTable(table, &tableSize, FALSE, AF_INET,
-                                TCP_TABLE_OWNER_PID_ALL, 0) == 0)
-        {
-            tcp4Table = table;
-
-            for (i = 0; i < tcp4Table->dwNumEntries; i++)
-            {
-                if (tcp4Table->table[i].dwOwningPid != pid) {
-                    continue;
-                }
-
-                if (tcp4Table->table[i].dwLocalAddr != 0 ||
-                    tcp4Table->table[i].dwLocalPort != 0)
-                {
-                    struct in_addr addr;
-
-                    addr.S_un.S_addr = tcp4Table->table[i].dwLocalAddr;
-                    rtlIpv4AddressToStringA(&addr, addressBufferLocal);
-                    addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                               BYTESWAP_USHORT(tcp4Table->table[i].dwLocalPort));
-                }
-                else
-                {
-                    addressTupleLocal = PyTuple_New(0);
-                }
-
-                if (addressTupleLocal == NULL)
-                    goto error;
-
-                // On Windows <= XP, remote addr is filled even if socket
-                // is in LISTEN mode in which case we just ignore it.
-                if ((tcp4Table->table[i].dwRemoteAddr != 0 ||
-                     tcp4Table->table[i].dwRemotePort != 0) &&
-                    (tcp4Table->table[i].dwState != MIB_TCP_STATE_LISTEN))
-                {
-                    struct in_addr addr;
-
-                    addr.S_un.S_addr = tcp4Table->table[i].dwRemoteAddr;
-                    rtlIpv4AddressToStringA(&addr, addressBufferRemote);
-                    addressTupleRemote = Py_BuildValue("(si)", addressBufferRemote,
-                            BYTESWAP_USHORT(tcp4Table->table[i].dwRemotePort));
-                }
-                else
-                {
-                    addressTupleRemote = PyTuple_New(0);
-                }
-
-                if (addressTupleRemote == NULL)
-                    goto error;
-
-                connectionTuple = Py_BuildValue("(iiiNNs)",
-                    -1,
-                    AF_INET,
-                    SOCK_STREAM,
-                    addressTupleLocal,
-                    addressTupleRemote,
-                    state_to_string(tcp4Table->table[i].dwState)
-                    );
-                if (!connectionTuple)
-                    goto error;
-                if (PyList_Append(connectionsList, connectionTuple))
-                    goto error;
-                Py_DECREF(connectionTuple);
-            }
-        }
-
-        free(table);
-    }
-
-    /* TCP IPv6 */
-
-    if ((PySequence_Contains(af_filter, _AF_INET6) == 1) &&
-        (PySequence_Contains(type_filter, _SOCK_STREAM) == 1))
-    {
-        table = NULL;
-        connectionTuple = NULL;
-        addressTupleLocal = NULL;
-        addressTupleRemote = NULL;
-        tableSize = 0;
-        getExtendedTcpTable(NULL, &tableSize, FALSE, AF_INET6,
-                            TCP_TABLE_OWNER_PID_ALL, 0);
-
-        table = malloc(tableSize);
-
-        if (getExtendedTcpTable(table, &tableSize, FALSE, AF_INET6,
-                                 TCP_TABLE_OWNER_PID_ALL, 0) == 0)
-        {
-            tcp6Table = table;
-
-            for (i = 0; i < tcp6Table->dwNumEntries; i++)
-            {
-                if (tcp6Table->table[i].dwOwningPid != pid) {
-                    continue;
-                }
-
-                if (memcmp(tcp6Table->table[i].ucLocalAddr, null_address, 16) != 0 ||
-                tcp6Table->table[i].dwLocalPort != 0)
-                {
-                    struct in6_addr addr;
-
-                    memcpy(&addr, tcp6Table->table[i].ucLocalAddr, 16);
-                    rtlIpv6AddressToStringA(&addr, addressBufferLocal);
-                    addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                             BYTESWAP_USHORT(tcp6Table->table[i].dwLocalPort));
-                }
-                else
-                {
-                    addressTupleLocal = PyTuple_New(0);
-                }
-
-                if (addressTupleLocal == NULL)
-                    goto error;
-
-                // On Windows <= XP, remote addr is filled even if socket
-                // is in LISTEN mode in which case we just ignore it.
-                if ((memcmp(tcp6Table->table[i].ucRemoteAddr, null_address, 16) != 0 ||
-                    tcp6Table->table[i].dwRemotePort != 0) &&
-                   (tcp6Table->table[i].dwState != MIB_TCP_STATE_LISTEN))
-                {
-                    struct in6_addr addr;
-
-                    memcpy(&addr, tcp6Table->table[i].ucRemoteAddr, 16);
-                    rtlIpv6AddressToStringA(&addr, addressBufferRemote);
-                    addressTupleRemote = Py_BuildValue("(si)", addressBufferRemote,
-                            BYTESWAP_USHORT(tcp6Table->table[i].dwRemotePort));
-                }
-                else
-                {
-                    addressTupleRemote = PyTuple_New(0);
-                }
-
-                if (addressTupleRemote == NULL)
-                    goto error;
-
-                connectionTuple = Py_BuildValue("(iiiNNs)",
-                    -1,
-                    AF_INET6,
-                    SOCK_STREAM,
-                    addressTupleLocal,
-                    addressTupleRemote,
-                    state_to_string(tcp6Table->table[i].dwState)
-                    );
-                if (!connectionTuple)
-                    goto error;
-                if (PyList_Append(connectionsList, connectionTuple))
-                    goto error;
-                Py_DECREF(connectionTuple);
-            }
-        }
-
-        free(table);
-    }
-
-    /* UDP IPv4 */
-
-    if ((PySequence_Contains(af_filter, _AF_INET) == 1) &&
-        (PySequence_Contains(type_filter, _SOCK_DGRAM) == 1))
-    {
-        table = NULL;
-        connectionTuple = NULL;
-        addressTupleLocal = NULL;
-        addressTupleRemote = NULL;
-        tableSize = 0;
-        getExtendedUdpTable(NULL, &tableSize, FALSE, AF_INET,
-                            UDP_TABLE_OWNER_PID, 0);
-
-        table = malloc(tableSize);
-
-        if (getExtendedUdpTable(table, &tableSize, FALSE, AF_INET,
-                                 UDP_TABLE_OWNER_PID, 0) == 0)
-        {
-            udp4Table = table;
-
-            for (i = 0; i < udp4Table->dwNumEntries; i++)
-            {
-                if (udp4Table->table[i].dwOwningPid != pid) {
-                    continue;
-                }
-
-                if (udp4Table->table[i].dwLocalAddr != 0 ||
-                    udp4Table->table[i].dwLocalPort != 0)
-                {
-                    struct in_addr addr;
-
-                    addr.S_un.S_addr = udp4Table->table[i].dwLocalAddr;
-                    rtlIpv4AddressToStringA(&addr, addressBufferLocal);
-                    addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                                BYTESWAP_USHORT(udp4Table->table[i].dwLocalPort));
-                }
-                else
-                {
-                    addressTupleLocal = PyTuple_New(0);
-                }
-
-                if (addressTupleLocal == NULL)
-                    goto error;
-
-                connectionTuple = Py_BuildValue("(iiiNNs)",
-                    -1,
-                    AF_INET,
-                    SOCK_DGRAM,
-                    addressTupleLocal,
-                    PyTuple_New(0),
-                    ""
-                    );
-                if (!connectionTuple)
-                    goto error;
-                if (PyList_Append(connectionsList, connectionTuple))
-                    goto error;
-                Py_DECREF(connectionTuple);
-            }
-        }
-
-        free(table);
-    }
-
-    /* UDP IPv6 */
-
-    if ((PySequence_Contains(af_filter, _AF_INET6) == 1) &&
-        (PySequence_Contains(type_filter, _SOCK_DGRAM) == 1))
-    {
-        table = NULL;
-        connectionTuple = NULL;
-        addressTupleLocal = NULL;
-        addressTupleRemote = NULL;
-        tableSize = 0;
-        getExtendedUdpTable(NULL, &tableSize, FALSE,
-                            AF_INET6, UDP_TABLE_OWNER_PID, 0);
-
-        table = malloc(tableSize);
-
-        if (getExtendedUdpTable(table, &tableSize, FALSE, AF_INET6,
-                                 UDP_TABLE_OWNER_PID, 0) == 0)
-        {
-            udp6Table = table;
-
-            for (i = 0; i < udp6Table->dwNumEntries; i++)
-            {
-                if (udp6Table->table[i].dwOwningPid != pid) {
-                    continue;
-                }
-
-                if (memcmp(udp6Table->table[i].ucLocalAddr, null_address, 16) != 0 ||
-                    udp6Table->table[i].dwLocalPort != 0)
-                {
-                    struct in6_addr addr;
-
-                    memcpy(&addr, udp6Table->table[i].ucLocalAddr, 16);
-                    rtlIpv6AddressToStringA(&addr, addressBufferLocal);
-                    addressTupleLocal = Py_BuildValue("(si)", addressBufferLocal,
-                              BYTESWAP_USHORT(udp6Table->table[i].dwLocalPort));
-                }
-                else
-                {
-                    addressTupleLocal = PyTuple_New(0);
-                }
-
-                if (addressTupleLocal == NULL)
-                    goto error;
-
-                connectionTuple = Py_BuildValue("(iiiNNs)",
-                    -1,
-                    AF_INET6,
-                    SOCK_DGRAM,
-                    addressTupleLocal,
-                    PyTuple_New(0),
-                    ""
-                    );
-                if (!connectionTuple)
-                    goto error;
-                if (PyList_Append(connectionsList, connectionTuple))
-                    goto error;
-                Py_DECREF(connectionTuple);
-            }
-        }
-
-        free(table);
-    }
-
-    ConnDecrefPyObjs();
-    return connectionsList;
-
-error:
-    ConnDecrefPyObjs();
-    Py_XDECREF(connectionTuple);
-    Py_XDECREF(addressTupleLocal);
-    Py_XDECREF(addressTupleRemote);
-    Py_DECREF(connectionsList);
-    if (table != NULL)
-        free(table);
-    return NULL;
-}
-
-
-/*
- * Get process priority as a Python integer.
- */
-static PyObject*
-get_process_priority(PyObject* self, PyObject* args)
-{
-    long pid;
-    DWORD priority;
-    HANDLE hProcess;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    priority = GetPriorityClass(hProcess);
-    CloseHandle(hProcess);
-    if (priority == 0) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-    return Py_BuildValue("i", priority);
-}
-
-
-/*
- * Set process priority.
- */
-static PyObject*
-set_process_priority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    int retval;
-    HANDLE hProcess;
-    DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION;
-    if (! PyArg_ParseTuple(args, "li", &pid, &priority)) {
-        return NULL;
-    }
-
-    hProcess = handle_from_pid_waccess(pid, dwDesiredAccess);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    retval = SetPriorityClass(hProcess, priority);
-    CloseHandle(hProcess);
-    if (retval == 0) {
-        PyErr_SetFromWindowsErr(0);
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Return a Python tuple referencing process I/O counters.
- */
-static PyObject*
-get_process_io_counters(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess;
-    IO_COUNTERS IoCounters;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-    if (! GetProcessIoCounters(hProcess, &IoCounters)) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-    CloseHandle(hProcess);
-    return Py_BuildValue("(KKKK)", IoCounters.ReadOperationCount,
-                                   IoCounters.WriteOperationCount,
-                                   IoCounters.ReadTransferCount,
-                                   IoCounters.WriteTransferCount);
-}
-
-
-/*
- * Alternative implementation of the one above but bypasses ACCESS DENIED.
- */
-static PyObject*
-get_process_io_counters_2(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    LONGLONG rcount, wcount, rbytes, wbytes;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    rcount = process->ReadOperationCount.QuadPart;
-    wcount = process->WriteOperationCount.QuadPart;
-    rbytes = process->ReadTransferCount.QuadPart;
-    wbytes = process->WriteTransferCount.QuadPart;
-    free(buffer);
-    return Py_BuildValue("KKKK", rcount, wcount, rbytes, wbytes);
-}
-
-
-/*
- * Return process CPU affinity as a bitmask
- */
-static PyObject*
-get_process_cpu_affinity(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess;
-    PDWORD_PTR proc_mask;
-    PDWORD_PTR system_mask;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    hProcess = handle_from_pid(pid);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-    if (GetProcessAffinityMask(hProcess, &proc_mask, &system_mask) == 0) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    CloseHandle(hProcess);
-    return Py_BuildValue("k", (unsigned long)proc_mask);
-}
-
-
-/*
- * Set process CPU affinity
- */
-static PyObject*
-set_process_cpu_affinity(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess;
-    DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION;
-    DWORD_PTR mask;
-
-    if (! PyArg_ParseTuple(args, "lk", &pid, &mask)) {
-        return NULL;
-    }
-    hProcess = handle_from_pid_waccess(pid, dwDesiredAccess);
-    if (hProcess == NULL) {
-        return NULL;
-    }
-
-    if (SetProcessAffinityMask(hProcess, mask) == 0) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    CloseHandle(hProcess);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Return True if one of the process threads is in a waiting or
- * suspended status.
- */
-static PyObject*
-is_process_suspended(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    ULONG i;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    for (i = 0; i < process->NumberOfThreads; i++) {
-        if (process->Threads[i].ThreadState != Waiting ||
-            process->Threads[i].WaitReason != Suspended)
-        {
-            free(buffer);
-            Py_RETURN_FALSE;
-        }
-    }
-    free(buffer);
-    Py_RETURN_TRUE;
-}
-
-
-/*
- * Return path's disk total and free as a Python tuple.
- */
-static PyObject*
-get_disk_usage(PyObject* self, PyObject* args)
-{
-    BOOL retval;
-    ULARGE_INTEGER _, total, free;
-    LPCTSTR path;
-
-    if (! PyArg_ParseTuple(args, "s", &path)) {
-        return NULL;
-    }
-
-    Py_BEGIN_ALLOW_THREADS
-    retval = GetDiskFreeSpaceEx(path, &_, &total, &free);
-    Py_END_ALLOW_THREADS
-    if (retval == 0) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return Py_BuildValue("(LL)", total.QuadPart, free.QuadPart);
-}
-
-
-/*
- * Return a Python list of named tuples with overall network I/O information
- */
-static PyObject*
-get_network_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_nic_info = NULL;
-    PyObject* py_pre_nic_name = NULL;
-    PyObject* py_nic_name = NULL;
-
-    int attempts = 0;
-    int outBufLen = 15000;
-    DWORD dwRetVal = 0;
-    MIB_IFROW *pIfRow = NULL;
-    ULONG flags = 0;
-    ULONG family = AF_UNSPEC;
-    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
-    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
-
-    do {
-        pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);
-        if (pAddresses == NULL) {
-            PyErr_SetString(PyExc_RuntimeError,
-                "memory allocation failed for IP_ADAPTER_ADDRESSES struct.");
-            goto error;
-        }
-
-        dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses,
-                                        &outBufLen);
-        if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
-            free(pAddresses);
-            pAddresses = NULL;
-        }
-        else {
-            break;
-        }
-
-        attempts++;
-    } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (attempts < 3));
-
-    if (dwRetVal != NO_ERROR) {
-        PyErr_SetString(PyExc_RuntimeError,  "GetAdaptersAddresses() failed.");
-        goto error;
-    }
-
-    pCurrAddresses = pAddresses;
-    while (pCurrAddresses) {
-        py_pre_nic_name = NULL;
-        py_nic_name = NULL;
-        py_nic_info = NULL;
-        pIfRow = (MIB_IFROW *) malloc(sizeof(MIB_IFROW));
-
-        if (pIfRow == NULL) {
-            PyErr_SetString(PyExc_RuntimeError,
-                "memory allocation failed for MIB_IFROW struct.");
-            goto error;
-        }
-
-        pIfRow->dwIndex = pCurrAddresses->IfIndex;
-        dwRetVal = GetIfEntry(pIfRow);
-        if (dwRetVal != NO_ERROR) {
-            PyErr_SetString(PyExc_RuntimeError, "GetIfEntry() failed.");
-            goto error;
-        }
-
-        py_nic_info = Py_BuildValue("(IIIIIIII)",
-                                    pIfRow->dwOutOctets,
-                                    pIfRow->dwInOctets,
-                                    pIfRow->dwOutUcastPkts,
-                                    pIfRow->dwInUcastPkts,
-                                    pIfRow->dwInErrors,
-                                    pIfRow->dwOutErrors,
-                                    pIfRow->dwInDiscards,
-                                    pIfRow->dwOutDiscards);
-        if (!py_nic_info)
-            goto error;
-
-        py_pre_nic_name = PyUnicode_FromWideChar(
-                                pCurrAddresses->FriendlyName,
-                                wcslen(pCurrAddresses->FriendlyName));
-        if (py_pre_nic_name == NULL)
-            goto error;
-        py_nic_name = PyUnicode_FromObject(py_pre_nic_name);
-        if (py_nic_name == NULL)
-            goto error;
-        if (PyDict_SetItem(py_retdict, py_nic_name, py_nic_info))
-            goto error;
-        Py_XDECREF(py_pre_nic_name);
-        Py_XDECREF(py_nic_name);
-        Py_XDECREF(py_nic_info);
-
-        free(pIfRow);
-        pCurrAddresses = pCurrAddresses->Next;
-    }
-
-    free(pAddresses);
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_pre_nic_name);
-    Py_XDECREF(py_nic_name);
-    Py_XDECREF(py_nic_info);
-    Py_DECREF(py_retdict);
-    if (pAddresses != NULL)
-        free(pAddresses);
-    if (pIfRow != NULL)
-        free(pIfRow);
-    return NULL;
-}
-
-
-/*
- * Return a Python dict of tuples for disk I/O information
- */
-static PyObject*
-get_disk_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_disk_info = NULL;
-
-    DISK_PERFORMANCE diskPerformance;
-    DWORD dwSize;
-    HANDLE hDevice = NULL;
-    char szDevice[MAX_PATH];
-    char szDeviceDisplay[MAX_PATH];
-    int devNum;
-
-    for (devNum = 0;; devNum++) {
-        py_disk_info = NULL;
-        sprintf (szDevice, "\\\\.\\PhysicalDrive%d", devNum);
-        hDevice = CreateFile (szDevice, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
-                              NULL, OPEN_EXISTING, 0, NULL);
-
-        if (hDevice == INVALID_HANDLE_VALUE) {
-            // what happens if we get an invalid handle on the first disk?
-            // we might end up with an empty dict incorrectly in some cases
-            break;
-        }
-
-        if (DeviceIoControl(hDevice, IOCTL_DISK_PERFORMANCE, NULL, 0,
-                            &diskPerformance, sizeof(DISK_PERFORMANCE),
-                            &dwSize, NULL))
-        {
-            sprintf (szDeviceDisplay, "PhysicalDrive%d", devNum);
-            py_disk_info = Py_BuildValue("(IILLLL)",
-                                         diskPerformance.ReadCount,
-                                         diskPerformance.WriteCount,
-                                         diskPerformance.BytesRead,
-                                         diskPerformance.BytesWritten,
-                                         (diskPerformance.ReadTime.QuadPart
-                                            * 10) / 1000,
-                                         (diskPerformance.WriteTime.QuadPart
-                                            * 10) / 1000);
-            if (!py_disk_info)
-                goto error;
-            if (PyDict_SetItemString(py_retdict, szDeviceDisplay, py_disk_info))
-                goto error;
-            Py_XDECREF(py_disk_info);
-        }
-        else {
-            // XXX we might get here with ERROR_INSUFFICIENT_BUFFER when
-            // compiling with mingw32; not sure what to do.
-            //return PyErr_SetFromWindowsErr(0);
-            ;;
-        }
-
-        CloseHandle(hDevice);
-    }
-
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_disk_info);
-    Py_DECREF(py_retdict);
-    if (hDevice != NULL)
-        CloseHandle(hDevice);
-    return NULL;
-}
-
-
-static char *get_drive_type(int type)
-{
-    switch (type) {
-        case DRIVE_FIXED:
-            return "fixed";
-        case DRIVE_CDROM:
-            return "cdrom";
-        case DRIVE_REMOVABLE:
-            return "removable";
-        case DRIVE_UNKNOWN:
-            return "unknown";
-        case DRIVE_NO_ROOT_DIR:
-            return "unmounted";
-        case DRIVE_REMOTE:
-            return "remote";
-        case DRIVE_RAMDISK:
-            return "ramdisk";
-        default:
-            return "?";
-    }
-}
-
-
-#define _ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
-
-/*
- * Return disk partitions as a list of tuples such as
- * (drive_letter, drive_letter, type, "")
- */
-static PyObject*
-get_disk_partitions(PyObject* self, PyObject* args)
-{
-    DWORD num_bytes;
-    char drive_strings[255];
-    char* drive_letter = drive_strings;
-    int all;
-    int type;
-    int ret;
-    char opts[20];
-    LPTSTR fs_type[MAX_PATH + 1] = { 0 };
-    DWORD pflags = 0;
-    PyObject* py_all;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_tuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "O", &py_all)) {
-        goto error;
-    }
-    all = PyObject_IsTrue(py_all);
-
-    Py_BEGIN_ALLOW_THREADS
-    num_bytes = GetLogicalDriveStrings(254, drive_letter);
-    Py_END_ALLOW_THREADS
-
-    if (num_bytes == 0) {
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    while (*drive_letter != 0) {
-        py_tuple = NULL;
-        opts[0] = 0;
-        fs_type[0] = 0;
-
-        Py_BEGIN_ALLOW_THREADS
-        type = GetDriveType(drive_letter);
-        Py_END_ALLOW_THREADS
-
-        // by default we only show hard drives and cd-roms
-        if (all == 0) {
-            if ((type == DRIVE_UNKNOWN) ||
-                (type == DRIVE_NO_ROOT_DIR) ||
-                (type == DRIVE_REMOTE) ||
-                (type == DRIVE_RAMDISK)) {
-                goto next;
-            }
-            // floppy disk: skip it by default as it introduces a
-            // considerable slowdown.
-            if ((type == DRIVE_REMOVABLE) && (strcmp(drive_letter, "A:\\") == 0)) {
-                goto next;
-            }
-        }
-
-        ret = GetVolumeInformation(drive_letter, NULL, _ARRAYSIZE(drive_letter),
-                                   NULL, NULL, &pflags, fs_type,
-                                   _ARRAYSIZE(fs_type));
-        if (ret == 0) {
-            // We might get here in case of a floppy hard drive, in
-            // which case the error is (21, "device not ready").
-            // Let's pretend it didn't happen as we already have
-            // the drive name and type ('removable').
-            strcat(opts, "");
-            SetLastError(0);
-        }
-        else {
-            if (pflags & FILE_READ_ONLY_VOLUME) {
-                strcat(opts, "ro");
-            }
-            else {
-                strcat(opts, "rw");
-            }
-            if (pflags & FILE_VOLUME_IS_COMPRESSED) {
-                strcat(opts, ",compressed");
-            }
-        }
-
-        if (strlen(opts) > 0) {
-            strcat(opts, ",");
-        }
-        strcat(opts, get_drive_type(type));
-
-        py_tuple = Py_BuildValue("(ssss)",
-            drive_letter,
-            drive_letter,
-            fs_type,  // either FAT, FAT32, NTFS, HPFS, CDFS, UDF or NWFS
-            opts);
-        if (!py_tuple)
-            goto error;
-        if (PyList_Append(py_retlist, py_tuple))
-            goto error;
-        Py_DECREF(py_tuple);
-        goto next;
-
-        next:
-            drive_letter = strchr(drive_letter, 0) + 1;
-    }
-
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_retlist);
-    return NULL;
-}
-
-
-#ifdef UNICODE
-#define WTSOpenServer WTSOpenServerW
-#else
-#define WTSOpenServer WTSOpenServerA
-#endif
-
-
-/*
- * Return a Python dict of tuples for disk I/O information
- */
-static PyObject*
-get_system_users(PyObject* self, PyObject* args)
-{
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_tuple = NULL;
-    PyObject* py_address = NULL;
-
-    HANDLE hServer = NULL;
-    LPTSTR buffer_user = NULL;
-    LPTSTR buffer_addr = NULL;
-    PWTS_SESSION_INFO sessions = NULL;
-    DWORD count;
-    DWORD i;
-    DWORD sessionId;
-    DWORD bytes;
-    PWTS_CLIENT_ADDRESS address;
-    char address_str[50];
-    long long unix_time;
-
-    PWINSTATIONQUERYINFORMATIONW WinStationQueryInformationW;
-    WINSTATION_INFO station_info;
-    HINSTANCE hInstWinSta = NULL;
-    ULONG returnLen;
-
-    hInstWinSta = LoadLibraryA("winsta.dll");
-    WinStationQueryInformationW = (PWINSTATIONQUERYINFORMATIONW)
-        GetProcAddress(hInstWinSta, "WinStationQueryInformationW");
-
-    hServer = WTSOpenServer('\0');
-    if (hServer == NULL) {
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    if (WTSEnumerateSessions(hServer, 0, 1, &sessions, &count) == 0) {
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    for (i=0; i<count; i++) {
-        py_address = NULL;
-        py_tuple = NULL;
-        sessionId = sessions[i].SessionId;
-        if (buffer_user != NULL) {
-            WTSFreeMemory(buffer_user);
-        }
-        if (buffer_addr != NULL) {
-            WTSFreeMemory(buffer_addr);
-        }
-
-        buffer_user = NULL;
-        buffer_addr = NULL;
-
-        // username
-        bytes = 0;
-        if (WTSQuerySessionInformation(hServer, sessionId, WTSUserName,
-                                        &buffer_user, &bytes) == 0) {
-            PyErr_SetFromWindowsErr(0);
-            goto error;
-        }
-        if (bytes == 1) {
-            continue;
-        }
-
-        // address
-        bytes = 0;
-        if (WTSQuerySessionInformation(hServer, sessionId, WTSClientAddress,
-                                       &buffer_addr, &bytes) == 0) {
-            PyErr_SetFromWindowsErr(0);
-            goto error;
-        }
-
-        address = (PWTS_CLIENT_ADDRESS)buffer_addr;
-        if (address->AddressFamily == 0) {  // AF_INET
-            sprintf(address_str, "%u.%u.%u.%u", address->Address[0],
-                                                address->Address[1],
-                                                address->Address[2],
-                                                address->Address[3]);
-            py_address = Py_BuildValue("s", address_str);
-            if (!py_address)
-                goto error;
-        }
-        else {
-            py_address = Py_None;
-        }
-
-        // login time
-        if (!WinStationQueryInformationW(hServer,
-                                         sessionId,
-                                         WinStationInformation,
-                                         &station_info,
-                                         sizeof(station_info),
-                                         &returnLen))
-                                         {
-            goto error;
-        }
-
-        unix_time = ((LONGLONG)station_info.ConnectTime.dwHighDateTime) << 32;
-        unix_time += station_info.ConnectTime.dwLowDateTime - 116444736000000000LL;
-        unix_time /= 10000000;
-
-        py_tuple = Py_BuildValue("sOd", buffer_user,
-                                        py_address,
-                                        (double)unix_time);
-        if (!py_tuple)
-            goto error;
-        if (PyList_Append(py_retlist, py_tuple))
-            goto error;
-        Py_XDECREF(py_address);
-        Py_XDECREF(py_tuple);
-    }
-
-    WTSCloseServer(hServer);
-    WTSFreeMemory(sessions);
-    WTSFreeMemory(buffer_user);
-    WTSFreeMemory(buffer_addr);
-    FreeLibrary(hInstWinSta);
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_XDECREF(py_address);
-    Py_DECREF(py_retlist);
-
-    if (hInstWinSta != NULL) {
-        FreeLibrary(hInstWinSta);
-    }
-    if (hServer != NULL) {
-        WTSCloseServer(hServer);
-    }
-    if (sessions != NULL) {
-        WTSFreeMemory(sessions);
-    }
-    if (buffer_user != NULL) {
-        WTSFreeMemory(buffer_user);
-    }
-    if (buffer_addr != NULL) {
-        WTSFreeMemory(buffer_addr);
-    }
-    return NULL;
-}
-
-
-/*
- * Return the number of handles opened by process.
- */
-static PyObject*
-get_process_num_handles(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess;
-    DWORD handleCount;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        return NULL;
-    }
-    if (! GetProcessHandleCount(hProcess, &handleCount)) {
-        CloseHandle(hProcess);
-        return PyErr_SetFromWindowsErr(0);
-    }
-    CloseHandle(hProcess);
-    return Py_BuildValue("k", handleCount);
-}
-
-
-/*
- * Alternative implementation of the one above but bypasses ACCESS DENIED.
- */
-static PyObject*
-get_process_num_handles_2(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    ULONG count;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    count = process->HandleCount;
-    free(buffer);
-    return Py_BuildValue("k", count);
-}
-
-
-/*
- * Return the number of context switches executed by process.
- */
-static PyObject*
-get_process_num_ctx_switches(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    PSYSTEM_PROCESS_INFORMATION process;
-    PVOID buffer;
-    ULONG i;
-    ULONG total = 0;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! get_process_info(pid, &process, &buffer)) {
-        return NULL;
-    }
-    for (i=0; i < process->NumberOfThreads; i++) {
-        total += process->Threads[i].ContextSwitches;
-    }
-    free(buffer);
-    return Py_BuildValue("ki", total, 0);
-}
-
-
-static char *get_region_protection_string(ULONG protection)
-{
-    switch (protection & 0xff) {
-        case PAGE_NOACCESS:
-            return "";
-        case PAGE_READONLY:
-            return "r";
-        case PAGE_READWRITE:
-            return "rw";
-        case PAGE_WRITECOPY:
-            return "wc";
-        case PAGE_EXECUTE:
-            return "x";
-        case PAGE_EXECUTE_READ:
-            return "xr";
-        case PAGE_EXECUTE_READWRITE:
-            return "xrw";
-        case PAGE_EXECUTE_WRITECOPY:
-            return "xwc";
-        default:
-            return "?";
-    }
-}
-
-/*
- * Return a list of process's memory mappings.
- */
-static PyObject*
-get_process_memory_maps(PyObject* self, PyObject* args)
-{
-    DWORD pid;
-    HANDLE hProcess = NULL;
-    MEMORY_BASIC_INFORMATION basicInfo;
-    PVOID baseAddress;
-    PVOID previousAllocationBase;
-    CHAR mappedFileName[MAX_PATH];
-    SYSTEM_INFO system_info;
-    LPVOID maxAddr;
-    PyObject* py_list = PyList_New(0);
-    PyObject* py_tuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-    hProcess = handle_from_pid(pid);
-    if (NULL == hProcess) {
-        goto error;
-    }
-
-    GetSystemInfo(&system_info);
-    maxAddr = system_info.lpMaximumApplicationAddress;
-    baseAddress = NULL;
-    previousAllocationBase = NULL;
-
-    while (VirtualQueryEx(hProcess, baseAddress, &basicInfo,
-                          sizeof(MEMORY_BASIC_INFORMATION)))
-    {
-        py_tuple = NULL;
-        if (baseAddress > maxAddr) {
-            break;
-        }
-        if (GetMappedFileNameA(hProcess, baseAddress, mappedFileName,
-                               sizeof(mappedFileName)))
-        {
-            py_tuple = Py_BuildValue("(kssI)",
-                (unsigned long)baseAddress,
-                get_region_protection_string(basicInfo.Protect),
-                mappedFileName,
-                basicInfo.RegionSize
-            );
-            if (!py_tuple)
-                goto error;
-            if (PyList_Append(py_list, py_tuple))
-                goto error;
-            Py_DECREF(py_tuple);
-        }
-        previousAllocationBase = basicInfo.AllocationBase;
-        baseAddress = (PCHAR)baseAddress + basicInfo.RegionSize;
-    }
-
-    CloseHandle(hProcess);
-    return py_list;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_list);
-    if (hProcess != NULL)
-        CloseHandle(hProcess);
-    return NULL;
-}
-
-// ------------------------ Python init ---------------------------
-
-static PyMethodDef
-PsutilMethods[] =
-{
-    // --- per-process functions
-
-    {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-    {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-    {"get_process_exe", get_process_exe, METH_VARARGS,
-        "Return path of the process executable"},
-    {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-    {"kill_process", kill_process, METH_VARARGS,
-        "Kill the process identified by the given PID"},
-    {"get_process_cpu_times", get_process_cpu_times, METH_VARARGS,
-        "Return tuple of user/kern time for the given PID"},
-    {"get_process_create_time", get_process_create_time, METH_VARARGS,
-        "Return a float indicating the process create time expressed in "
-        "seconds since the epoch"},
-    {"get_process_memory_info", get_process_memory_info, METH_VARARGS,
-        "Return a tuple of process memory information"},
-    {"get_process_cwd", get_process_cwd, METH_VARARGS,
-        "Return process current working directory"},
-    {"suspend_process", suspend_process, METH_VARARGS,
-        "Suspend a process"},
-    {"resume_process", resume_process, METH_VARARGS,
-        "Resume a process"},
-    {"get_process_open_files", get_process_open_files, METH_VARARGS,
-        "Return files opened by process"},
-    {"get_process_username", get_process_username, METH_VARARGS,
-        "Return the username of a process"},
-    {"get_process_connections", get_process_connections, METH_VARARGS,
-        "Return the network connections of a process"},
-    {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-        "Return the network connections of a process"},
-    {"get_process_threads", get_process_threads, METH_VARARGS,
-        "Return process threads information as a list of tuple"},
-    {"process_wait", process_wait, METH_VARARGS,
-        "Wait for process to terminate and return its exit code."},
-    {"get_process_priority", get_process_priority, METH_VARARGS,
-        "Return process priority."},
-    {"set_process_priority", set_process_priority, METH_VARARGS,
-        "Set process priority."},
-    {"get_process_cpu_affinity", get_process_cpu_affinity, METH_VARARGS,
-        "Return process CPU affinity as a bitmask."},
-    {"set_process_cpu_affinity", set_process_cpu_affinity, METH_VARARGS,
-        "Set process CPU affinity."},
-    {"get_process_io_counters", get_process_io_counters, METH_VARARGS,
-        "Get process I/O counters."},
-    {"is_process_suspended", is_process_suspended, METH_VARARGS,
-        "Return True if one of the process threads is in a suspended state"},
-    {"get_process_num_handles", get_process_num_handles, METH_VARARGS,
-        "Return the number of handles opened by process."},
-    {"get_process_num_ctx_switches", get_process_num_ctx_switches, METH_VARARGS,
-        "Return the number of context switches performed by process."},
-    {"get_process_memory_maps", get_process_memory_maps, METH_VARARGS,
-        "Return a list of process's memory mappings"},
-
-    // --- alternative pinfo interface
-    {"get_process_cpu_times_2", get_process_cpu_times_2, METH_VARARGS,
-        "Alternative implementation"},
-    {"get_process_create_time_2", get_process_create_time_2, METH_VARARGS,
-        "Alternative implementation"},
-    {"get_process_num_handles_2", get_process_num_handles_2, METH_VARARGS,
-        "Alternative implementation"},
-    {"get_process_io_counters_2", get_process_io_counters_2, METH_VARARGS,
-        "Alternative implementation"},
-    {"get_process_memory_info_2", get_process_memory_info_2, METH_VARARGS,
-        "Alternative implementation"},
-
-    // --- system-related functions
-
-    {"get_pid_list", get_pid_list, METH_VARARGS,
-        "Returns a list of PIDs currently running on the system"},
-    {"pid_exists", pid_exists, METH_VARARGS,
-        "Determine if the process exists in the current process list."},
-    {"get_num_cpus", get_num_cpus, METH_VARARGS,
-        "Returns the number of CPUs on the system"},
-    {"get_system_uptime", get_system_uptime, METH_VARARGS,
-        "Return system uptime"},
-    {"get_virtual_mem", get_virtual_mem, METH_VARARGS,
-        "Return the total amount of physical memory, in bytes"},
-    {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-        "Return system per-cpu times as a list of tuples"},
-    {"get_disk_usage", get_disk_usage, METH_VARARGS,
-        "Return path's disk total and free as a Python tuple."},
-    {"get_network_io_counters", get_network_io_counters, METH_VARARGS,
-        "Return dict of tuples of networks I/O information."},
-    {"get_disk_io_counters", get_disk_io_counters, METH_VARARGS,
-         "Return dict of tuples of disks I/O information."},
-    {"get_system_users", get_system_users, METH_VARARGS,
-        "Return a list of currently connected users."},
-    {"get_disk_partitions", get_disk_partitions, METH_VARARGS,
-        "Return disk partitions."},
-
-
-     // --- windows API bindings
-    {"win32_QueryDosDevice", win32_QueryDosDevice, METH_VARARGS,
-        "QueryDosDevice binding"},
-
-    {NULL, NULL, 0, NULL}
-};
-
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-    #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-    #define GETSTATE(m) (&_state)
-    static struct module_state _state;
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-    static int psutil_mswindows_traverse(PyObject *m, visitproc visit, void *arg) {
-        Py_VISIT(GETSTATE(m)->error);
-        return 0;
-    }
-
-    static int psutil_mswindows_clear(PyObject *m) {
-        Py_CLEAR(GETSTATE(m)->error);
-        return 0;
-    }
-
-    static struct PyModuleDef moduledef = {
-            PyModuleDef_HEAD_INIT,
-            "psutil_mswindows",
-            NULL,
-            sizeof(struct module_state),
-            PsutilMethods,
-            NULL,
-            psutil_mswindows_traverse,
-            psutil_mswindows_clear,
-            NULL
-    };
-
-#define INITERROR return NULL
-
-    PyObject* PyInit__psutil_mswindows(void)
-
-#else
-    #define INITERROR return
-    void init_psutil_mswindows(void)
-#endif
-{
-    struct module_state *st = NULL;
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_mswindows", PsutilMethods);
-#endif
-
-    if (module == NULL) {
-        INITERROR;
-    }
-
-    st = GETSTATE(module);
-    st->error = PyErr_NewException("_psutil_mswindow.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-
-    // Public constants
-    // http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx
-    PyModule_AddIntConstant(module, "ABOVE_NORMAL_PRIORITY_CLASS",
-                                     ABOVE_NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "BELOW_NORMAL_PRIORITY_CLASS",
-                                     BELOW_NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "HIGH_PRIORITY_CLASS",
-                                     HIGH_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "IDLE_PRIORITY_CLASS",
-                                     IDLE_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "NORMAL_PRIORITY_CLASS",
-                                     NORMAL_PRIORITY_CLASS);
-    PyModule_AddIntConstant(module, "REALTIME_PRIORITY_CLASS",
-                                     REALTIME_PRIORITY_CLASS);
-    // private constants
-    PyModule_AddIntConstant(module, "INFINITE", INFINITE);
-    PyModule_AddIntConstant(module, "ERROR_ACCESS_DENIED", ERROR_ACCESS_DENIED);
-    SetSeDebug();
-
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_mswindows.h b/contrib/psutil-0.6.1/psutil/_psutil_mswindows.h
deleted file mode 100644
index 19881a7..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_mswindows.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * $Id: _psutil_mswindows.h 1498 2012-07-24 21:41:28Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Windows platform-specific module methods for _psutil_mswindows
- */
-
-#include <Python.h>
-#include <windows.h>
-
-// --- per-process functions
-
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_exe(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_cwd(PyObject* self, PyObject* args);
-static PyObject* get_process_open_files(PyObject* self, PyObject* args);
-static PyObject* get_process_username(PyObject* self, PyObject* args);
-static PyObject* get_process_connections(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_priority(PyObject* self, PyObject* args);
-static PyObject* set_process_priority(PyObject* self, PyObject* args);
-static PyObject* get_process_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_process_cpu_affinity(PyObject* self, PyObject* args);
-static PyObject* set_process_cpu_affinity(PyObject* self, PyObject* args);
-static PyObject* get_process_num_handles(PyObject* self, PyObject* args);
-static PyObject* get_process_num_ctx_switches(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_maps(PyObject* self, PyObject* args);
-
-static PyObject* get_process_cpu_times_2(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time_2(PyObject* self, PyObject* args);
-static PyObject* get_process_num_handles_2(PyObject* self, PyObject* args);
-static PyObject* get_process_io_counters_2(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_info_2(PyObject* self, PyObject* args);
-
-static PyObject* suspend_process(PyObject* self, PyObject* args);
-static PyObject* resume_process(PyObject* self, PyObject* args);
-static PyObject* is_process_suspended(PyObject* self, PyObject* args);
-static PyObject* process_wait(PyObject* self, PyObject* args);
-static PyObject* kill_process(PyObject* self, PyObject* args);
-
-// --- system-related functions
-
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_system_uptime(PyObject* self, PyObject* args);
-static PyObject* get_virtual_mem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-static PyObject* pid_exists(PyObject* self, PyObject* args);
-static PyObject* get_disk_usage(PyObject* self, PyObject* args);
-static PyObject* get_disk_partitions(PyObject* self, PyObject* args);
-static PyObject* get_network_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_disk_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_system_users(PyObject* self, PyObject* args);
-
-// --- windows API bindings
-
-static PyObject* win32_QueryDosDevice(PyObject* self, PyObject* args);
-
-// --- internal
-int suspend_resume_process(DWORD pid, int suspend);
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_osx.c b/contrib/psutil-0.6.1/psutil/_psutil_osx.c
deleted file mode 100644
index 5b4da11..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_osx.c
+++ /dev/null
@@ -1,1792 +0,0 @@
-/*
- * $Id: _psutil_osx.c 1501 2012-07-25 12:57:34Z g.rodola@gmail.com $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * OS X platform-specific module methods for _psutil_osx
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <utmpx.h>
-#include <sys/sysctl.h>
-#include <sys/vmmeter.h>
-#include <libproc.h>
-#include <sys/proc_info.h>
-#include <netinet/tcp_fsm.h>
-#include <arpa/inet.h>
-#include <net/if_dl.h>
-#include <pwd.h>
-
-#include <mach/mach.h>
-#include <mach/task.h>
-#include <mach/mach_init.h>
-#include <mach/host_info.h>
-#include <mach/mach_host.h>
-#include <mach/mach_traps.h>
-#include <mach/mach_vm.h>
-#include <mach/shared_memory_server.h>
-
-#include <mach-o/loader.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <IOKit/IOKitLib.h>
-#include <IOKit/storage/IOBlockStorageDriver.h>
-#include <IOKit/storage/IOMedia.h>
-#include <IOKit/IOBSD.h>
-
-#include "_psutil_osx.h"
-#include "_psutil_common.h"
-#include "arch/osx/process_info.h"
-
-
-/*
- * A wrapper around host_statistics() invoked with HOST_VM_INFO.
- */
-int
-psutil_sys_vminfo(vm_statistics_data_t *vmstat)
-{
-    kern_return_t ret;
-    mach_msg_type_number_t count = sizeof(*vmstat) / sizeof(integer_t);
-    mach_port_t mport = mach_host_self();
-
-    ret = host_statistics(mport, HOST_VM_INFO, (host_info_t)vmstat, &count);
-    if (ret != KERN_SUCCESS) {
-        PyErr_Format(PyExc_RuntimeError,
-                     "host_statistics() failed: %s", mach_error_string(ret));
-        return 0;
-    }
-    return 1;
-}
-
-
-/*
- * Return a Python list of all the PIDs running on the system.
- */
-static PyObject*
-get_pid_list(PyObject* self, PyObject* args)
-{
-    kinfo_proc *proclist = NULL;
-    kinfo_proc *orig_address = NULL;
-    size_t num_processes;
-    size_t idx;
-    PyObject *pid = NULL;
-    PyObject *retlist = PyList_New(0);
-
-    if (get_proc_list(&proclist, &num_processes) != 0) {
-        PyErr_SetString(PyExc_RuntimeError, "failed to retrieve process list.");
-        goto error;
-    }
-
-    if (num_processes > 0) {
-        // save the address of proclist so we can free it later
-        orig_address = proclist;
-        for (idx=0; idx < num_processes; idx++) {
-            pid = Py_BuildValue("i", proclist->kp_proc.p_pid);
-            if (!pid)
-                goto error;
-            if (PyList_Append(retlist, pid))
-                goto error;
-            Py_DECREF(pid);
-            proclist++;
-        }
-        free(orig_address);
-    }
-    return retlist;
-
-error:
-    Py_XDECREF(pid);
-    Py_DECREF(retlist);
-    if (orig_address != NULL)
-        free(orig_address);
-    return NULL;
-}
-
-
-/*
- * Return process name from kinfo_proc as a Python string.
- */
-static PyObject*
-get_process_name(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("s", kp.kp_proc.p_comm);
-}
-
-
-/*
- * Return process current working directory.
- */
-static PyObject*
-get_process_cwd(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct proc_vnodepathinfo pathinfo;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    if (! psutil_proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, &pathinfo,
-                              sizeof(pathinfo)))
-    {
-        return NULL;
-    }
-    return Py_BuildValue("s", pathinfo.pvi_cdir.vip_path);
-}
-
-
-/*
- * Return path of the process executable.
- */
-static PyObject*
-get_process_exe(PyObject* self, PyObject* args)
-{
-    long pid;
-    char buf[PATH_MAX];
-    int ret;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    ret = proc_pidpath(pid, &buf, sizeof(buf));
-    if (ret == 0) {
-        if (! pid_exists(pid)) {
-            return NoSuchProcess();
-        }
-        else {
-            return AccessDenied();
-        }
-    }
-    return Py_BuildValue("s", buf);
-}
-
-/*
- * Return process cmdline as a Python list of cmdline arguments.
- */
-static PyObject*
-get_process_cmdline(PyObject* self, PyObject* args)
-{
-    long pid;
-    PyObject* arglist = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    // get the commandline, defined in arch/osx/process_info.c
-    arglist = get_arg_list(pid);
-    return arglist;
-}
-
-
-/*
- * Return process parent pid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_ppid(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("l", (long)kp.kp_eproc.e_ppid);
-}
-
-
-/*
- * Return process real uid from kinfo_proc as a Python integer.
- */
-static PyObject*
-get_process_uids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.kp_eproc.e_pcred.p_ruid,
-                                (long)kp.kp_eproc.e_ucred.cr_uid,
-                                (long)kp.kp_eproc.e_pcred.p_svuid);
-}
-
-
-/*
- * Return process real group id from ki_comm as a Python integer.
- */
-static PyObject*
-get_process_gids(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("lll", (long)kp.kp_eproc.e_pcred.p_rgid,
-                                (long)kp.kp_eproc.e_ucred.cr_groups[0],
-                                (long)kp.kp_eproc.e_pcred.p_svgid);
-}
-
-
-/*
- * Return process controlling terminal number as an integer.
- */
-static PyObject*
-get_process_tty_nr(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", kp.kp_eproc.e_tdev);
-}
-
-
-/*
- * Return a list of tuples for every process memory maps.
- * 'procstat' cmdline utility has been used as an example.
- */
-static PyObject*
-get_process_memory_maps(PyObject* self, PyObject* args)
-{
-    char buf[PATH_MAX];
-    char addr_str[34];
-    char perms[8];
-    int pagesize = getpagesize();
-    long pid;
-    kern_return_t err = KERN_SUCCESS;
-    mach_port_t task;
-    uint32_t depth = 1;
-    vm_address_t address = 0;
-    vm_size_t size = 0;
-
-    PyObject* py_tuple = NULL;
-    PyObject* py_list = PyList_New(0);
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-
-    err = task_for_pid(mach_task_self(), pid, &task);
-
-    if (err != KERN_SUCCESS) {
-        if (! pid_exists(pid)) {
-            NoSuchProcess();
-        }
-        else {
-            // pid exists, so return AccessDenied error since task_for_pid()
-            // failed
-            AccessDenied();
-        }
-        goto error;
-    }
-
-    while (1) {
-        py_tuple = NULL;
-        struct vm_region_submap_info_64 info;
-        mach_msg_type_number_t count = VM_REGION_SUBMAP_INFO_COUNT_64;
-
-        err = vm_region_recurse_64(task, &address, &size, &depth,
-                                   (vm_region_info_64_t)&info, &count);
-
-        if (err == KERN_INVALID_ADDRESS) {
-            break;
-        }
-
-        if (info.is_submap) {
-            depth++;
-        }
-        else {
-            // Free/Reset the char[]s to avoid weird paths
-            memset(buf, 0, sizeof(buf));
-            memset(addr_str, 0, sizeof(addr_str));
-            memset(perms, 0, sizeof(perms));
-
-            sprintf(addr_str, "%016x-%016x", address, address + size);
-            sprintf(perms, "%c%c%c/%c%c%c",
-                    (info.protection & VM_PROT_READ) ? 'r' : '-',
-                    (info.protection & VM_PROT_WRITE) ? 'w' : '-',
-                    (info.protection & VM_PROT_EXECUTE) ? 'x' : '-',
-                    (info.max_protection & VM_PROT_READ) ? 'r' : '-',
-                    (info.max_protection & VM_PROT_WRITE) ? 'w' : '-',
-                    (info.max_protection & VM_PROT_EXECUTE) ? 'x' : '-');
-
-            address += size;
-
-            err = proc_regionfilename(pid, address, buf, sizeof(buf));
-
-            if (info.share_mode == SM_COW && info.ref_count == 1) {
-                // Treat single reference SM_COW as SM_PRIVATE
-                info.share_mode = SM_PRIVATE;
-            }
-
-            if (strlen(buf) == 0) {
-                switch(info.share_mode) {
-                /*
-                case SM_LARGE_PAGE:
-                    // Treat SM_LARGE_PAGE the same as SM_PRIVATE
-                    // since they are not shareable and are wired.
-                */
-                case SM_COW:
-                    strcpy(buf, "[cow]");
-                    break;
-                case SM_PRIVATE:
-                    strcpy(buf, "[prv]");
-                    break;
-                case SM_EMPTY:
-                    strcpy(buf, "[nul]");
-                    break;
-                case SM_SHARED:
-                case SM_TRUESHARED:
-                    strcpy(buf, "[shm]");
-                    break;
-                case SM_PRIVATE_ALIASED:
-                    strcpy(buf, "[ali]");
-                    break;
-                case SM_SHARED_ALIASED:
-                    strcpy(buf, "[s/a]");
-                    break;
-                default:
-                    strcpy(buf, "[???]");
-                }
-            }
-
-            py_tuple = Py_BuildValue("sssIIIIIH",
-                addr_str,                                 // "start-end" address
-                perms,                                    // "rwx" permissions
-                buf,                                      // path
-                info.pages_resident * pagesize,           // rss
-                info.pages_shared_now_private * pagesize, // private
-                info.pages_swapped_out * pagesize,        // swapped
-                info.pages_dirtied * pagesize,            // dirtied
-                info.ref_count,                           // ref count
-                info.shadow_depth                         // shadow depth
-            );
-            if (!py_tuple)
-                goto error;
-            if (PyList_Append(py_list, py_tuple))
-                goto error;
-            Py_DECREF(py_tuple);
-        }
-    }
-
-    return py_list;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_list);
-    return NULL;
-}
-
-
-/*
- * Return a Python integer indicating the number of CPUs on the system.
- */
-static PyObject*
-get_num_cpus(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    int ncpu;
-    size_t len;
-
-    mib[0] = CTL_HW;
-    mib[1] = HW_NCPU;
-    len = sizeof(ncpu);
-
-    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-
-    return Py_BuildValue("i", ncpu);
-}
-
-
-#define TV2DOUBLE(t)    ((t).tv_sec + (t).tv_usec / 1000000.0)
-
-/*
- * Return a Python tuple (user_time, kernel_time)
- */
-static PyObject*
-get_process_cpu_times(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct proc_taskinfo pti;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! psutil_proc_pidinfo(pid, PROC_PIDTASKINFO, &pti, sizeof(pti))) {
-        return NULL;
-    }
-    return Py_BuildValue("(dd)",
-                         (float)pti.pti_total_user / 1000000000.0,
-                         (float)pti.pti_total_system / 1000000000.0);
-}
-
-
-/*
- * Return a Python float indicating the process create time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_process_create_time(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("d", TV2DOUBLE(kp.kp_proc.p_starttime));
-}
-
-
-/*
- * Return extended memory info about a process.
- */
-static PyObject*
-get_process_memory_info(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct proc_taskinfo pti;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! psutil_proc_pidinfo(pid, PROC_PIDTASKINFO, &pti, sizeof(pti))) {
-        return NULL;
-    }
-
-    // Note: determining other memory stats on OSX is a mess:
-    // http://www.opensource.apple.com/source/top/top-67/libtop.c?txt
-    // I just give up...
-    //struct proc_regioninfo pri;
-    //psutil_proc_pidinfo(pid, PROC_PIDREGIONINFO, &pri, sizeof(pri))
-
-    return Py_BuildValue("(KKkk)",
-        pti.pti_resident_size,      // resident memory size (rss)
-        pti.pti_virtual_size,       // virtual memory size (vms)
-        pti.pti_faults,             // number of page faults (pages)
-        pti.pti_pageins             // number of actual pageins (pages)
-    );
-}
-
-
-/*
- * Return number of threads used by process as a Python integer.
- */
-static PyObject*
-get_process_num_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct proc_taskinfo pti;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! psutil_proc_pidinfo(pid, PROC_PIDTASKINFO, &pti, sizeof(pti))) {
-        return NULL;
-    }
-    return Py_BuildValue("k", pti.pti_threadnum);
-}
-
-
-/*
- * Return the number of context switches performed by process.
- */
-static PyObject*
-get_process_num_ctx_switches(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct proc_taskinfo pti;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (! psutil_proc_pidinfo(pid, PROC_PIDTASKINFO, &pti, sizeof(pti))) {
-        return NULL;
-    }
-    // unvoluntary value seems not to be available;
-    // pti.pti_csw probably refers to the sum of the two (getrusage()
-    // numbers seems to confirm this theory).
-    return Py_BuildValue("ki", pti.pti_csw, 0);
-}
-
-
-/*
- * Return system virtual memory stats
- */
-static PyObject*
-get_virtual_mem(PyObject* self, PyObject* args)
-{
-
-    int      mib[2];
-    uint64_t total;
-    size_t   len = sizeof(total);
-    vm_statistics_data_t vm;
-    int pagesize = getpagesize();
-
-    // physical mem
-    mib[0] = CTL_HW;
-    mib[1] = HW_MEMSIZE;
-    if (sysctl(mib, 2, &total, &len, NULL, 0)) {
-        if (errno != 0)
-            PyErr_SetFromErrno(0);
-        else
-            PyErr_Format(PyExc_RuntimeError, "sysctl(HW_MEMSIZE) failed");
-        return NULL;
-    }
-
-    // vm
-    if (!psutil_sys_vminfo(&vm)) {
-        return NULL;
-    }
-
-    return Py_BuildValue("KKKKK",
-        total,
-        (unsigned long long) vm.active_count * pagesize,
-        (unsigned long long) vm.inactive_count * pagesize,
-        (unsigned long long) vm.wire_count * pagesize,
-        (unsigned long long) vm.free_count * pagesize
-    );
-}
-
-
-/*
- * Return stats about swap memory.
- */
-static PyObject*
-get_swap_mem(PyObject* self, PyObject* args)
-{
-    int mib[2];
-    size_t size;
-    struct xsw_usage totals;
-    vm_statistics_data_t vmstat;
-    int pagesize = getpagesize();
-
-    mib[0] = CTL_VM;
-    mib[1] = VM_SWAPUSAGE;
-    size = sizeof(totals);
-    if (sysctl(mib, 2, &totals, &size, NULL, 0) == -1) {
-        if (errno != 0)
-            PyErr_SetFromErrno(0);
-        else
-            PyErr_Format(PyExc_RuntimeError, "sysctl(VM_SWAPUSAGE) failed");
-        return NULL;
-    }
-    if (!psutil_sys_vminfo(&vmstat)) {
-        return NULL;
-    }
-
-    return Py_BuildValue("LLLKK",
-                         totals.xsu_total,
-                         totals.xsu_used,
-                         totals.xsu_avail,
-                         (unsigned long long)vmstat.pageins * pagesize,
-                         (unsigned long long)vmstat.pageouts * pagesize);
-}
-
-
-/*
- * Return a Python tuple representing user, kernel and idle CPU times
- */
-static PyObject*
-get_system_cpu_times(PyObject* self, PyObject* args)
-{
-    mach_msg_type_number_t  count = HOST_CPU_LOAD_INFO_COUNT;
-    kern_return_t error;
-    host_cpu_load_info_data_t r_load;
-
-    error = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&r_load, &count);
-    if (error != KERN_SUCCESS) {
-        return PyErr_Format(PyExc_RuntimeError,
-                "Error in host_statistics(): %s", mach_error_string(error));
-    }
-
-    return Py_BuildValue("(dddd)",
-                         (double)r_load.cpu_ticks[CPU_STATE_USER] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_NICE] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_SYSTEM] / CLK_TCK,
-                         (double)r_load.cpu_ticks[CPU_STATE_IDLE] / CLK_TCK
-                         );
-}
-
-
-/*
- * Return a Python list of tuple representing per-cpu times
- */
-static PyObject*
-get_system_per_cpu_times(PyObject* self, PyObject* args)
-{
-    natural_t cpu_count;
-    processor_info_array_t info_array;
-    mach_msg_type_number_t info_count;
-    kern_return_t error;
-    processor_cpu_load_info_data_t* cpu_load_info = NULL;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_cputime = NULL;
-    int i, ret;
-
-    error = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO,
-                                &cpu_count, &info_array, &info_count);
-    if (error != KERN_SUCCESS) {
-        PyErr_Format(PyExc_RuntimeError, "Error in host_processor_info(): %s",
-                     mach_error_string(error));
-        goto error;
-    }
-
-    cpu_load_info = (processor_cpu_load_info_data_t*) info_array;
-
-    for (i = 0; i < cpu_count; i++) {
-        py_cputime = Py_BuildValue("(dddd)",
-               (double)cpu_load_info[i].cpu_ticks[CPU_STATE_USER] / CLK_TCK,
-               (double)cpu_load_info[i].cpu_ticks[CPU_STATE_NICE] / CLK_TCK,
-               (double)cpu_load_info[i].cpu_ticks[CPU_STATE_SYSTEM] / CLK_TCK,
-               (double)cpu_load_info[i].cpu_ticks[CPU_STATE_IDLE] / CLK_TCK
-              );
-        if (!py_cputime)
-            goto error;
-        if (PyList_Append(py_retlist, py_cputime))
-            goto error;
-        Py_DECREF(py_cputime);
-    }
-
-    ret = vm_deallocate(mach_task_self(), (vm_address_t)info_array,
-                        info_count * sizeof(int));
-    if (ret != KERN_SUCCESS) {
-        PyErr_WarnEx(PyExc_RuntimeWarning, "vm_deallocate() failed", 2);
-    }
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_cputime);
-    Py_DECREF(py_retlist);
-    if (cpu_load_info != NULL) {
-        ret = vm_deallocate(mach_task_self(), (vm_address_t)info_array,
-                            info_count * sizeof(int));
-        if (ret != KERN_SUCCESS) {
-            PyErr_WarnEx(PyExc_RuntimeWarning, "vm_deallocate() failed", 2);
-        }
-    }
-    return NULL;
-}
-
-
-/*
- * Return a Python float indicating the system boot time expressed in
- * seconds since the epoch.
- */
-static PyObject*
-get_system_boot_time(PyObject* self, PyObject* args)
-{
-    /* fetch sysctl "kern.boottime" */
-    static int request[2] = { CTL_KERN, KERN_BOOTTIME };
-    struct timeval result;
-    size_t result_len = sizeof result;
-    time_t boot_time = 0;
-
-    if (sysctl(request, 2, &result, &result_len, NULL, 0) == -1) {
-        PyErr_SetFromErrno(0);
-        return NULL;
-    }
-    boot_time = result.tv_sec;
-    return Py_BuildValue("f", (float)boot_time);
-}
-
-
-/*
- * Return a list of tuples including device, mount point and fs type
- * for all partitions mounted on the system.
- */
-static PyObject*
-get_disk_partitions(PyObject* self, PyObject* args)
-{
-    int num;
-    int i;
-    long len;
-    uint64_t flags;
-    char opts[400];
-    struct statfs *fs = NULL;
-    PyObject* py_retlist = PyList_New(0);
-    PyObject* py_tuple = NULL;
-
-    // get the number of mount points
-    Py_BEGIN_ALLOW_THREADS
-    num = getfsstat(NULL, 0, MNT_NOWAIT);
-    Py_END_ALLOW_THREADS
-    if (num == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    len = sizeof(*fs) * num;
-    fs = malloc(len);
-
-    Py_BEGIN_ALLOW_THREADS
-    num = getfsstat(fs, len, MNT_NOWAIT);
-    Py_END_ALLOW_THREADS
-    if (num == -1) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    for (i = 0; i < num; i++) {
-        opts[0] = 0;
-        flags = fs[i].f_flags;
-
-        // see sys/mount.h
-        if (flags & MNT_RDONLY)
-            strlcat(opts, "ro", sizeof(opts));
-        else
-            strlcat(opts, "rw", sizeof(opts));
-        if (flags & MNT_SYNCHRONOUS)
-            strlcat(opts, ",sync", sizeof(opts));
-        if (flags & MNT_NOEXEC)
-            strlcat(opts, ",noexec", sizeof(opts));
-        if (flags & MNT_NOSUID)
-            strlcat(opts, ",nosuid", sizeof(opts));
-        if (flags & MNT_UNION)
-            strlcat(opts, ",union", sizeof(opts));
-        if (flags & MNT_ASYNC)
-            strlcat(opts, ",async", sizeof(opts));
-        if (flags & MNT_EXPORTED)
-            strlcat(opts, ",exported", sizeof(opts));
-        if (flags & MNT_QUARANTINE)
-            strlcat(opts, ",quarantine", sizeof(opts));
-        if (flags & MNT_LOCAL)
-            strlcat(opts, ",local", sizeof(opts));
-        if (flags & MNT_QUOTA)
-            strlcat(opts, ",quota", sizeof(opts));
-        if (flags & MNT_ROOTFS)
-            strlcat(opts, ",rootfs", sizeof(opts));
-        if (flags & MNT_DOVOLFS)
-            strlcat(opts, ",dovolfs", sizeof(opts));
-        if (flags & MNT_DONTBROWSE)
-            strlcat(opts, ",dontbrowse", sizeof(opts));
-        if (flags & MNT_IGNORE_OWNERSHIP)
-            strlcat(opts, ",ignore-ownership", sizeof(opts));
-        if (flags & MNT_AUTOMOUNTED)
-            strlcat(opts, ",automounted", sizeof(opts));
-        if (flags & MNT_JOURNALED)
-            strlcat(opts, ",journaled", sizeof(opts));
-        if (flags & MNT_NOUSERXATTR)
-            strlcat(opts, ",nouserxattr", sizeof(opts));
-        if (flags & MNT_DEFWRITE)
-            strlcat(opts, ",defwrite", sizeof(opts));
-        if (flags & MNT_MULTILABEL)
-            strlcat(opts, ",multilabel", sizeof(opts));
-        if (flags & MNT_NOATIME)
-            strlcat(opts, ",noatime", sizeof(opts));
-        if (flags & MNT_UPDATE)
-            strlcat(opts, ",update", sizeof(opts));
-        if (flags & MNT_RELOAD)
-            strlcat(opts, ",reload", sizeof(opts));
-        if (flags & MNT_FORCE)
-            strlcat(opts, ",force", sizeof(opts));
-        if (flags & MNT_CMDFLAGS)
-            strlcat(opts, ",cmdflags", sizeof(opts));
-
-        py_tuple = Py_BuildValue("(ssss)", fs[i].f_mntfromname,  // device
-                                           fs[i].f_mntonname,    // mount point
-                                           fs[i].f_fstypename,   // fs type
-                                           opts);                // options
-        if (!py_tuple)
-            goto error;
-        if (PyList_Append(py_retlist, py_tuple))
-            goto error;
-        Py_DECREF(py_tuple);
-    }
-
-    free(fs);
-    return py_retlist;
-
-error:
-    Py_XDECREF(py_tuple);
-    Py_DECREF(py_retlist);
-    if (fs != NULL)
-        free(fs);
-    return NULL;
-}
-
-
-/*
- * Return process status as a Python integer.
- */
-static PyObject*
-get_process_status(PyObject* self, PyObject* args)
-{
-    long pid;
-    struct kinfo_proc kp;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    if (get_kinfo_proc(pid, &kp) == -1) {
-        return NULL;
-    }
-    return Py_BuildValue("i", (int)kp.kp_proc.p_stat);
-}
-
-
-/*
- * Return process threads
- */
-static PyObject*
-get_process_threads(PyObject* self, PyObject* args)
-{
-    long pid;
-    int err, j, ret;
-    kern_return_t kr;
-    unsigned int info_count = TASK_BASIC_INFO_COUNT;
-    mach_port_t task;
-    struct task_basic_info tasks_info;
-    thread_act_port_array_t thread_list = NULL;
-    thread_info_data_t thinfo;
-    thread_basic_info_t basic_info_th;
-    mach_msg_type_number_t thread_count, thread_info_count;
-
-    PyObject* retList = PyList_New(0);
-    PyObject* pyTuple = NULL;
-
-    // the argument passed should be a process id
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-
-    // task_for_pid() requires special privileges
-    err = task_for_pid(mach_task_self(), pid, &task);
-    if (err != KERN_SUCCESS) {
-        if (! pid_exists(pid)) {
-            NoSuchProcess();
-        }
-        else {
-            AccessDenied();
-        }
-        goto error;
-    }
-
-    info_count = TASK_BASIC_INFO_COUNT;
-    err = task_info(task, TASK_BASIC_INFO, (task_info_t)&tasks_info, &info_count);
-    if (err != KERN_SUCCESS) {
-        // errcode 4 is "invalid argument" (access denied)
-        if (err == 4) {
-            AccessDenied();
-        }
-        else {
-            // otherwise throw a runtime error with appropriate error code
-            PyErr_Format(PyExc_RuntimeError, "task_info(TASK_BASIC_INFO) failed");
-        }
-        goto error;
-    }
-
-    err = task_threads(task, &thread_list, &thread_count);
-    if (err != KERN_SUCCESS) {
-        PyErr_Format(PyExc_RuntimeError, "task_threads() failed");
-        goto error;
-    }
-
-    for (j = 0; j < thread_count; j++) {
-        pyTuple = NULL;
-        thread_info_count = THREAD_INFO_MAX;
-        kr = thread_info(thread_list[j], THREAD_BASIC_INFO,
-                         (thread_info_t)thinfo, &thread_info_count);
-        if (kr != KERN_SUCCESS) {
-            PyErr_Format(PyExc_RuntimeError, "thread_info() failed");
-            goto error;
-        }
-        basic_info_th = (thread_basic_info_t)thinfo;
-        // XXX - thread_info structure does not provide any process id;
-        // the best we can do is assigning an incremental bogus value
-        pyTuple = Py_BuildValue("Iff", j + 1,
-                    (float)basic_info_th->user_time.microseconds / 1000000.0,
-                    (float)basic_info_th->system_time.microseconds / 1000000.0
-                  );
-        if (!pyTuple)
-            goto error;
-        if (PyList_Append(retList, pyTuple))
-            goto error;
-        Py_DECREF(pyTuple);
-    }
-
-    ret = vm_deallocate(task, (vm_address_t)thread_list,
-                        thread_count * sizeof(int));
-    if (ret != KERN_SUCCESS) {
-        PyErr_WarnEx(PyExc_RuntimeWarning, "vm_deallocate() failed", 2);
-    }
-
-    return retList;
-
-error:
-    Py_XDECREF(pyTuple);
-    Py_DECREF(retList);
-    if (thread_list != NULL) {
-        ret = vm_deallocate(task, (vm_address_t)thread_list,
-                            thread_count * sizeof(int));
-        if (ret != KERN_SUCCESS) {
-            PyErr_WarnEx(PyExc_RuntimeWarning, "vm_deallocate() failed", 2);
-        }
-    }
-    return NULL;
-}
-
-
-/*
- * Return process open files as a Python tuple.
- * References:
- * - lsof source code: http://goo.gl/SYW79 and http://goo.gl/m78fd
- * - /usr/include/sys/proc_info.h
- */
-static PyObject*
-get_process_open_files(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pidinfo_result;
-    int iterations;
-    int i;
-    int nb;
-
-    struct proc_fdinfo *fds_pointer = NULL;
-    struct proc_fdinfo *fdp_pointer;
-    struct vnode_fdinfowithpath vi;
-
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        goto error;
-    }
-
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
-    if (pidinfo_result <= 0) {
-        // may be be ignored later if errno != 0
-        PyErr_Format(PyExc_RuntimeError, "proc_pidinfo(PROC_PIDLISTFDS) failed");
-        goto error;
-    }
-
-    fds_pointer = malloc(pidinfo_result);
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer,
-                                  pidinfo_result);
-    if (pidinfo_result <= 0) {
-        // may be be ignored later if errno != 0
-        PyErr_Format(PyExc_RuntimeError, "proc_pidinfo(PROC_PIDLISTFDS) failed");
-        goto error;
-    }
-
-    iterations = (pidinfo_result / PROC_PIDLISTFD_SIZE);
-
-    for (i = 0; i < iterations; i++) {
-        tuple = NULL;
-        fdp_pointer = &fds_pointer[i];
-
-        if (fdp_pointer->proc_fdtype == PROX_FDTYPE_VNODE)
-        {
-            nb = proc_pidfdinfo(pid,
-                                fdp_pointer->proc_fd,
-                                PROC_PIDFDVNODEPATHINFO,
-                                &vi,
-                                sizeof(vi));
-
-            // --- errors checking
-            if (nb <= 0) {
-                if ((errno == ENOENT) || (errno == EBADF)) {
-                    // no such file or directory or bad file descriptor;
-                    // let's assume the file has been closed or removed
-                    continue;
-                }
-                // may be be ignored later if errno != 0
-                PyErr_Format(PyExc_RuntimeError,
-                            "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed");
-                goto error;
-            }
-            if (nb < sizeof(vi)) {
-                PyErr_Format(PyExc_RuntimeError,
-                 "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed (buffer mismatch)");
-                goto error;
-            }
-            // --- /errors checking
-
-            // --- construct python list
-            tuple = Py_BuildValue("(si)", vi.pvip.vip_path,
-                                          (int)fdp_pointer->proc_fd);
-            if (!tuple)
-                goto error;
-            if (PyList_Append(retList, tuple))
-                goto error;
-            Py_DECREF(tuple);
-            // --- /construct python list
-        }
-    }
-
-    free(fds_pointer);
-    return retList;
-
-error:
-    Py_XDECREF(tuple);
-    Py_DECREF(retList);
-    if (fds_pointer != NULL) {
-        free(fds_pointer);
-    }
-    if (errno != 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    else if (! pid_exists(pid)) {
-        return NoSuchProcess();
-    }
-    else {
-        // exception has already been set earlier
-        return NULL;
-    }
-}
-
-
-/*
- * mathes Linux net/tcp_states.h:
- * http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
- */
-static char *
-get_connection_status(int st) {
-    switch (st) {
-        case TCPS_CLOSED:
-            return "CLOSE";
-        case TCPS_CLOSING:
-            return "CLOSING";
-        case TCPS_CLOSE_WAIT:
-            return "CLOSE_WAIT";
-        case TCPS_LISTEN:
-            return "LISTEN";
-        case TCPS_ESTABLISHED:
-            return "ESTABLISHED";
-        case TCPS_SYN_SENT:
-            return "SYN_SENT";
-        case TCPS_SYN_RECEIVED:
-            return "SYN_RECV";
-        case TCPS_FIN_WAIT_1:
-            return "FIN_WAIT_1";
-        case TCPS_FIN_WAIT_2:
-            return "FIN_WAIT_2";
-        case TCPS_LAST_ACK:
-            return "LAST_ACK";
-        case TCPS_TIME_WAIT:
-            return "TIME_WAIT";
-        default:
-            return "";
-    }
-}
-
-
-/*
- * Return process TCP and UDP connections as a list of tuples.
- * References:
- * - lsof source code: http://goo.gl/SYW79 and http://goo.gl/wNrC0
- * - /usr/include/sys/proc_info.h
- */
-static PyObject*
-get_process_connections(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pidinfo_result;
-    int iterations;
-    int i;
-    int nb;
-
-    struct proc_fdinfo *fds_pointer = NULL;
-    struct proc_fdinfo *fdp_pointer;
-    struct socket_fdinfo si;
-
-    PyObject *retList = PyList_New(0);
-    PyObject *tuple = NULL;
-    PyObject *laddr = NULL;
-    PyObject *raddr = NULL;
-    PyObject *af_filter = NULL;
-    PyObject *type_filter = NULL;
-
-    if (! PyArg_ParseTuple(args, "lOO", &pid, &af_filter, &type_filter)) {
-        goto error;
-    }
-
-    if (!PySequence_Check(af_filter) || !PySequence_Check(type_filter)) {
-        PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence");
-        goto error;
-    }
-
-    if (pid == 0) {
-        return retList;
-    }
-
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    fds_pointer = malloc(pidinfo_result);
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer,
-                                  pidinfo_result);
-
-    if (pidinfo_result <= 0) {
-        goto error;
-    }
-
-    iterations = (pidinfo_result / PROC_PIDLISTFD_SIZE);
-
-    for (i = 0; i < iterations; i++) {
-        tuple = NULL;
-        laddr = NULL;
-        raddr = NULL;
-        errno = 0;
-        fdp_pointer = &fds_pointer[i];
-
-        if (fdp_pointer->proc_fdtype == PROX_FDTYPE_SOCKET)
-        {
-            nb = proc_pidfdinfo(pid, fdp_pointer->proc_fd, PROC_PIDFDSOCKETINFO,
-                                &si, sizeof(si));
-
-            // --- errors checking
-            if (nb <= 0) {
-                if (errno == EBADF) {
-                    // let's assume socket has been closed
-                    continue;
-                }
-                if (errno != 0) {
-                    PyErr_SetFromErrno(PyExc_OSError);
-                }
-                else {
-                    PyErr_Format(PyExc_RuntimeError,
-                                 "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed");
-                }
-                goto error;
-            }
-            if (nb < sizeof(si)) {
-                PyErr_Format(PyExc_RuntimeError,
-                 "proc_pidinfo(PROC_PIDFDVNODEPATHINFO) failed (buffer mismatch)");
-                goto error;
-            }
-            // --- /errors checking
-
-            //
-            int fd, family, type, lport, rport;
-            char lip[200], rip[200];
-            char *state;
-            int inseq;
-            PyObject* _family;
-            PyObject* _type;
-
-            fd = (int)fdp_pointer->proc_fd;
-            family = si.psi.soi_family;
-            type = si.psi.soi_type;
-
-            // apply filters
-            _family = PyLong_FromLong((long)family);
-            inseq = PySequence_Contains(af_filter, _family);
-            Py_DECREF(_family);
-            if (inseq == 0) {
-                continue;
-            }
-            _type = PyLong_FromLong((long)type);
-            inseq = PySequence_Contains(type_filter, _type);
-            Py_DECREF(_type);
-            if (inseq == 0) {
-                continue;
-            }
-
-            if (errno != 0) {
-                PyErr_SetFromErrno(PyExc_OSError);
-                goto error;
-            }
-
-            if ((family == AF_INET) || (family == AF_INET6)) {
-                if (family == AF_INET) {
-                    inet_ntop(AF_INET,
-                              &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_46.i46a_addr4,
-                              lip,
-                              sizeof(lip));
-                    inet_ntop(AF_INET,
-                              &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_46.i46a_addr4,
-                              rip,
-                              sizeof(rip));
-                }
-                else {
-                    inet_ntop(AF_INET6,
-                              &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_6,
-                              lip, sizeof(lip));
-                    inet_ntop(AF_INET6,
-                              &si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_6,
-                              rip, sizeof(rip));
-                }
-
-                // check for inet_ntop failures
-                if (errno != 0) {
-                    PyErr_SetFromErrno(PyExc_OSError);
-                    goto error;
-                }
-
-                lport = ntohs(si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport);
-                rport = ntohs(si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_fport);
-                if (type == SOCK_STREAM) {
-                    state = get_connection_status((int)si.psi.soi_proto.pri_tcp.tcpsi_state);
-                }
-
-                else {
-                    state = "";
-                }
-
-                laddr = Py_BuildValue("(si)", lip, lport);
-                if (!laddr)
-                    goto error;
-                if (rport != 0) {
-                    raddr = Py_BuildValue("(si)", rip, rport);
-                }
-                else {
-                    raddr = Py_BuildValue("()");
-                }
-                if (!raddr)
-                    goto error;
-
-                // construct the python list
-                tuple = Py_BuildValue("(iiiNNs)", fd, family, type, laddr, raddr,
-                                                  state);
-                if (!tuple)
-                    goto error;
-                if (PyList_Append(retList, tuple))
-                    goto error;
-                Py_DECREF(tuple);
-            }
-            else if (family == AF_UNIX) {
-                // construct the python list
-                tuple = Py_BuildValue("(iiisss)",
-                    fd, family, type,
-                    si.psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path,
-                    si.psi.soi_proto.pri_un.unsi_caddr.ua_sun.sun_path,
-                    "");
-                if (!tuple)
-                    goto error;
-                if (PyList_Append(retList, tuple))
-                    goto error;
-                Py_DECREF(tuple);
-            }
-        }
-    }
-
-    free(fds_pointer);
-    return retList;
-
-error:
-    Py_XDECREF(tuple);
-    Py_XDECREF(laddr);
-    Py_XDECREF(raddr);
-    Py_DECREF(retList);
-
-    if (fds_pointer != NULL) {
-        free(fds_pointer);
-    }
-    if (errno != 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    else if (! pid_exists(pid) ) {
-        return NoSuchProcess();
-    }
-    else {
-        return PyErr_Format(PyExc_RuntimeError,
-                            "proc_pidinfo(PROC_PIDLISTFDS) failed");
-    }
-}
-
-
-/*
- * Return number of file descriptors opened by process.
- */
-static PyObject*
-get_process_num_fds(PyObject* self, PyObject* args)
-{
-    long pid;
-    int pidinfo_result;
-    int num;
-    struct proc_fdinfo *fds_pointer;
-
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
-    if (pidinfo_result <= 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-
-    fds_pointer = malloc(pidinfo_result);
-    pidinfo_result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fds_pointer,
-                                  pidinfo_result);
-    if (pidinfo_result <= 0) {
-        free(fds_pointer);
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-
-    num = (pidinfo_result / PROC_PIDLISTFD_SIZE);
-    free(fds_pointer);
-    return Py_BuildValue("i", num);
-}
-
-
-/*
- * Return a Python list of named tuples with overall network I/O information
- */
-static PyObject*
-get_network_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_ifc_info = NULL;
-
-    char *buf = NULL, *lim, *next;
-    struct if_msghdr *ifm;
-    int mib[6];
-    size_t len;
-
-    mib[0] = CTL_NET;          // networking subsystem
-    mib[1] = PF_ROUTE;         // type of information
-    mib[2] = 0;                // protocol (IPPROTO_xxx)
-    mib[3] = 0;                // address family
-    mib[4] = NET_RT_IFLIST2;   // operation
-    mib[5] = 0;
-
-    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    buf = malloc(len);
-
-    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
-        PyErr_SetFromErrno(0);
-        goto error;
-    }
-
-    lim = buf + len;
-
-    for (next = buf; next < lim; ) {
-        ifm = (struct if_msghdr *)next;
-        next += ifm->ifm_msglen;
-
-        if (ifm->ifm_type == RTM_IFINFO2) {
-            py_ifc_info = NULL;
-            struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm;
-            struct sockaddr_dl *sdl = (struct sockaddr_dl *)(if2m + 1);
-            char ifc_name[32];
-
-            strncpy(ifc_name, sdl->sdl_data, sdl->sdl_nlen);
-            ifc_name[sdl->sdl_nlen] = 0;
-
-            py_ifc_info = Py_BuildValue("(KKKKKKKi)",
-                                        if2m->ifm_data.ifi_obytes,
-                                        if2m->ifm_data.ifi_ibytes,
-                                        if2m->ifm_data.ifi_opackets,
-                                        if2m->ifm_data.ifi_ipackets,
-                                        if2m->ifm_data.ifi_ierrors,
-                                        if2m->ifm_data.ifi_oerrors,
-                                        if2m->ifm_data.ifi_iqdrops,
-                                        0);  // dropout not supported
-
-            if (!py_ifc_info)
-                goto error;
-            if (PyDict_SetItemString(py_retdict, ifc_name, py_ifc_info))
-                goto error;
-            Py_DECREF(py_ifc_info);
-        }
-        else {
-            continue;
-        }
-    }
-
-    free(buf);
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_ifc_info);
-    Py_DECREF(py_retdict);
-    if (buf != NULL)
-        free(buf);
-    return NULL;
-}
-
-
-/*
- * Return a Python dict of tuples for disk I/O information
- */
-static PyObject*
-get_disk_io_counters(PyObject* self, PyObject* args)
-{
-    PyObject* py_retdict = PyDict_New();
-    PyObject* py_disk_info = NULL;
-
-    CFDictionaryRef parent_dict;
-    CFDictionaryRef props_dict;
-    CFDictionaryRef stats_dict;
-    io_registry_entry_t parent;
-    io_registry_entry_t disk;
-    io_iterator_t disk_list;
-
-    /* Get list of disks */
-    if (IOServiceGetMatchingServices(kIOMasterPortDefault,
-                                     IOServiceMatching(kIOMediaClass),
-                                     &disk_list) != kIOReturnSuccess) {
-        PyErr_SetString(PyExc_RuntimeError, "Unable to get the list of disks.");
-        goto error;
-    }
-
-    /* Iterate over disks */
-    while ((disk = IOIteratorNext(disk_list)) != 0) {
-        py_disk_info = NULL;
-        parent_dict = NULL;
-        props_dict = NULL;
-        stats_dict = NULL;
-
-        if (IORegistryEntryGetParentEntry(disk, kIOServicePlane, &parent) != kIOReturnSuccess) {
-            PyErr_SetString(PyExc_RuntimeError, "Unable to get the disk's parent.");
-            IOObjectRelease(disk);
-            goto error;
-        }
-
-        if (IOObjectConformsTo(parent, "IOBlockStorageDriver")) {
-            if(IORegistryEntryCreateCFProperties(
-                                     disk,
-                                     (CFMutableDictionaryRef *) &parent_dict,
-                                     kCFAllocatorDefault,
-                                     kNilOptions) != kIOReturnSuccess)
-            {
-                PyErr_SetString(PyExc_RuntimeError,
-                                "Unable to get the parent's properties.");
-                IOObjectRelease(disk);
-                IOObjectRelease(parent);
-                goto error;
-            }
-
-            if (IORegistryEntryCreateCFProperties(parent,
-                                          (CFMutableDictionaryRef *) &props_dict,
-                                          kCFAllocatorDefault,
-                                          kNilOptions) != kIOReturnSuccess)
-            {
-                PyErr_SetString(PyExc_RuntimeError,
-                                "Unable to get the disk properties.");
-                CFRelease(props_dict);
-                IOObjectRelease(disk);
-                IOObjectRelease(parent);
-                goto error;
-            }
-
-            const int kMaxDiskNameSize = 64;
-            CFStringRef disk_name_ref = (CFStringRef)CFDictionaryGetValue(
-                                                    parent_dict,
-                                                    CFSTR(kIOBSDNameKey));
-            char disk_name[kMaxDiskNameSize];
-
-            CFStringGetCString(disk_name_ref,
-                               disk_name,
-                               kMaxDiskNameSize,
-                               CFStringGetSystemEncoding());
-
-            stats_dict = (CFDictionaryRef)CFDictionaryGetValue(
-                                    props_dict,
-                                    CFSTR(kIOBlockStorageDriverStatisticsKey));
-
-            if (stats_dict == NULL) {
-                PyErr_SetString(PyExc_RuntimeError, "Unable to get disk stats.");
-                goto error;
-            }
-
-            CFNumberRef number;
-            int64_t reads, writes, read_bytes, write_bytes, read_time, write_time = 0;
-
-            /* Get disk reads/writes */
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                            stats_dict,
-                            CFSTR(kIOBlockStorageDriverStatisticsReadsKey))))
-            {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &reads);
-            }
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                            stats_dict,
-                            CFSTR(kIOBlockStorageDriverStatisticsWritesKey))))
-            {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &writes);
-            }
-
-            /* Get disk bytes read/written */
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                        stats_dict,
-                        CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey))))
-            {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &read_bytes);
-            }
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                stats_dict,
-                CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey))))
-            {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &write_bytes);
-            }
-
-            /* Get disk time spent reading/writing (nanoseconds) */
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                    stats_dict,
-                    CFSTR(kIOBlockStorageDriverStatisticsTotalReadTimeKey))))
-            {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &read_time);
-            }
-            if ((number = (CFNumberRef)CFDictionaryGetValue(
-                    stats_dict,
-                    CFSTR(kIOBlockStorageDriverStatisticsTotalWriteTimeKey)))) {
-                CFNumberGetValue(number, kCFNumberSInt64Type, &write_time);
-            }
-
-            // Read/Write time on OS X comes back in nanoseconds and in psutil
-            // we've standardized on milliseconds so do the conversion.
-            py_disk_info = Py_BuildValue("(KKKKKK)",
-                                         reads, writes,
-                                         read_bytes, write_bytes,
-                                         read_time / 1000, write_time / 1000);
-            if (!py_disk_info)
-                goto error;
-            if (PyDict_SetItemString(py_retdict, disk_name, py_disk_info))
-                goto error;
-            Py_DECREF(py_disk_info);
-
-            CFRelease(parent_dict);
-            IOObjectRelease(parent);
-            CFRelease(props_dict);
-            IOObjectRelease(disk);
-        }
-    }
-
-    IOObjectRelease (disk_list);
-
-    return py_retdict;
-
-error:
-    Py_XDECREF(py_disk_info);
-    Py_DECREF(py_retdict);
-    return NULL;
-}
-
-
-/*
- * Return currently connected users as a list of tuples.
- */
-static PyObject*
-get_system_users(PyObject* self, PyObject* args)
-{
-    PyObject *ret_list = PyList_New(0);
-    PyObject *tuple = NULL;
-    struct utmpx ut;
-    FILE *fp = NULL;
-
-    fp = fopen(_PATH_UTMPX, "r");
-    if (fp == NULL) {
-        // man fopen says errno is set but it seems it's not (OSX 10.6)
-        PyErr_SetFromErrnoWithFilename(PyExc_OSError, _PATH_UTMPX);
-        goto error;
-    }
-
-    while (fread(&ut, sizeof(ut), 1, fp) == 1) {
-        if (*ut.ut_user == '\0') {
-            continue;
-        }
-#ifdef UTMPX_USER_PROCESS
-        if (ut.ut_type != UTMPX_USER_PROCESS) {
-            continue;
-        }
-#endif
-        tuple = Py_BuildValue("(sssf)",
-            ut.ut_user,              // username
-            ut.ut_line,              // tty
-            ut.ut_host,              // hostname
-            (float)ut.ut_tv.tv_sec   // login time
-        );
-        if (!tuple)
-            goto error;
-        if (PyList_Append(ret_list, tuple))
-            goto error;
-        Py_DECREF(tuple);
-    }
-
-    fclose(fp);
-    return ret_list;
-
-error:
-    Py_XDECREF(tuple);
-    Py_DECREF(ret_list);
-    if (fp != NULL)
-        fclose(fp);
-    return NULL;
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     // --- per-process functions
-
-     {"get_process_name", get_process_name, METH_VARARGS,
-        "Return process name"},
-     {"get_process_cmdline", get_process_cmdline, METH_VARARGS,
-        "Return process cmdline as a list of cmdline arguments"},
-     {"get_process_exe", get_process_exe, METH_VARARGS,
-        "Return path of the process executable"},
-     {"get_process_cwd", get_process_cwd, METH_VARARGS,
-        "Return process current working directory."},
-     {"get_process_ppid", get_process_ppid, METH_VARARGS,
-        "Return process ppid as an integer"},
-     {"get_process_uids", get_process_uids, METH_VARARGS,
-        "Return process real user id as an integer"},
-     {"get_process_gids", get_process_gids, METH_VARARGS,
-        "Return process real group id as an integer"},
-     {"get_process_cpu_times", get_process_cpu_times, METH_VARARGS,
-           "Return tuple of user/kern time for the given PID"},
-     {"get_process_create_time", get_process_create_time, METH_VARARGS,
-         "Return a float indicating the process create time expressed in "
-         "seconds since the epoch"},
-     {"get_process_memory_info", get_process_memory_info, METH_VARARGS,
-         "Return memory information about a process"},
-     {"get_process_num_threads", get_process_num_threads, METH_VARARGS,
-         "Return number of threads used by process"},
-     {"get_process_status", get_process_status, METH_VARARGS,
-         "Return process status as an integer"},
-     {"get_process_threads", get_process_threads, METH_VARARGS,
-         "Return process threads as a list of tuples"},
-     {"get_process_open_files", get_process_open_files, METH_VARARGS,
-         "Return files opened by process as a list of tuples"},
-     {"get_process_num_fds", get_process_num_fds, METH_VARARGS,
-         "Return the number of fds opened by process."},
-     {"get_process_num_ctx_switches", get_process_num_ctx_switches, METH_VARARGS,
-         "Return the number of context switches performed by process"},
-     {"get_process_connections", get_process_connections, METH_VARARGS,
-         "Get process TCP and UDP connections as a list of tuples"},
-     {"get_process_tty_nr", get_process_tty_nr, METH_VARARGS,
-         "Return process tty number as an integer"},
-     {"get_process_memory_maps", get_process_memory_maps, METH_VARARGS,
-         "Return a list of tuples for every process's memory map"},
-
-     // --- system-related functions
-
-     {"get_pid_list", get_pid_list, METH_VARARGS,
-         "Returns a list of PIDs currently running on the system"},
-     {"get_num_cpus", get_num_cpus, METH_VARARGS,
-           "Return number of CPUs on the system"},
-     {"get_virtual_mem", get_virtual_mem, METH_VARARGS,
-         "Return system virtual memory stats"},
-     {"get_swap_mem", get_swap_mem, METH_VARARGS,
-         "Return stats about swap memory, in bytes"},
-     {"get_system_cpu_times", get_system_cpu_times, METH_VARARGS,
-         "Return system cpu times as a tuple (user, system, nice, idle, irc)"},
-     {"get_system_per_cpu_times", get_system_per_cpu_times, METH_VARARGS,
-         "Return system per-cpu times as a list of tuples"},
-     {"get_system_boot_time", get_system_boot_time, METH_VARARGS,
-         "Return a float indicating the system boot time expressed in "
-         "seconds since the epoch"},
-     {"get_disk_partitions", get_disk_partitions, METH_VARARGS,
-         "Return a list of tuples including device, mount point and "
-         "fs type for all partitions mounted on the system."},
-     {"get_network_io_counters", get_network_io_counters, METH_VARARGS,
-         "Return dict of tuples of networks I/O information."},
-     {"get_disk_io_counters", get_disk_io_counters, METH_VARARGS,
-         "Return dict of tuples of disks I/O information."},
-     {"get_system_users", get_system_users, METH_VARARGS,
-        "Return currently connected users as a list of tuples"},
-
-     {NULL, NULL, 0, NULL}
-};
-
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_osx_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_osx_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-
-static struct PyModuleDef
-moduledef = {
-    PyModuleDef_HEAD_INIT,
-    "psutil_osx",
-    NULL,
-    sizeof(struct module_state),
-    PsutilMethods,
-    NULL,
-    psutil_osx_traverse,
-    psutil_osx_clear,
-    NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_osx(void)
-
-#else
-#define INITERROR return
-
-void
-init_psutil_osx(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_osx", PsutilMethods);
-#endif
-    // process status constants, defined in:
-    // http://fxr.watson.org/fxr/source/bsd/sys/proc.h?v=xnu-792.6.70#L149
-    PyModule_AddIntConstant(module, "SIDL", SIDL);
-    PyModule_AddIntConstant(module, "SRUN", SRUN);
-    PyModule_AddIntConstant(module, "SSLEEP", SSLEEP);
-    PyModule_AddIntConstant(module, "SSTOP", SSTOP);
-    PyModule_AddIntConstant(module, "SZOMB", SZOMB);
-
-    if (module == NULL) {
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_osx.h b/contrib/psutil-0.6.1/psutil/_psutil_osx.h
deleted file mode 100644
index 5b6dbb9..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_osx.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * $Id: _psutil_osx.h 1498 2012-07-24 21:41:28Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * OS X platform-specific module methods for _psutil_osx
- */
-
-#include <Python.h>
-
-// --- per-process functions
-static PyObject* get_process_name(PyObject* self, PyObject* args);
-static PyObject* get_process_cmdline(PyObject* self, PyObject* args);
-static PyObject* get_process_cwd(PyObject* self, PyObject* args);
-static PyObject* get_process_exe(PyObject* self, PyObject* args);
-static PyObject* get_process_ppid(PyObject* self, PyObject* args);
-static PyObject* get_process_uids(PyObject* self, PyObject* args);
-static PyObject* get_process_gids(PyObject* self, PyObject* args);
-static PyObject* get_process_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_process_create_time(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_info(PyObject* self, PyObject* args);
-static PyObject* get_process_num_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_status(PyObject* self, PyObject* args);
-static PyObject* get_process_threads(PyObject* self, PyObject* args);
-static PyObject* get_process_open_files(PyObject* self, PyObject* args);
-static PyObject* get_process_connections(PyObject* self, PyObject* args);
-static PyObject* get_process_num_fds(PyObject* self, PyObject* args);
-static PyObject* get_process_tty_nr(PyObject* self, PyObject* args);
-static PyObject* get_process_memory_maps(PyObject* self, PyObject* args);
-
-// --- system-related functions
-static PyObject* get_pid_list(PyObject* self, PyObject* args);
-static PyObject* get_num_cpus(PyObject* self, PyObject* args);
-static PyObject* get_virtual_mem(PyObject* self, PyObject* args);
-static PyObject* get_swap_mem(PyObject* self, PyObject* args);
-static PyObject* get_system_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_system_per_cpu_times(PyObject* self, PyObject* args);
-static PyObject* get_system_boot_time(PyObject* self, PyObject* args);
-static PyObject* get_disk_partitions(PyObject* self, PyObject* args);
-static PyObject* get_network_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_disk_io_counters(PyObject* self, PyObject* args);
-static PyObject* get_system_users(PyObject* self, PyObject* args);
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_posix.c b/contrib/psutil-0.6.1/psutil/_psutil_posix.c
deleted file mode 100644
index c4d55f4..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_posix.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * $Id: _psutil_posix.c 1223 2011-11-09 23:47:55Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Functions specific to all POSIX compliant platforms.
- */
-
-#include <Python.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/resource.h>
-
-#include "_psutil_posix.h"
-
-
-/*
- * Given a PID return process priority as a Python integer.
- */
-static PyObject*
-posix_getpriority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    errno = 0;
-    if (! PyArg_ParseTuple(args, "l", &pid)) {
-        return NULL;
-    }
-    priority = getpriority(PRIO_PROCESS, pid);
-    if (errno != 0) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    return Py_BuildValue("i", priority);
-}
-
-/*
- * Given a PID and a value change process priority.
- */
-static PyObject*
-posix_setpriority(PyObject* self, PyObject* args)
-{
-    long pid;
-    int priority;
-    int retval;
-    if (! PyArg_ParseTuple(args, "li", &pid, &priority)) {
-        return NULL;
-    }
-    retval = setpriority(PRIO_PROCESS, pid, priority);
-    if (retval == -1) {
-        return PyErr_SetFromErrno(PyExc_OSError);
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * define the psutil C module methods and initialize the module.
- */
-static PyMethodDef
-PsutilMethods[] =
-{
-     {"getpriority", posix_getpriority, METH_VARARGS,
-        "Return process priority"},
-     {"setpriority", posix_setpriority, METH_VARARGS,
-        "Set process priority"},
-     {NULL, NULL, 0, NULL}
-};
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-
-static int
-psutil_posix_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int
-psutil_posix_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-static struct PyModuleDef
-moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "psutil_posix",
-        NULL,
-        sizeof(struct module_state),
-        PsutilMethods,
-        NULL,
-        psutil_posix_traverse,
-        psutil_posix_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-PyObject *
-PyInit__psutil_posix(void)
-
-#else
-#define INITERROR return
-
-void init_psutil_posix(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("_psutil_posix", PsutilMethods);
-#endif
-    if (module == NULL) {
-        INITERROR;
-    }
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
-
-
diff --git a/contrib/psutil-0.6.1/psutil/_psutil_posix.h b/contrib/psutil-0.6.1/psutil/_psutil_posix.h
deleted file mode 100644
index b6dd0b4..0000000
--- a/contrib/psutil-0.6.1/psutil/_psutil_posix.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * $Id: _psutil_posix.h 1223 2011-11-09 23:47:55Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * POSIX specific module methods for _psutil_posix
- */
-
-#include <Python.h>
-
-static PyObject* posix_getpriority(PyObject* self, PyObject* args);
-static PyObject* posix_setpriority(PyObject* self, PyObject* args);
diff --git a/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.c b/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.c
deleted file mode 100644
index 22740a1..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * $Id: process_info.c 1462 2012-07-18 03:12:08Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by _psutil_bsd
- * module methods.
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <sys/proc.h>
-#include <signal.h>
-
-#include "process_info.h"
-
-
-/*
- * Returns a list of all BSD processes on the system.  This routine
- * allocates the list and puts it in *procList and a count of the
- * number of entries in *procCount.  You are responsible for freeing
- * this list (use "free" from System framework).
- * On success, the function returns 0.
- * On error, the function returns a BSD errno value.
- */
-int
-get_proc_list(struct kinfo_proc **procList, size_t *procCount)
-{
-    int err;
-    struct kinfo_proc * result;
-    int done;
-    static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PROC, 0 };
-    // Declaring name as const requires us to cast it when passing it to
-    // sysctl because the prototype doesn't include the const modifier.
-    size_t              length;
-
-    assert( procList != NULL);
-    assert(*procList == NULL);
-    assert(procCount != NULL);
-
-    *procCount = 0;
-
-    /*
-     * We start by calling sysctl with result == NULL and length == 0.
-     * That will succeed, and set length to the appropriate length.
-     * We then allocate a buffer of that size and call sysctl again
-     * with that buffer.  If that succeeds, we're done.  If that fails
-     * with ENOMEM, we have to throw away our buffer and loop.  Note
-     * that the loop causes use to call sysctl with NULL again; this
-     * is necessary because the ENOMEM failure case sets length to
-     * the amount of data returned, not the amount of data that
-     * could have been returned.
-     */
-    result = NULL;
-    done = 0;
-    do {
-        assert(result == NULL);
-        // Call sysctl with a NULL buffer.
-        length = 0;
-        err = sysctl((int *)name, (sizeof(name) / sizeof(*name)) - 1,
-                     NULL, &length, NULL, 0);
-        if (err == -1)
-            err = errno;
-
-        // Allocate an appropriately sized buffer based on the results
-        // from the previous call.
-        if (err == 0) {
-            result = malloc(length);
-            if (result == NULL)
-                err = ENOMEM;
-        }
-
-        // Call sysctl again with the new buffer.  If we get an ENOMEM
-        // error, toss away our buffer and start again.
-        if (err == 0) {
-            err = sysctl((int *) name, (sizeof(name) / sizeof(*name)) - 1,
-                          result, &length, NULL, 0);
-            if (err == -1)
-                err = errno;
-            if (err == 0) {
-                done = 1;
-            }
-            else if (err == ENOMEM) {
-                assert(result != NULL);
-                free(result);
-                result = NULL;
-                err = 0;
-            }
-        }
-    } while (err == 0 && ! done);
-
-    // Clean up and establish post conditions.
-    if (err != 0 && result != NULL) {
-        free(result);
-        result = NULL;
-    }
-
-    *procList = result;
-    *procCount = length / sizeof(struct kinfo_proc);
-
-    assert((err == 0) == (*procList != NULL));
-    return err;
-}
-
-
-char
-*getcmdpath(long pid, size_t *pathsize)
-{
-    int  mib[4];
-    char *path;
-    size_t size = 0;
-
-    /*
-     * Make a sysctl() call to get the raw argument space of the process.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PATHNAME;
-    mib[3] = pid;
-
-    // call with a null buffer first to determine if we need a buffer
-    if (sysctl(mib, 4, NULL, &size, NULL, 0) == -1) {
-        return NULL;
-    }
-
-    path = malloc(size);
-    if (path == NULL) {
-        PyErr_SetString(PyExc_MemoryError, "couldn't allocate memory");
-        return NULL;
-    }
-
-    *pathsize = size;
-    if (sysctl(mib, 4, path, &size, NULL, 0) == -1) {
-        free(path);
-        return NULL;       /* Insufficient privileges */
-    }
-
-    return path;
-}
-
-
-/*
- * Borrowed from psi Python System Information project
- *
- * Get command arguments and environment variables.
- *
- * Based on code from ps.
- *
- * Returns:
- *      0 for success;
- *      -1 for failure (Exception raised);
- *      1 for insufficient privileges.
- */
-char
-*getcmdargs(long pid, size_t *argsize)
-{
-    int mib[4];
-    size_t size, argmax;
-    char *procargs = NULL;
-
-    /* Get the maximum process arguments size. */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_ARGMAX;
-
-    size = sizeof(argmax);
-    if (sysctl(mib, 2, &argmax, &size, NULL, 0) == -1)
-        return NULL;
-
-    /* Allocate space for the arguments. */
-    procargs = (char *)malloc(argmax);
-    if (procargs == NULL) {
-        PyErr_SetString(PyExc_MemoryError, "couldn't allocate memory");
-        return NULL;
-    }
-
-    /*
-     * Make a sysctl() call to get the raw argument space of the process.
-     */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_ARGS;
-    mib[3] = pid;
-
-    size = argmax;
-    if (sysctl(mib, 4, procargs, &size, NULL, 0) == -1) {
-        free(procargs);
-        return NULL;       /* Insufficient privileges */
-    }
-
-    // return string and set the length of arguments
-    *argsize = size;
-    return procargs;
-}
-
-
-/* returns the command line as a python list object */
-PyObject*
-get_arg_list(long pid)
-{
-    char *argstr = NULL;
-    int pos = 0;
-    size_t argsize = 0;
-    PyObject *retlist = Py_BuildValue("[]");
-    PyObject *item = NULL;
-
-    if (pid < 0) {
-        return retlist;
-    }
-
-    argstr = getcmdargs(pid, &argsize);
-    if (argstr == NULL) {
-        goto error;
-    }
-
-    // args are returned as a flattened string with \0 separators between
-    // arguments add each string to the list then step forward to the next
-    // separator
-    if (argsize > 0) {
-        while(pos < argsize) {
-            item = Py_BuildValue("s", &argstr[pos]);
-            if (!item)
-                goto error;
-            if (PyList_Append(retlist, item))
-                goto error;
-            Py_DECREF(item);
-            pos = pos + strlen(&argstr[pos]) + 1;
-        }
-    }
-
-    free(argstr);
-    return retlist;
-
-error:
-    Py_XDECREF(item);
-    Py_DECREF(retlist);
-    if (argstr != NULL)
-        free(argstr);
-    return NULL;
-}
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-int
-pid_exists(long pid)
-{
-    int kill_ret;
-    if (pid < 0) {
-        return 0;
-    }
-
-    // if kill returns success of permission denied we know it's a valid PID
-    kill_ret = kill(pid , 0);
-    if ((0 == kill_ret) || (EPERM == errno)) {
-        return 1;
-    }
-
-    // otherwise return 0 for PID not found
-    return 0;
-}
diff --git a/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.h b/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.h
deleted file mode 100644
index 9129153..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/bsd/process_info.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * $Id: process_info.h 1142 2011-10-05 18:45:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by _psutil_bsd
- * module methods.
- */
-
-#include <Python.h>
-
-typedef struct kinfo_proc kinfo_proc;
-
-int get_proc_list(struct kinfo_proc **procList, size_t *procCount);
-char *getcmdargs(long pid, size_t *argsize);
-char *getcmdpath(long pid, size_t *pathsize);
-PyObject* get_arg_list(long pid);
-int pid_exists(long pid);
-
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/ntextapi.h b/contrib/psutil-0.6.1/psutil/arch/mswindows/ntextapi.h
deleted file mode 100644
index f11d1aa..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/ntextapi.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * $Id: ntextapi.h 1452 2012-07-13 19:02:07Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- */
-
-typedef enum _KTHREAD_STATE
-{
-    Initialized,
-    Ready,
-    Running,
-    Standby,
-    Terminated,
-    Waiting,
-    Transition,
-    DeferredReady,
-    GateWait,
-    MaximumThreadState
-} KTHREAD_STATE, *PKTHREAD_STATE;
-
-typedef enum _KWAIT_REASON
-{
-    Executive = 0,
-    FreePage = 1,
-    PageIn = 2,
-    PoolAllocation = 3,
-    DelayExecution = 4,
-    Suspended = 5,
-    UserRequest = 6,
-    WrExecutive = 7,
-    WrFreePage = 8,
-    WrPageIn = 9,
-    WrPoolAllocation = 10,
-    WrDelayExecution = 11,
-    WrSuspended = 12,
-    WrUserRequest = 13,
-    WrEventPair = 14,
-    WrQueue = 15,
-    WrLpcReceive = 16,
-    WrLpcReply = 17,
-    WrVirtualMemory = 18,
-    WrPageOut = 19,
-    WrRendezvous = 20,
-    Spare2 = 21,
-    Spare3 = 22,
-    Spare4 = 23,
-    Spare5 = 24,
-    WrCalloutStack = 25,
-    WrKernel = 26,
-    WrResource = 27,
-    WrPushLock = 28,
-    WrMutex = 29,
-    WrQuantumEnd = 30,
-    WrDispatchInt = 31,
-    WrPreempted = 32,
-    WrYieldExecution = 33,
-    WrFastMutex = 34,
-    WrGuardedMutex = 35,
-    WrRundown = 36,
-    MaximumWaitReason = 37
-} KWAIT_REASON, *PKWAIT_REASON;
-
-
-typedef struct _CLIENT_ID
-{
-    HANDLE UniqueProcess;
-    HANDLE UniqueThread;
-} CLIENT_ID, *PCLIENT_ID;
-
-
-typedef struct _UNICODE_STRING {
-    USHORT Length;
-    USHORT MaximumLength;
-    PWSTR Buffer;
-} UNICODE_STRING, *PUNICODE_STRING;
-
-
-typedef struct _SYSTEM_TIMEOFDAY_INFORMATION
-{
-    LARGE_INTEGER BootTime;
-    LARGE_INTEGER CurrentTime;
-    LARGE_INTEGER TimeZoneBias;
-    ULONG TimeZoneId;
-    ULONG Reserved;
-    ULONGLONG BootTimeBias;
-    ULONGLONG SleepTimeBias;
-} SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
-
-typedef struct _SYSTEM_THREAD_INFORMATION
-{
-    LARGE_INTEGER KernelTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER CreateTime;
-    ULONG WaitTime;
-    PVOID StartAddress;
-    CLIENT_ID ClientId;
-    LONG Priority;
-    LONG BasePriority;
-    ULONG ContextSwitches;
-    ULONG ThreadState;
-    KWAIT_REASON WaitReason;
-} SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
-
-typedef struct _TEB *PTEB;
-
-// private
-typedef struct _SYSTEM_EXTENDED_THREAD_INFORMATION
-{
-    SYSTEM_THREAD_INFORMATION ThreadInfo;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID Win32StartAddress;
-    PTEB TebBase;
-    ULONG_PTR Reserved2;
-    ULONG_PTR Reserved3;
-    ULONG_PTR Reserved4;
-} SYSTEM_EXTENDED_THREAD_INFORMATION, *PSYSTEM_EXTENDED_THREAD_INFORMATION;
-
-typedef struct _SYSTEM_PROCESS_INFORMATION
-{
-    ULONG NextEntryOffset;
-    ULONG NumberOfThreads;
-    LARGE_INTEGER SpareLi1;
-    LARGE_INTEGER SpareLi2;
-    LARGE_INTEGER SpareLi3;
-    LARGE_INTEGER CreateTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER KernelTime;
-    UNICODE_STRING ImageName;
-    LONG BasePriority;
-    HANDLE UniqueProcessId;
-    HANDLE InheritedFromUniqueProcessId;
-    ULONG HandleCount;
-    ULONG SessionId;
-    ULONG_PTR PageDirectoryBase;
-    SIZE_T PeakVirtualSize;
-    SIZE_T VirtualSize;
-    DWORD PageFaultCount;
-    SIZE_T PeakWorkingSetSize;
-    SIZE_T WorkingSetSize;
-    SIZE_T QuotaPeakPagedPoolUsage;
-    SIZE_T QuotaPagedPoolUsage;
-    SIZE_T QuotaPeakNonPagedPoolUsage;
-    SIZE_T QuotaNonPagedPoolUsage;
-    SIZE_T PagefileUsage;
-    SIZE_T PeakPagefileUsage;
-    SIZE_T PrivatePageCount;
-    LARGE_INTEGER ReadOperationCount;
-    LARGE_INTEGER WriteOperationCount;
-    LARGE_INTEGER OtherOperationCount;
-    LARGE_INTEGER ReadTransferCount;
-    LARGE_INTEGER WriteTransferCount;
-    LARGE_INTEGER OtherTransferCount;
-    SYSTEM_THREAD_INFORMATION Threads[1];
-} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
-
-
-// structures and enums from winternl.h (not available under mingw)
-typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
-    LARGE_INTEGER IdleTime;
-    LARGE_INTEGER KernelTime;
-    LARGE_INTEGER UserTime;
-    LARGE_INTEGER Reserved1[2];
-    ULONG Reserved2;
-} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
-
-
-typedef enum _SYSTEM_INFORMATION_CLASS {
-    SystemBasicInformation = 0,
-    SystemPerformanceInformation = 2,
-    SystemTimeOfDayInformation = 3,
-    SystemProcessInformation = 5,
-    SystemProcessorPerformanceInformation = 8,
-    SystemInterruptInformation = 23,
-    SystemExceptionInformation = 33,
-    SystemRegistryQuotaInformation = 37,
-    SystemLookasideInformation = 45
-} SYSTEM_INFORMATION_CLASS;
-
-
-// ================================================
-// get_system_users support ()
-// ================================================
-
-typedef struct _WINSTATION_INFO {
-    BYTE Reserved1[72];
-    ULONG SessionId;
-    BYTE Reserved2[4];
-    FILETIME ConnectTime;
-    FILETIME DisconnectTime;
-    FILETIME LastInputTime;
-    FILETIME LoginTime;
-    BYTE Reserved3[1096];
-    FILETIME CurrentTime;
-} WINSTATION_INFO, *PWINSTATION_INFO;
-
-typedef enum _WINSTATIONINFOCLASS {
-     WinStationInformation = 8
-} WINSTATIONINFOCLASS;
-
-typedef BOOLEAN (WINAPI * PWINSTATIONQUERYINFORMATIONW)
-                 (HANDLE,ULONG,WINSTATIONINFOCLASS,PVOID,ULONG,PULONG);
-
-typedef struct _WINSTATIONINFORMATIONW {
-    BYTE Reserved2[70];
-    ULONG LogonId;
-    BYTE Reserved3[1140];
-} WINSTATIONINFORMATIONW, *PWINSTATIONINFORMATIONW;
-
-// start mingw support:
-// http://www.koders.com/c/fid7C02CAE627C526914CDEB427405B51DF393A5EFA.aspx
-#ifndef _INC_WTSAPI
-typedef struct _WTS_CLIENT_ADDRESS {
-    DWORD AddressFamily;  // AF_INET, AF_IPX, AF_NETBIOS, AF_UNSPEC
-    BYTE  Address[20];    // client network address
-} WTS_CLIENT_ADDRESS, * PWTS_CLIENT_ADDRESS;
-
-HANDLE
-WINAPI
-WTSOpenServerA(
-    IN LPSTR pServerName
-    );
-
-VOID
-WINAPI
-WTSCloseServer(
-    IN HANDLE hServer
-    );
-#endif
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.c b/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.c
deleted file mode 100644
index 71da633..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * $Id: process_handles.c 1463 2012-07-18 13:06:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- */
-
-#ifndef UNICODE
-#define UNICODE
-#endif
-
-#include <Python.h>
-#include <windows.h>
-#include <stdio.h>
-#include "process_handles.h"
-
-#ifndef NT_SUCCESS
-    #define NT_SUCCESS(x) ((x) >= 0)
-#endif
-#define STATUS_INFO_LENGTH_MISMATCH 0xc0000004
-
-#define SystemHandleInformation 16
-#define ObjectBasicInformation 0
-#define ObjectNameInformation 1
-#define ObjectTypeInformation 2
-
-
-typedef LONG NTSTATUS;
-
-typedef struct _UNICODE_STRING {
-  USHORT  Length;
-  USHORT  MaximumLength;
-  PWSTR  Buffer;
-} UNICODE_STRING, *PUNICODE_STRING;
-
-typedef NTSTATUS (NTAPI *_NtQuerySystemInformation)(
-    ULONG SystemInformationClass,
-    PVOID SystemInformation,
-    ULONG SystemInformationLength,
-    PULONG ReturnLength
-    );
-
-typedef NTSTATUS (NTAPI *_NtDuplicateObject)(
-    HANDLE SourceProcessHandle,
-    HANDLE SourceHandle,
-    HANDLE TargetProcessHandle,
-    PHANDLE TargetHandle,
-    ACCESS_MASK DesiredAccess,
-    ULONG Attributes,
-    ULONG Options
-    );
-
-typedef NTSTATUS (NTAPI *_NtQueryObject)(
-    HANDLE ObjectHandle,
-    ULONG ObjectInformationClass,
-    PVOID ObjectInformation,
-    ULONG ObjectInformationLength,
-    PULONG ReturnLength
-    );
-
-typedef struct _SYSTEM_HANDLE
-{
-    ULONG ProcessId;
-    BYTE ObjectTypeNumber;
-    BYTE Flags;
-    USHORT Handle;
-    PVOID Object;
-    ACCESS_MASK GrantedAccess;
-} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
-
-typedef struct _SYSTEM_HANDLE_INFORMATION
-{
-    ULONG HandleCount;
-    SYSTEM_HANDLE Handles[1];
-} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
-
-typedef enum _POOL_TYPE
-{
-    NonPagedPool,
-    PagedPool,
-    NonPagedPoolMustSucceed,
-    DontUseThisType,
-    NonPagedPoolCacheAligned,
-    PagedPoolCacheAligned,
-    NonPagedPoolCacheAlignedMustS
-} POOL_TYPE, *PPOOL_TYPE;
-
-typedef struct _OBJECT_TYPE_INFORMATION
-{
-    UNICODE_STRING Name;
-    ULONG TotalNumberOfObjects;
-    ULONG TotalNumberOfHandles;
-    ULONG TotalPagedPoolUsage;
-    ULONG TotalNonPagedPoolUsage;
-    ULONG TotalNamePoolUsage;
-    ULONG TotalHandleTableUsage;
-    ULONG HighWaterNumberOfObjects;
-    ULONG HighWaterNumberOfHandles;
-    ULONG HighWaterPagedPoolUsage;
-    ULONG HighWaterNonPagedPoolUsage;
-    ULONG HighWaterNamePoolUsage;
-    ULONG HighWaterHandleTableUsage;
-    ULONG InvalidAttributes;
-    GENERIC_MAPPING GenericMapping;
-    ULONG ValidAccess;
-    BOOLEAN SecurityRequired;
-    BOOLEAN MaintainHandleCount;
-    USHORT MaintainTypeList;
-    POOL_TYPE PoolType;
-    ULONG PagedPoolUsage;
-    ULONG NonPagedPoolUsage;
-} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
-
-PVOID GetLibraryProcAddress(PSTR LibraryName, PSTR ProcName)
-{
-    return GetProcAddress(GetModuleHandleA(LibraryName), ProcName);
-}
-
-
-PyObject*
-get_open_files(long pid, HANDLE processHandle)
-{
-    _NtQuerySystemInformation NtQuerySystemInformation =
-        GetLibraryProcAddress("ntdll.dll", "NtQuerySystemInformation");
-    _NtDuplicateObject NtDuplicateObject =
-        GetLibraryProcAddress("ntdll.dll", "NtDuplicateObject");
-    _NtQueryObject NtQueryObject =
-        GetLibraryProcAddress("ntdll.dll", "NtQueryObject");
-
-    NTSTATUS                    status;
-    PSYSTEM_HANDLE_INFORMATION  handleInfo;
-    ULONG                       handleInfoSize = 0x10000;
-
-    ULONG                       i;
-    ULONG                       fileNameLength;
-    PyObject                    *filesList = Py_BuildValue("[]");
-    PyObject                    *arg = NULL;
-    PyObject                    *fileFromWchar = NULL;
-
-
-
-    handleInfo = (PSYSTEM_HANDLE_INFORMATION)malloc(handleInfoSize);
-
-    /* NtQuerySystemInformation won't give us the correct buffer size,
-       so we guess by doubling the buffer size. */
-    while ((status = NtQuerySystemInformation(
-        SystemHandleInformation,
-        handleInfo,
-        handleInfoSize,
-        NULL
-        )) == STATUS_INFO_LENGTH_MISMATCH)
-    {
-        handleInfo = (PSYSTEM_HANDLE_INFORMATION)realloc(handleInfo, handleInfoSize *= 2);
-    }
-
-    /* NtQuerySystemInformation stopped giving us STATUS_INFO_LENGTH_MISMATCH. */
-    if (!NT_SUCCESS(status)) {
-        //printf("NtQuerySystemInformation failed!\n");
-        Py_DECREF(filesList);
-        free(handleInfo);
-        return NULL;
-    }
-
-    for (i = 0; i < handleInfo->HandleCount; i++)
-    {
-        SYSTEM_HANDLE            handle = handleInfo->Handles[i];
-        HANDLE                   dupHandle = NULL;
-        POBJECT_TYPE_INFORMATION objectTypeInfo = NULL;
-        PVOID                    objectNameInfo;
-        UNICODE_STRING           objectName;
-        ULONG                    returnLength;
-        fileFromWchar = NULL;
-        arg = NULL;
-
-        /* Check if this handle belongs to the PID the user specified. */
-        if (handle.ProcessId != pid)
-            continue;
-
-        /* Skip handles with the following access codes as the next call
-           to NtDuplicateObject() or NtQueryObject() might hang forever. */
-        if((handle.GrantedAccess == 0x0012019f)
-        || (handle.GrantedAccess == 0x001a019f)
-        || (handle.GrantedAccess == 0x00120189)
-        || (handle.GrantedAccess == 0x00100000)) {
-            continue;
-        }
-
-        /* Duplicate the handle so we can query it. */
-        if (!NT_SUCCESS(NtDuplicateObject(
-            processHandle,
-            handle.Handle,
-            GetCurrentProcess(),
-            &dupHandle,
-            0,
-            0,
-            0
-            )))
-        {
-            //printf("[%#x] Error!\n", handle.Handle);
-            continue;
-        }
-
-        /* Query the object type. */
-        objectTypeInfo = (POBJECT_TYPE_INFORMATION)malloc(0x1000);
-        if (!NT_SUCCESS(NtQueryObject(
-            dupHandle,
-            ObjectTypeInformation,
-            objectTypeInfo,
-            0x1000,
-            NULL
-            )))
-        {
-            //printf("[%#x] Error!\n", handle.Handle);
-            free(objectTypeInfo);
-            CloseHandle(dupHandle);
-            continue;
-        }
-
-        objectNameInfo = malloc(0x1000);
-        if (!NT_SUCCESS(NtQueryObject(
-            dupHandle,
-            ObjectNameInformation,
-            objectNameInfo,
-            0x1000,
-            &returnLength
-            )))
-        {
-            /* Reallocate the buffer and try again. */
-            objectNameInfo = realloc(objectNameInfo, returnLength);
-            if (!NT_SUCCESS(NtQueryObject(
-                dupHandle,
-                ObjectNameInformation,
-                objectNameInfo,
-                returnLength,
-                NULL
-                )))
-            {
-                /* We have the type name, so just display that.*/
-                /*
-                printf(
-                    "[%#x] %.*S: (could not get name)\n",
-                    handle.Handle,
-                    objectTypeInfo->Name.Length / 2,
-                    objectTypeInfo->Name.Buffer
-                    );
-                */
-                free(objectTypeInfo);
-                free(objectNameInfo);
-                CloseHandle(dupHandle);
-                continue;
-
-            }
-        }
-
-        /* Cast our buffer into an UNICODE_STRING. */
-        objectName = *(PUNICODE_STRING)objectNameInfo;
-
-        /* Print the information! */
-        if (objectName.Length)
-        {
-            /* The object has a name.  Make sure it is a file otherwise
-               ignore it */
-            fileNameLength = objectName.Length / 2;
-            if (wcscmp(objectTypeInfo->Name.Buffer, L"File") == 0) {
-                //printf("%.*S\n", objectName.Length / 2, objectName.Buffer);
-                fileFromWchar = PyUnicode_FromWideChar(objectName.Buffer,
-                                                       fileNameLength);
-                if (fileFromWchar == NULL)
-                    goto error_py_fun;
-                #if PY_MAJOR_VERSION >= 3
-                    arg = Py_BuildValue("N", PyUnicode_AsUTF8String(fileFromWchar));
-                #else
-                    arg = Py_BuildValue("N", PyUnicode_FromObject(fileFromWchar));
-                #endif
-                if (!arg)
-                    goto error_py_fun;
-                Py_XDECREF(fileFromWchar);
-                fileFromWchar = NULL;
-                if (PyList_Append(filesList, arg))
-                    goto error_py_fun;
-                Py_XDECREF(arg);
-            }
-            /*
-            printf(
-                "[%#x] %.*S: %.*S\n",
-                handle.Handle,
-                objectTypeInfo->Name.Length / 2,
-                objectTypeInfo->Name.Buffer,
-                objectName.Length / 2,
-                objectName.Buffer
-                );
-            */
-        }
-        else
-        {
-            /* Print something else. */
-            /*
-            printf(
-                "[%#x] %.*S: (unnamed)\n",
-                handle.Handle,
-                objectTypeInfo->Name.Length / 2,
-                objectTypeInfo->Name.Buffer
-                );
-            */
-            ;;
-        }
-        free(objectTypeInfo);
-        free(objectNameInfo);
-        CloseHandle(dupHandle);
-    }
-    free(handleInfo);
-    CloseHandle(processHandle);
-    return filesList;
-
-error_py_fun:
-    Py_XDECREF(arg);
-    Py_XDECREF(fileFromWchar);
-    Py_DECREF(filesList);
-    return NULL;
-}
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.h b/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.h
deleted file mode 100644
index 3d007b8..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_handles.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * $Id: process_info.h 1060 2011-07-02 18:05:26Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <Python.h>
-#include <windows.h>
-
-PyObject* get_open_files(long pid, HANDLE processHandle);
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.c b/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.c
deleted file mode 100644
index 2ff07dd..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.c
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * $Id: process_info.c 1463 2012-07-18 13:06:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by
- * _psutil_mswindows module methods.
- */
-
-#include <Python.h>
-#include <windows.h>
-#include <Psapi.h>
-#include <tlhelp32.h>
-
-#include "security.h"
-#include "process_info.h"
-#include "ntextapi.h"
-
-/*
- * NtQueryInformationProcess code taken from
- * http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/
- * typedefs needed to compile against ntdll functions not exposted in the API
- */
-typedef LONG NTSTATUS;
-
-typedef NTSTATUS (NTAPI *_NtQueryInformationProcess)(
-    HANDLE ProcessHandle,
-    DWORD ProcessInformationClass,
-    PVOID ProcessInformation,
-    DWORD ProcessInformationLength,
-    PDWORD ReturnLength
-    );
-
-typedef struct _PROCESS_BASIC_INFORMATION
-{
-    PVOID Reserved1;
-    PVOID PebBaseAddress;
-    PVOID Reserved2[2];
-    ULONG_PTR UniqueProcessId;
-    PVOID Reserved3;
-} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
-
-
-/*
- * A wrapper around OpenProcess setting NSP exception if process
- * no longer exists.
- * "pid" is the process pid, "dwDesiredAccess" is the first argument
- * exptected by OpenProcess.
- * Return a process handle or NULL.
- */
-HANDLE
-handle_from_pid_waccess(DWORD pid, DWORD dwDesiredAccess)
-{
-    HANDLE hProcess;
-    DWORD  processExitCode = 0;
-
-    if (pid == 0) {
-        // otherwise we'd get NoSuchProcess
-        return AccessDenied();
-    }
-
-    hProcess = OpenProcess(dwDesiredAccess, FALSE, pid);
-    if (hProcess == NULL) {
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            NoSuchProcess();
-        }
-        else {
-            PyErr_SetFromWindowsErr(0);
-        }
-        return NULL;
-    }
-
-    /* make sure the process is running */
-    GetExitCodeProcess(hProcess, &processExitCode);
-    if (processExitCode == 0) {
-        NoSuchProcess();
-        CloseHandle(hProcess);
-        return NULL;
-    }
-    return hProcess;
-}
-
-
-/*
- * Same as handle_from_pid_waccess but implicitly uses
- * PROCESS_QUERY_INFORMATION | PROCESS_VM_READ as dwDesiredAccess
- * parameter for OpenProcess.
- */
-HANDLE
-handle_from_pid(DWORD pid) {
-    DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
-    return handle_from_pid_waccess(pid, dwDesiredAccess);
-}
-
-
-// fetch the PEB base address from NtQueryInformationProcess()
-PVOID
-GetPebAddress(HANDLE ProcessHandle)
-{
-    _NtQueryInformationProcess NtQueryInformationProcess =
-        (_NtQueryInformationProcess)GetProcAddress(
-        GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
-    PROCESS_BASIC_INFORMATION pbi;
-
-    NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);
-    return pbi.PebBaseAddress;
-}
-
-
-DWORD*
-get_pids(DWORD *numberOfReturnedPIDs) {
-    /* Win32 SDK says the only way to know if our process array
-     * wasn't large enough is to check the returned size and make
-     * sure that it doesn't match the size of the array.
-     * If it does we allocate a larger array and try again */
-
-    // Stores the actual array
-    DWORD *procArray = NULL;
-    DWORD procArrayByteSz;
-    int procArraySz = 0;
-
-    // Stores the byte size of the returned array from enumprocesses
-    DWORD enumReturnSz = 0;
-
-    do {
-        procArraySz += 1024;
-        free(procArray);
-        procArrayByteSz = procArraySz * sizeof(DWORD);
-        procArray = malloc(procArrayByteSz);
-
-        if (! EnumProcesses(procArray, procArrayByteSz, &enumReturnSz)) {
-            free(procArray);
-            PyErr_SetFromWindowsErr(0);
-            return NULL;
-        }
-    } while(enumReturnSz == procArraySz * sizeof(DWORD));
-
-    // The number of elements is the returned size / size of each element
-    *numberOfReturnedPIDs = enumReturnSz / sizeof(DWORD);
-
-    return procArray;
-}
-
-
-int
-pid_is_running(DWORD pid)
-{
-    HANDLE hProcess;
-    DWORD exitCode;
-
-    // Special case for PID 0 System Idle Process
-    if (pid == 0) {
-        return 1;
-    }
-
-    if (pid < 0) {
-        return 0;
-    }
-
-    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
-                           FALSE, pid);
-    if (NULL == hProcess) {
-        // invalid parameter is no such process
-        if (GetLastError() == ERROR_INVALID_PARAMETER) {
-            CloseHandle(hProcess);
-            return 0;
-        }
-
-        // access denied obviously means there's a process to deny access to...
-        if (GetLastError() == ERROR_ACCESS_DENIED) {
-            CloseHandle(hProcess);
-            return 1;
-        }
-
-        CloseHandle(hProcess);
-        PyErr_SetFromWindowsErr(0);
-        return -1;
-    }
-
-    if (GetExitCodeProcess(hProcess, &exitCode)) {
-        CloseHandle(hProcess);
-        return (exitCode == STILL_ACTIVE);
-    }
-
-    // access denied means there's a process there so we'll assume it's running
-    if (GetLastError() == ERROR_ACCESS_DENIED) {
-        CloseHandle(hProcess);
-        return 1;
-    }
-
-    PyErr_SetFromWindowsErr(0);
-    CloseHandle(hProcess);
-    return -1;
-}
-
-
-int
-pid_in_proclist(DWORD pid)
-{
-    DWORD *proclist = NULL;
-    DWORD numberOfReturnedPIDs;
-    DWORD i;
-
-    proclist = get_pids(&numberOfReturnedPIDs);
-    if (NULL == proclist) {
-        return -1;
-    }
-
-    for (i = 0; i < numberOfReturnedPIDs; i++) {
-        if (pid == proclist[i]) {
-            free(proclist);
-            return 1;
-        }
-    }
-
-    free(proclist);
-    return 0;
-}
-
-
-// Check exit code from a process handle. Return FALSE on an error also
-BOOL is_running(HANDLE hProcess)
-{
-    DWORD dwCode;
-
-    if (NULL == hProcess) {
-        return FALSE;
-    }
-
-    if (GetExitCodeProcess(hProcess, &dwCode)) {
-        return (dwCode == STILL_ACTIVE);
-    }
-    return FALSE;
-}
-
-
-// Return None to represent NoSuchProcess, else return NULL for
-// other exception or the name as a Python string
-PyObject*
-get_name(long pid)
-{
-    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-    PROCESSENTRY32 pe = { 0 };
-    pe.dwSize = sizeof(PROCESSENTRY32);
-
-    if( Process32First(h, &pe)) {
-        do {
-            if (pe.th32ProcessID == pid) {
-                CloseHandle(h);
-                return Py_BuildValue("s", pe.szExeFile);
-            }
-        } while(Process32Next(h, &pe));
-
-        // the process was never found, set NoSuchProcess exception
-        NoSuchProcess();
-        CloseHandle(h);
-        return NULL;
-    }
-
-    CloseHandle(h);
-    return PyErr_SetFromWindowsErr(0);
-}
-
-
-/* returns parent pid (as a Python int) for given pid or None on failure */
-PyObject*
-get_ppid(long pid)
-{
-    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-    PROCESSENTRY32 pe = { 0 };
-    pe.dwSize = sizeof(PROCESSENTRY32);
-
-    if( Process32First(h, &pe)) {
-        do {
-            if (pe.th32ProcessID == pid) {
-                CloseHandle(h);
-                return Py_BuildValue("I", pe.th32ParentProcessID);
-            }
-        } while(Process32Next(h, &pe));
-
-        // the process was never found, set NoSuchProcess exception
-        NoSuchProcess();
-        CloseHandle(h);
-        return NULL;
-    }
-
-    CloseHandle(h);
-    return PyErr_SetFromWindowsErr(0);
-}
-
-
-/*
- * returns a Python list representing the arguments for the process
- * with given pid or NULL on error.
- */
-PyObject*
-get_arg_list(long pid)
-{
-    int nArgs, i;
-    LPWSTR *szArglist = NULL;
-    HANDLE hProcess = NULL;
-    PVOID pebAddress;
-    PVOID rtlUserProcParamsAddress;
-    UNICODE_STRING commandLine;
-    WCHAR *commandLineContents = NULL;
-    PyObject *arg = NULL;
-    PyObject *arg_from_wchar = NULL;
-    PyObject *argList = NULL;
-
-    hProcess = handle_from_pid(pid);
-    if(hProcess == NULL) {
-        return NULL;
-    }
-
-    pebAddress = GetPebAddress(hProcess);
-
-    /* get the address of ProcessParameters */
-#ifdef _WIN64
-    if (!ReadProcessMemory(hProcess, (PCHAR)pebAddress + 32,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#else
-    if (!ReadProcessMemory(hProcess, (PCHAR)pebAddress + 0x10,
-        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
-#endif
-    {
-        ////printf("Could not read the address of ProcessParameters!\n");
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    /* read the CommandLine UNICODE_STRING structure */
-#ifdef _WIN64
-    if (!ReadProcessMemory(hProcess, (PCHAR)rtlUserProcParamsAddress + 112,
-        &commandLine, sizeof(commandLine), NULL))
-#else
-    if (!ReadProcessMemory(hProcess, (PCHAR)rtlUserProcParamsAddress + 0x40,
-        &commandLine, sizeof(commandLine), NULL))
-#endif
-    {
-        ////printf("Could not read CommandLine!\n");
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-
-    /* allocate memory to hold the command line */
-    commandLineContents = (WCHAR *)malloc(commandLine.Length+1);
-
-    /* read the command line */
-    if (!ReadProcessMemory(hProcess, commandLine.Buffer,
-        commandLineContents, commandLine.Length, NULL))
-    {
-        ////printf("Could not read the command line string!\n");
-        PyErr_SetFromWindowsErr(0);
-        goto error;
-    }
-
-    /* print the commandline */
-    ////printf("%.*S\n", commandLine.Length / 2, commandLineContents);
-
-    // null-terminate the string to prevent wcslen from returning incorrect length
-    // the length specifier is in characters, but commandLine.Length is in bytes
-    commandLineContents[(commandLine.Length/sizeof(WCHAR))] = '\0';
-
-    // attemempt tp parse the command line using Win32 API, fall back on string
-    // cmdline version otherwise
-    szArglist = CommandLineToArgvW(commandLineContents, &nArgs);
-    if (NULL == szArglist) {
-        // failed to parse arglist
-        // encode as a UTF8 Python string object from WCHAR string
-        arg_from_wchar = PyUnicode_FromWideChar(commandLineContents,
-                                                commandLine.Length / 2);
-        if (arg_from_wchar == NULL)
-            goto error;
-        #if PY_MAJOR_VERSION >= 3
-            argList = Py_BuildValue("N", PyUnicode_AsUTF8String(arg_from_wchar));
-        #else
-            argList = Py_BuildValue("N", PyUnicode_FromObject(arg_from_wchar));
-        #endif
-        if (!argList)
-            goto error;
-    }
-    else {
-        // arglist parsed as array of UNICODE_STRING, so convert each to Python
-        // string object and add to arg list
-        argList = Py_BuildValue("[]");
-        if (!argList)
-            goto error;
-        for(i=0; i<nArgs; i++) {
-            arg_from_wchar = NULL;
-            arg = NULL;
-            ////printf("%d: %.*S (%d characters)\n", i, wcslen(szArglist[i]),
-            //                  szArglist[i], wcslen(szArglist[i]));
-            arg_from_wchar = PyUnicode_FromWideChar(szArglist[i],
-                                                    wcslen(szArglist[i])
-                                                    );
-            if (arg_from_wchar == NULL)
-                goto error;
-            #if PY_MAJOR_VERSION >= 3
-                arg = PyUnicode_FromObject(arg_from_wchar);
-            #else
-                arg = PyUnicode_AsUTF8String(arg_from_wchar);
-            #endif
-            if (arg == NULL)
-                goto error;
-            Py_XDECREF(arg_from_wchar);
-            if (PyList_Append(argList, arg))
-                goto error;
-            Py_XDECREF(arg);
-        }
-    }
-
-    if (szArglist != NULL)
-        LocalFree(szArglist);
-    free(commandLineContents);
-    CloseHandle(hProcess);
-    return argList;
-
-error:
-    Py_XDECREF(arg);
-    Py_XDECREF(arg_from_wchar);
-    Py_XDECREF(argList);
-    if (hProcess != NULL)
-        CloseHandle(hProcess);
-    if (commandLineContents != NULL)
-        free(commandLineContents);
-    if (szArglist != NULL)
-        LocalFree(szArglist);
-    return NULL;
-}
-
-
-#define PH_FIRST_PROCESS(Processes) ((PSYSTEM_PROCESS_INFORMATION)(Processes))
-
-#define PH_NEXT_PROCESS(Process) ( \
-    ((PSYSTEM_PROCESS_INFORMATION)(Process))->NextEntryOffset ? \
-    (PSYSTEM_PROCESS_INFORMATION)((PCHAR)(Process) + \
-    ((PSYSTEM_PROCESS_INFORMATION)(Process))->NextEntryOffset) : \
-    NULL \
-    )
-
-const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004;
-const STATUS_BUFFER_TOO_SMALL = 0xC0000023L;
-
-/*
- * Given a process PID and a PSYSTEM_PROCESS_INFORMATION structure
- * fills the structure with process information.
- * On success return 1, else 0 with Python exception already set.
- */
-int
-get_process_info(DWORD pid, PSYSTEM_PROCESS_INFORMATION *retProcess, PVOID *retBuffer)
-{
-    static ULONG initialBufferSize = 0x4000;
-    NTSTATUS status;
-    PVOID buffer;
-    ULONG bufferSize;
-    PSYSTEM_PROCESS_INFORMATION process;
-
-    // get NtQuerySystemInformation
-    typedef DWORD (_stdcall *NTQSI_PROC) (int, PVOID, ULONG, PULONG);
-    NTQSI_PROC NtQuerySystemInformation;
-    HINSTANCE hNtDll;
-    hNtDll = LoadLibrary(TEXT("ntdll.dll"));
-    NtQuerySystemInformation = (NTQSI_PROC)GetProcAddress(
-                                hNtDll, "NtQuerySystemInformation");
-
-    bufferSize = initialBufferSize;
-    buffer = malloc(bufferSize);
-
-    while (TRUE) {
-        status = NtQuerySystemInformation(SystemProcessInformation, buffer,
-                                          bufferSize, &bufferSize);
-
-        if (status == STATUS_BUFFER_TOO_SMALL || status == STATUS_INFO_LENGTH_MISMATCH)
-        {
-            free(buffer);
-            buffer = malloc(bufferSize);
-        }
-        else {
-            break;
-        }
-    }
-
-    if (status != 0) {
-        PyErr_Format(PyExc_RuntimeError, "NtQuerySystemInformation() failed");
-        FreeLibrary(hNtDll);
-        free(buffer);
-        return 0;
-    }
-
-    if (bufferSize <= 0x20000) {
-        initialBufferSize = bufferSize;
-    }
-
-    process = PH_FIRST_PROCESS(buffer);
-    do {
-        if (process->UniqueProcessId == (HANDLE)pid) {
-            *retProcess = process;
-            *retBuffer = buffer;
-            return 1;
-        }
-    } while ( (process = PH_NEXT_PROCESS(process)) );
-
-    NoSuchProcess();
-    FreeLibrary(hNtDll);
-    free(buffer);
-    return 0;
-}
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.h b/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.h
deleted file mode 100644
index e7a855c..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/process_info.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id: process_info.h 1142 2011-10-05 18:45:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by _psutil_mswindows
- * module methods.
- */
-
-#include <Python.h>
-#include <windows.h>
-
-HANDLE handle_from_pid_waccess(DWORD pid, DWORD dwDesiredAccess);
-HANDLE handle_from_pid(DWORD pid);
-PVOID GetPebAddress(HANDLE ProcessHandle);
-HANDLE handle_from_pid(DWORD pid);
-BOOL is_running(HANDLE hProcess);
-int pid_in_proclist(DWORD pid);
-int pid_is_running(DWORD pid);
-PyObject* get_arg_list(long pid);
-PyObject* get_ppid(long pid);
-PyObject* get_name(long pid);
-DWORD* get_pids(DWORD *numberOfReturnedPIDs);
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/security.c b/contrib/psutil-0.6.1/psutil/arch/mswindows/security.c
deleted file mode 100644
index 7d9f883..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/security.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * $Id: security.c 1296 2012-04-25 01:29:43Z david.daeschler@gmail.com $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Security related functions for Windows platform (Set privileges such as
- * SeDebug), as well as security helper functions.
- */
-
-#include <windows.h>
-#include <Python.h>
-
-/*
- * Convert a process handle to a process token handle.
- */
-HANDLE
-token_from_handle(HANDLE hProcess) {
-    HANDLE hToken = NULL;
-
-    if (! OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) ) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-    return hToken;
-}
-
-
-/*
- * http://www.ddj.com/windows/184405986
- *
- * There's a way to determine whether we're running under the Local System
- * account. However (you guessed it), we have to call more Win32 functions to
- * determine this. Backing up through the code listing, we need to make another
- * call to GetTokenInformation, but instead of passing through the TOKEN_USER
- * constant, we pass through the TOKEN_PRIVILEGES constant. This value returns
- * an array of privileges that the account has in the environment. Iterating
- * through the array, we call the function LookupPrivilegeName looking for the
- * string “SeTcbPrivilege. If the function returns this string, then this
- * account has Local System privileges
- */
-int HasSystemPrivilege(HANDLE hProcess) {
-    DWORD i;
-    DWORD dwSize = 0;
-    DWORD dwRetval = 0;
-    TCHAR privName[256];
-    DWORD dwNameSize = 256;
-    //PTOKEN_PRIVILEGES tp = NULL;
-    BYTE *pBuffer = NULL;
-    TOKEN_PRIVILEGES* tp = NULL;
-    HANDLE hToken = token_from_handle(hProcess);
-
-    if (NULL == hToken) {
-        return -1;
-    }
-
-    // call GetTokenInformation first to get the buffer size
-    if (! GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwSize)) {
-        dwRetval = GetLastError();
-        // if it failed for a reason other than the buffer, bail out
-        if (dwRetval != ERROR_INSUFFICIENT_BUFFER ) {
-            PyErr_SetFromWindowsErr(dwRetval);
-            return 0;
-        }
-    }
-
-    // allocate buffer and call GetTokenInformation again
-    //tp = (PTOKEN_PRIVILEGES) GlobalAlloc(GPTR, dwSize);
-    pBuffer = (BYTE *) malloc(dwSize);
-
-    if (pBuffer == NULL) {
-        PyErr_SetFromWindowsErr(0);
-        free(pBuffer);
-        return -1;
-    }
-
-    if (! GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwSize, &dwSize) ) {
-        PyErr_SetFromWindowsErr(0);
-        free(pBuffer);
-        return -1;
-    }
-
-    // convert the BYTE buffer to a TOKEN_PRIVILEGES struct pointer
-    tp = (TOKEN_PRIVILEGES*)pBuffer;
-
-    // check all the privileges looking for SeTcbPrivilege
-    for(i=0; i < tp->PrivilegeCount; i++) {
-        // reset the buffer contents and the buffer size
-        strcpy(privName, "");
-        dwNameSize = sizeof(privName) / sizeof(TCHAR);
-        if (! LookupPrivilegeName(NULL,
-                &tp->Privileges[i].Luid,
-                (LPTSTR)privName,
-                &dwNameSize)) {
-
-            PyErr_SetFromWindowsErr(0);
-            free(pBuffer);
-            return -1;
-        }
-
-        // if we find the SeTcbPrivilege then it's a LocalSystem process
-        if (! lstrcmpi(privName, TEXT("SeTcbPrivilege"))) {
-            free(pBuffer);
-            return 1;
-        }
-
-    } //for
-
-    free(pBuffer);
-    return 0;
-}
-
-
-BOOL SetPrivilege(HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege)
-{
-    TOKEN_PRIVILEGES tp;
-    LUID luid;
-    TOKEN_PRIVILEGES tpPrevious;
-    DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);
-
-    if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE;
-
-    // first pass.  get current privilege setting
-    tp.PrivilegeCount = 1;
-    tp.Privileges[0].Luid = luid;
-    tp.Privileges[0].Attributes = 0;
-
-    AdjustTokenPrivileges(
-        hToken,
-        FALSE,
-        &tp,
-        sizeof(TOKEN_PRIVILEGES),
-        &tpPrevious,
-        &cbPrevious
-    );
-
-    if (GetLastError() != ERROR_SUCCESS) return FALSE;
-
-    // second pass. set privilege based on previous setting
-    tpPrevious.PrivilegeCount = 1;
-    tpPrevious.Privileges[0].Luid = luid;
-
-    if(bEnablePrivilege) {
-        tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
-    }
-
-    else {
-        tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
-                tpPrevious.Privileges[0].Attributes);
-    }
-
-    AdjustTokenPrivileges(
-        hToken,
-        FALSE,
-        &tpPrevious,
-        cbPrevious,
-        NULL,
-        NULL
-    );
-
-    if (GetLastError() != ERROR_SUCCESS) return FALSE;
-
-    return TRUE;
-}
-
-
-int SetSeDebug()
-{
-    HANDLE hToken;
-    if(! OpenThreadToken(GetCurrentThread(),
-                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                         FALSE,
-                         &hToken)
-                         ){
-        if (GetLastError() == ERROR_NO_TOKEN){
-            if (!ImpersonateSelf(SecurityImpersonation)){
-                CloseHandle(hToken);
-                return 0;
-            }
-            if (!OpenThreadToken(GetCurrentThread(),
-                                 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                                 FALSE,
-                                 &hToken)
-                                 ){
-                RevertToSelf();
-                CloseHandle(hToken);
-                return 0;
-            }
-        }
-    }
-
-    // enable SeDebugPrivilege (open any process)
-    if (! SetPrivilege(hToken, SE_DEBUG_NAME, TRUE)){
-        RevertToSelf();
-        CloseHandle(hToken);
-        return 0;
-    }
-
-    RevertToSelf();
-    CloseHandle(hToken);
-    return 1;
-}
-
-
-int UnsetSeDebug()
-{
-    HANDLE hToken;
-    if(! OpenThreadToken(GetCurrentThread(),
-                        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                        FALSE,
-                        &hToken)
-                        ){
-        if(GetLastError() == ERROR_NO_TOKEN){
-            if(! ImpersonateSelf(SecurityImpersonation)){
-                //Log2File("Error setting impersonation! [UnsetSeDebug()]", L_DEBUG);
-                return 0;
-            }
-
-            if(!OpenThreadToken(GetCurrentThread(),
-                                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                                FALSE,
-                                &hToken)
-                                ){
-                //Log2File("Error Opening Thread Token! [UnsetSeDebug()]", L_DEBUG);
-                return 0;
-            }
-        }
-    }
-
-    //now disable SeDebug
-    if(!SetPrivilege(hToken, SE_DEBUG_NAME, FALSE)){
-        //Log2File("Error unsetting SeDebug Privilege [SetPrivilege()]", L_WARN);
-        return 0;
-    }
-
-    CloseHandle(hToken);
-    return 1;
-}
-
diff --git a/contrib/psutil-0.6.1/psutil/arch/mswindows/security.h b/contrib/psutil-0.6.1/psutil/arch/mswindows/security.h
deleted file mode 100644
index 2cfce29..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/mswindows/security.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * $Id: security.h 1142 2011-10-05 18:45:49Z g.rodola $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Security related functions for Windows platform (Set privileges such as
- * SeDebug), as well as security helper functions.
- */
-
-#include <windows.h>
-
-
-BOOL SetPrivilege(HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege);
-int SetSeDebug();
-int UnsetSeDebug();
-HANDLE token_from_handle(HANDLE hProcess);
-int HasSystemPrivilege(HANDLE hProcess);
-
diff --git a/contrib/psutil-0.6.1/psutil/arch/osx/process_info.c b/contrib/psutil-0.6.1/psutil/arch/osx/process_info.c
deleted file mode 100644
index 323157f..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/osx/process_info.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * $Id: process_info.c 1460 2012-07-18 02:49:24Z g.rodola@gmail.com $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by _psutil_osx
- * module methods.
- */
-
-#include <Python.h>
-#include <assert.h>
-#include <errno.h>
-#include <limits.h>  /* for INT_MAX */
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <sys/sysctl.h>
-#include <libproc.h>
-
-#include "process_info.h"
-#include "../../_psutil_common.h"
-
-
-/*
- * Return 1 if PID exists in the current process list, else 0.
- */
-int
-pid_exists(long pid)
-{
-    int kill_ret;
-
-    // save some time if it's an invalid PID
-    if (pid < 0) {
-        return 0;
-    }
-
-    // if kill returns success of permission denied we know it's a valid PID
-    kill_ret = kill(pid , 0);
-    if ( (0 == kill_ret) || (EPERM == errno) ) {
-        return 1;
-    }
-
-    // otherwise return 0 for PID not found
-    return 0;
-}
-
-
-
-/*
- * Returns a list of all BSD processes on the system.  This routine
- * allocates the list and puts it in *procList and a count of the
- * number of entries in *procCount.  You are responsible for freeing
- * this list (use "free" from System framework).
- * On success, the function returns 0.
- * On error, the function returns a BSD errno value.
- */
-int
-get_proc_list(kinfo_proc **procList, size_t *procCount)
-{
-    /* Declaring mib as const requires use of a cast since the
-     * sysctl prototype doesn't include the const modifier. */
-    static const int mib3[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
-    size_t           size, size2;
-    void            *ptr;
-    int              err, lim = 8;  /* some limit */
-
-    assert( procList != NULL);
-    assert(*procList == NULL);
-    assert(procCount != NULL);
-
-    *procCount = 0;
-
-    /* We start by calling sysctl with ptr == NULL and size == 0.
-     * That will succeed, and set size to the appropriate length.
-     * We then allocate a buffer of at least that size and call
-     * sysctl with that buffer.  If that succeeds, we're done.
-     * If that call fails with ENOMEM, we throw the buffer away
-     * and try again.
-     * Note that the loop calls sysctl with NULL again.  This is
-     * is necessary because the ENOMEM failure case sets size to
-     * the amount of data returned, not the amount of data that
-     * could have been returned.
-     */
-    while (lim-- > 0) {
-        size = 0;
-        if (sysctl((int *)mib3, 3, NULL, &size, NULL, 0) == -1) {
-            return errno;
-        }
-
-        size2 = size + (size >> 3);  /* add some */
-        if (size2 > size) {
-            ptr = malloc(size2);
-            if (ptr == NULL) {
-                ptr = malloc(size);
-            } else {
-                size = size2;
-            }
-        }
-        else {
-            ptr = malloc(size);
-        }
-        if (ptr == NULL) {
-            return ENOMEM;
-        }
-
-        if (sysctl((int *)mib3, 3, ptr, &size, NULL, 0) == -1) {
-            err = errno;
-            free(ptr);
-            if (err != ENOMEM) {
-                return err;
-            }
-
-        } else {
-            *procList = (kinfo_proc *)ptr;
-            *procCount = size / sizeof(kinfo_proc);
-            return 0;
-        }
-    }
-    return ENOMEM;
-}
-
-
-/* Read the maximum argument size for processes */
-int
-get_argmax()
-{
-    int argmax;
-    int mib[] = { CTL_KERN, KERN_ARGMAX };
-    size_t size = sizeof(argmax);
-
-    if (sysctl(mib, 2, &argmax, &size, NULL, 0) == 0) {
-        return argmax;
-    }
-    return 0;
-}
-
-
-/* return process args as a python list */
-PyObject*
-get_arg_list(long pid)
-{
-    int mib[3];
-    int nargs;
-    int len;
-    char *procargs = NULL;
-    char *arg_ptr;
-    char *arg_end;
-    char *curr_arg;
-    size_t argmax;
-    PyObject *arg = NULL;
-    PyObject *arglist = NULL;
-
-    //special case for PID 0 (kernel_task) where cmdline cannot be fetched
-    if (pid == 0) {
-        return Py_BuildValue("[]");
-    }
-
-    /* read argmax and allocate memory for argument space. */
-    argmax = get_argmax();
-    if (! argmax) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-
-    procargs = (char *)malloc(argmax);
-    if (NULL == procargs) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        goto error;
-    }
-
-    /* read argument space */
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROCARGS2;
-    mib[2] = pid;
-    if (sysctl(mib, 3, procargs, &argmax, NULL, 0) < 0) {
-        if (EINVAL == errno) { // invalid == access denied OR nonexistent PID
-            if ( pid_exists(pid) ) {
-                AccessDenied();
-            } else {
-                NoSuchProcess();
-            }
-        }
-        goto error;
-    }
-
-    arg_end = &procargs[argmax];
-    /* copy the number of arguments to nargs */
-    memcpy(&nargs, procargs, sizeof(nargs));
-
-    arg_ptr = procargs + sizeof(nargs);
-    len = strlen(arg_ptr);
-    arg_ptr += len + 1;
-
-    if (arg_ptr == arg_end) {
-        free(procargs);
-        return Py_BuildValue("[]");
-    }
-
-    // skip ahead to the first argument
-    for (; arg_ptr < arg_end; arg_ptr++) {
-        if (*arg_ptr != '\0') {
-            break;
-        }
-    }
-
-    /* iterate through arguments */
-    curr_arg = arg_ptr;
-    arglist = Py_BuildValue("[]");
-    if (!arglist)
-        goto error;
-    while (arg_ptr < arg_end && nargs > 0) {
-        if (*arg_ptr++ == '\0') {
-            arg = Py_BuildValue("s", curr_arg);
-            if (!arg)
-                goto error;
-            if (PyList_Append(arglist, arg))
-                goto error;
-            Py_DECREF(arg);
-            // iterate to next arg and decrement # of args
-            curr_arg = arg_ptr;
-            nargs--;
-        }
-    }
-
-    free(procargs);
-    return arglist;
-
-error:
-    Py_XDECREF(arg);
-    Py_XDECREF(arglist);
-    if (procargs != NULL)
-        free(procargs);
-    return NULL;
-}
-
-
-int
-get_kinfo_proc(pid_t pid, struct kinfo_proc *kp)
-{
-    int mib[4];
-    size_t len;
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID;
-    mib[3] = pid;
-
-    // fetch the info with sysctl()
-    len = sizeof(struct kinfo_proc);
-
-    // now read the data from sysctl
-    if (sysctl(mib, 4, kp, &len, NULL, 0) == -1) {
-        // raise an exception and throw errno as the error
-        PyErr_SetFromErrno(PyExc_OSError);
-        return -1;
-    }
-
-    /*
-     * sysctl succeeds but len is zero, happens when process has gone away
-     */
-    if (len == 0) {
-        NoSuchProcess();
-        return -1;
-    }
-    return 0;
-}
-
-
-/*
- * A thin wrapper around proc_pidinfo()
- */
-int
-psutil_proc_pidinfo(long pid, int flavor, void *pti, int size)
-{
-    int ret = proc_pidinfo((int)pid, flavor, 0, pti, size);
-    if (ret == 0) {
-        if (! pid_exists(pid)) {
-            NoSuchProcess();
-            return 0;
-        }
-        else {
-            AccessDenied();
-            return 0;
-        }
-    }
-    else if (ret != size) {
-        AccessDenied();
-        return 0;
-    }
-    else {
-        return 1;
-    }
-}
diff --git a/contrib/psutil-0.6.1/psutil/arch/osx/process_info.h b/contrib/psutil-0.6.1/psutil/arch/osx/process_info.h
deleted file mode 100644
index 1bb9863..0000000
--- a/contrib/psutil-0.6.1/psutil/arch/osx/process_info.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * $Id: process_info.h 1407 2012-06-30 17:14:54Z g.rodola@gmail.com $
- *
- * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Helper functions related to fetching process information. Used by _psutil_osx
- * module methods.
- */
-
-#include <Python.h>
-
-
-typedef struct kinfo_proc kinfo_proc;
-
-int get_proc_list(kinfo_proc **procList, size_t *procCount);
-int get_kinfo_proc(pid_t pid, struct kinfo_proc *kp);
-int get_argmax(void);
-int pid_exists(long pid);
-int psutil_proc_pidinfo(long pid, int flavor, void *pti, int size);
-PyObject* get_arg_list(long pid);
diff --git a/contrib/psutil-0.6.1/psutil/error.py b/contrib/psutil-0.6.1/psutil/error.py
deleted file mode 100644
index 0298cb9..0000000
--- a/contrib/psutil-0.6.1/psutil/error.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: error.py 1142 2011-10-05 18:45:49Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""psutil exception classes;  do not import this directly"""
-
-
-class Error(Exception):
-    """Base exception class. All other psutil exceptions inherit
-    from this one.
-    """
-
-class NoSuchProcess(Error):
-    """Exception raised when a process with a certain PID doesn't
-    or no longer exists (zombie).
-    """
-
-    def __init__(self, pid, name=None, msg=None):
-        self.pid = pid
-        self.name = name
-        self.msg = msg
-        if msg is None:
-            if name:
-                details = "(pid=%s, name=%s)" % (self.pid, repr(self.name))
-            else:
-                details = "(pid=%s)" % self.pid
-            self.msg = "process no longer exists " + details
-
-    def __str__(self):
-        return self.msg
-
-
-class AccessDenied(Error):
-    """Exception raised when permission to perform an action is denied."""
-
-    def __init__(self, pid=None, name=None, msg=None):
-        self.pid = pid
-        self.name = name
-        self.msg = msg
-        if msg is None:
-            if (pid is not None) and (name is not None):
-                self.msg = "(pid=%s, name=%s)" % (pid, repr(name))
-            elif (pid is not None):
-                self.msg = "(pid=%s)" % self.pid
-            else:
-                self.msg = ""
-
-    def __str__(self):
-        return self.msg
-
-
-class TimeoutExpired(Error):
-    """Raised on Process.wait(timeout) if timeout expires and process
-    is still alive.
-    """
-
-    def __init__(self, pid=None, name=None):
-        self.pid = pid
-        self.name = name
-        if (pid is not None) and (name is not None):
-            self.msg = "(pid=%s, name=%s)" % (pid, repr(name))
-        elif (pid is not None):
-            self.msg = "(pid=%s)" % self.pid
-        else:
-            self.msg = ""
-
-    def __str__(self):
-        return self.msg
-
diff --git a/contrib/psutil-0.6.1/psutil/error.pyc b/contrib/psutil-0.6.1/psutil/error.pyc
deleted file mode 100644
index b9608a2fbb6c9a8c6355099d6f617c9311480779..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2621
zcmcJR-*4PR5XWbIKaw0xOG|VJq)N*}!3XI2f)ElEwa^IhataO-A}^L}@AbB_y;tvs
zq$oVKuRQRl@vrnR;5*~{5sp(^s`e7k&5qYQJ2M~8-rvvn2i5cVD5u4zgYUbz`~!%B
z=mb)cQ8ZOlMD&d4DbcSd5fvRWkyyJcYln*7(%N5HyHxBft-C90kBU7yjtA`PONhBY
z4Yt(gJU8=TU9Iyn^WONcwJw~lUC_3gyC&!`vtAdrF?lGTgdQF}Y#P_BB2ch=$E#k2
zFo*yfhm0sWj`^Pdi6>;<Z2B7Odu6Fzn3+az?#63d!*0Vs<1=ks)$YU9W-O+d6Bl+N
z(zMPhlcs?~OVi2~rzH<}WLUU7O=GCE7XBKBt;gGjV;Rq%Bs}E`E+0YkJ7FJR6L)-?
z&yE_G8}C;Evu6qTV<?vcMv3@e(X)t7Pz5R9NsklJ#Z;d`9Io=+WY(KPpUq6IGd*ve
z=rbE;80Mx4nXUEFkM~gy<Lgh_Ot=Q6(WR>&B5CH_`rvi^yQ>~pGino)vn#F=e}9k5
zKZdwabb;(ZiA2G$BMOGtGSQ=5a)+dF+i6mW0n;rq+!aO9QxF-^@Q*IlS8-of!F@I$
z=8G=9&+A82E8Hc3#_lKnI%GVz#hqLJbIo;vGV)xug>~dVz+f5ue`DiF0%shHU^7I#
zh!`sWPz)0=AxdNBO)T?yo;T$*;Zf3O!88aGg+XFV|6&>zVA<M+G#&D4??RB;lfQkn
zqja>da>jdkNvhdPo4A(!iM#>gyw#Y|m$+`Z^`S}Ak1$(!BsGa84EB~Vp$X?C;Y21(
zZNj*&7Zz<R=A0TXis$9}oqlxfoxls+%bD@}rnaWYF_sTc7Scyh%%xX*L3#^&XDjS?
z@yK@A=ccKw_uO-W(-=)%Q|SzEK`xDm+l}mFEG+XT_>u(w1?81kHegvA(W5<bp9<Io
zD97Mti?<TCqb1lay^sIA{Mf-|(AN`~_t#@RVD}`5Zjjj)a*ywFs0m}TF=buct##!Z
z@)UmqVh!qt>ZaOP2hm$WRiOKVoidScj!`~HZt=3hsOm>It^~IIY%AkV!{PZHr_q{H
zeiL4+AOC^}leP<k#YLMRpJg`0p>;LVcB&UT+AaI_AhlSwYdMO*tH)7V>a4WCEsm$0
zH^tYA+%pWekoz)5!P>tVMgRTmg^Xgt0Nl2WqB;McUYzj3xXI@(Yzd>;wlNNBgU?q$
z^A4Vp9|$d)Zy(Da*x{SSl8=C|c-d9!94xvr=Ol27Rt-;nP9*X!Gr0*ryH1m6+g@Wi
XcfM(V!hFjM%2C<x412?a;d}o8>`Bcn

diff --git a/contrib/psutil-0.6.1/setup.py b/contrib/psutil-0.6.1/setup.py
deleted file mode 100644
index fe8e6ca..0000000
--- a/contrib/psutil-0.6.1/setup.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: setup.py 1469 2012-07-18 16:00:39Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-import os
-try:
-    from setuptools import setup, Extension
-except ImportError:
-    from distutils.core import setup, Extension
-
-
-def get_version():
-    INIT = os.path.abspath(os.path.join(os.path.dirname(__file__),
-                           'psutil', '__init__.py'))
-    f = open(INIT, 'r')
-    try:
-        for line in f:
-            if line.startswith('__version__'):
-                ret = eval(line.strip().split(' = ')[1])
-                assert ret.count('.') == 2, ret
-                for num in ret.split('.'):
-                    assert num.isdigit(), ret
-                return ret
-        else:
-            raise ValueError("couldn't find version string")
-    finally:
-        f.close()
-
-def get_description():
-    README = os.path.abspath(os.path.join(os.path.dirname(__file__), 'README'))
-    f = open(README, 'r')
-    try:
-        return f.read()
-    finally:
-        f.close()
-
-VERSION = get_version()
-
-
-# POSIX
-if os.name == 'posix':
-    posix_extension = Extension('_psutil_posix',
-                                sources = ['psutil/_psutil_posix.c'])
-# Windows
-if sys.platform.startswith("win32"):
-
-    def get_winver():
-        maj, min = sys.getwindowsversion()[0:2]
-        return '0x0%s' % ((maj * 100) + min)
-
-    extensions = [Extension('_psutil_mswindows',
-                            sources=['psutil/_psutil_mswindows.c',
-                                     'psutil/_psutil_common.c',
-                                     'psutil/arch/mswindows/process_info.c',
-                                     'psutil/arch/mswindows/process_handles.c',
-                                     'psutil/arch/mswindows/security.c'],
-                            define_macros=[('_WIN32_WINNT', get_winver()),
-                                           ('_AVAIL_WINVER_', get_winver())],
-                            libraries=["psapi", "kernel32", "advapi32",
-                                       "shell32", "netapi32", "iphlpapi",
-                                       "wtsapi32"],
-                            #extra_compile_args=["/Z7"],
-                            #extra_link_args=["/DEBUG"]
-                            )]
-# OS X
-elif sys.platform.startswith("darwin"):
-    extensions = [Extension('_psutil_osx',
-                            sources = ['psutil/_psutil_osx.c',
-                                       'psutil/_psutil_common.c',
-                                       'psutil/arch/osx/process_info.c'],
-                            extra_link_args=['-framework', 'CoreFoundation',
-                                             '-framework', 'IOKit']
-                            ),
-                  posix_extension]
-# FreeBSD
-elif sys.platform.startswith("freebsd"):
-    extensions = [Extension('_psutil_bsd',
-                            sources = ['psutil/_psutil_bsd.c',
-                                       'psutil/_psutil_common.c',
-                                       'psutil/arch/bsd/process_info.c'],
-                            libraries=["devstat"],
-                            ),
-                  posix_extension]
-# Linux
-elif sys.platform.startswith("linux"):
-    extensions = [Extension('_psutil_linux',
-                            sources=['psutil/_psutil_linux.c'],
-                            ),
-                  posix_extension]
-else:
-    sys.exit('platform %s is not supported' % sys.platform)
-
-
-def main():
-    setup_args = dict(
-        name='psutil',
-        version=VERSION,
-        download_url="http://psutil.googlecode.com/files/psutil-%s.tar.gz" \
-                     % VERSION,
-        description='A process and system utilities module for Python',
-        long_description=get_description(),
-        keywords=['ps', 'top', 'kill', 'free', 'lsof', 'netstat', 'nice',
-                  'tty', 'ionice', 'uptime', 'taskmgr', 'process', 'df',
-                  'iotop', 'iostat', 'ifconfig', 'taskset', 'who', 'pidof',
-                  'pmap', 'smem', 'monitoring',],
-        author='Giampaolo Rodola, Jay Loden',
-        author_email='psutil@googlegroups.com',
-        maintainer='Giampaolo Rodola',
-        maintainer_email='g.rodola <at> gmail <dot> com',
-        url='http://code.google.com/p/psutil/',
-        platforms='Platform Independent',
-        license='License :: OSI Approved :: BSD License',
-        packages=['psutil'],
-        classifiers=[
-              'Development Status :: 5 - Production/Stable',
-              'Environment :: Console',
-              'Operating System :: MacOS :: MacOS X',
-              'Operating System :: Microsoft',
-              'Operating System :: Microsoft :: Windows :: Windows NT/2000',
-              'Operating System :: POSIX',
-              'Operating System :: POSIX :: Linux',
-              'Operating System :: POSIX :: BSD :: FreeBSD',
-              'Operating System :: OS Independent',
-              'Programming Language :: C',
-              'Programming Language :: Python',
-              'Programming Language :: Python :: 2',
-              'Programming Language :: Python :: 2.4',
-              'Programming Language :: Python :: 2.5',
-              'Programming Language :: Python :: 2.6',
-              'Programming Language :: Python :: 2.7',
-              'Programming Language :: Python :: 3',
-              'Programming Language :: Python :: 3.0',
-              'Programming Language :: Python :: 3.1',
-              'Programming Language :: Python :: 3.2',
-              'Topic :: System :: Monitoring',
-              'Topic :: System :: Networking',
-              'Topic :: System :: Networking :: Monitoring',
-              'Topic :: System :: Benchmark',
-              'Topic :: System :: Hardware',
-              'Topic :: System :: Systems Administration',
-              'Topic :: Utilities',
-              'Topic :: Software Development :: Libraries',
-              'Topic :: Software Development :: Libraries :: Python Modules',
-              'Intended Audience :: Developers',
-              'Intended Audience :: System Administrators',
-              'License :: OSI Approved :: BSD License',
-              ],
-        )
-    if extensions is not None:
-        setup_args["ext_modules"] = extensions
-    setup(**setup_args)
-
-if __name__ == '__main__':
-    main()
diff --git a/contrib/psutil-0.6.1/test/_bsd.py b/contrib/psutil-0.6.1/test/_bsd.py
deleted file mode 100644
index 38d4bf0..0000000
--- a/contrib/psutil-0.6.1/test/_bsd.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _bsd.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""BSD specific tests.  These are implicitly run by test_psutil.py."""
-
-import unittest
-import subprocess
-import time
-import re
-import sys
-import os
-
-import psutil
-
-from psutil._compat import PY3
-from test_psutil import DEVNULL
-from test_psutil import (reap_children, get_test_subprocess, sh, which,
-                         skipUnless)
-
-
-PAGESIZE = os.sysconf("SC_PAGE_SIZE")
-TOLERANCE = 200 * 1024  # 200 KB
-MUSE_AVAILABLE = which('muse')
-
-
-def sysctl(cmdline):
-    """Expects a sysctl command with an argument and parse the result
-    returning only the value of interest.
-    """
-    result = sh("sysctl " + cmdline)
-    result = result[result.find(": ") + 2:]
-    try:
-        return int(result)
-    except ValueError:
-        return result
-
-def muse(field):
-    """Thin wrapper around 'muse' cmdline utility."""
-    out = sh('muse', stderr=DEVNULL)
-    for line in out.split('\n'):
-        if line.startswith(field):
-            break
-    else:
-        raise ValueError("line not found")
-    return int(line.split()[1])
-
-
-class BSDSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        self.pid = get_test_subprocess().pid
-
-    def tearDown(self):
-        reap_children()
-
-    def assert_eq_w_tol(self, first, second, tolerance):
-        difference = abs(first - second)
-        if difference <= tolerance:
-            return
-        msg = '%r != %r within %r delta (%r difference)' \
-              % (first, second, tolerance, difference)
-        raise AssertionError(msg)
-
-    def test_BOOT_TIME(self):
-        s = sysctl('sysctl kern.boottime')
-        s = s[s.find(" sec = ") + 7:]
-        s = s[:s.find(',')]
-        btime = int(s)
-        self.assertEqual(btime, psutil.BOOT_TIME)
-
-    def test_process_create_time(self):
-        cmdline = "ps -o lstart -p %s" %self.pid
-        p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0]
-        if PY3:
-            output = str(output, sys.stdout.encoding)
-        start_ps = output.replace('STARTED', '').strip()
-        start_psutil = psutil.Process(self.pid).create_time
-        start_psutil = time.strftime("%a %b %e %H:%M:%S %Y",
-                                     time.localtime(start_psutil))
-        self.assertEqual(start_ps, start_psutil)
-
-    def test_disks(self):
-        # test psutil.disk_usage() and psutil.disk_partitions()
-        # against "df -a"
-        def df(path):
-            out = sh('df -k "%s"' % path).strip()
-            lines = out.split('\n')
-            lines.pop(0)
-            line = lines.pop(0)
-            dev, total, used, free = line.split()[:4]
-            if dev == 'none':
-                dev = ''
-            total = int(total) * 1024
-            used = int(used) * 1024
-            free = int(free) * 1024
-            return dev, total, used, free
-
-        for part in psutil.disk_partitions(all=False):
-            usage = psutil.disk_usage(part.mountpoint)
-            dev, total, used, free = df(part.mountpoint)
-            self.assertEqual(part.device, dev)
-            self.assertEqual(usage.total, total)
-            # 10 MB tollerance
-            if abs(usage.free - free) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % (usage.free, free))
-            if abs(usage.used - used) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % (usage.used, used))
-
-    def test_memory_maps(self):
-        out = sh('procstat -v %s' % self.pid)
-        maps = psutil.Process(self.pid).get_memory_maps(grouped=False)
-        lines = out.split('\n')[1:]
-        while lines:
-            line = lines.pop()
-            fields = line.split()
-            _, start, stop, perms, res = fields[:5]
-            map = maps.pop()
-            self.assertEqual("%s-%s" % (start, stop), map.addr)
-            self.assertEqual(int(res), map.rss)
-            if not map.path.startswith('['):
-                self.assertEqual(fields[10], map.path)
-
-    # --- virtual_memory(); tests against sysctl
-
-    def test_vmem_total(self):
-        syst = sysctl("sysctl vm.stats.vm.v_page_count") * PAGESIZE
-        self.assertEqual(psutil.virtual_memory().total, syst)
-
-    def test_vmem_active(self):
-        syst = sysctl("vm.stats.vm.v_active_count") * PAGESIZE
-        self.assert_eq_w_tol(psutil.virtual_memory().active, syst, TOLERANCE)
-
-    def test_vmem_inactive(self):
-        syst = sysctl("vm.stats.vm.v_inactive_count") * PAGESIZE
-        self.assert_eq_w_tol(psutil.virtual_memory().inactive, syst, TOLERANCE)
-
-    def test_vmem_wired(self):
-        syst = sysctl("vm.stats.vm.v_wire_count") * PAGESIZE
-        self.assert_eq_w_tol(psutil.virtual_memory().wired, syst, TOLERANCE)
-
-    def test_vmem_cached(self):
-        syst = sysctl("vm.stats.vm.v_cache_count") * PAGESIZE
-        self.assert_eq_w_tol(psutil.virtual_memory().cached, syst, TOLERANCE)
-
-    def test_vmem_free(self):
-        syst = sysctl("vm.stats.vm.v_free_count") * PAGESIZE
-        self.assert_eq_w_tol(psutil.virtual_memory().free, syst, TOLERANCE)
-
-    def test_vmem_buffers(self):
-        syst = sysctl("vfs.bufspace")
-        self.assert_eq_w_tol(psutil.virtual_memory().buffers, syst, TOLERANCE)
-
-    # --- virtual_memory(); tests against muse
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_total(self):
-        num = muse('Total')
-        self.assertEqual(psutil.virtual_memory().total, num)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_active(self):
-        num = muse('Active')
-        self.assert_eq_w_tol(psutil.virtual_memory().active, num, TOLERANCE)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_inactive(self):
-        num = muse('Inactive')
-        self.assert_eq_w_tol(psutil.virtual_memory().inactive, num, TOLERANCE)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_wired(self):
-        num = muse('Wired')
-        self.assert_eq_w_tol(psutil.virtual_memory().wired, num, TOLERANCE)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_cached(self):
-        num = muse('Cache')
-        self.assert_eq_w_tol(psutil.virtual_memory().cached, num, TOLERANCE)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_free(self):
-        num = muse('Free')
-        self.assert_eq_w_tol(psutil.virtual_memory().free, num, TOLERANCE)
-
-    @skipUnless(MUSE_AVAILABLE)
-    def test_buffers(self):
-        num = muse('Buffer')
-        self.assert_eq_w_tol(psutil.virtual_memory().buffers, num, TOLERANCE)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(BSDSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
diff --git a/contrib/psutil-0.6.1/test/_linux.py b/contrib/psutil-0.6.1/test/_linux.py
deleted file mode 100644
index 4a5bde2..0000000
--- a/contrib/psutil-0.6.1/test/_linux.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _linux.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Linux specific tests.  These are implicitly run by test_psutil.py."""
-
-from __future__ import division
-import unittest
-import subprocess
-import sys
-import time
-import os
-
-from test_psutil import sh, get_test_subprocess
-from psutil._compat import PY3
-import psutil
-
-
-TOLERANCE = 200 * 1024  # 200 KB
-
-
-class LinuxSpecificTestCase(unittest.TestCase):
-
-    def assert_eq_w_tol(self, first, second, tolerance):
-        difference = abs(first - second)
-        if difference <= tolerance:
-            return
-        msg = '%r != %r within %r delta (%r difference)' \
-              % (first, second, tolerance, difference)
-        raise AssertionError(msg)
-
-    def test_disks(self):
-        # test psutil.disk_usage() and psutil.disk_partitions()
-        # against "df -a"
-        def df(path):
-            out = sh('df -P -B 1 "%s"' % path).strip()
-            lines = out.split('\n')
-            lines.pop(0)
-            line = lines.pop(0)
-            dev, total, used, free = line.split()[:4]
-            if dev == 'none':
-                dev = ''
-            total, used, free = int(total), int(used), int(free)
-            return dev, total, used, free
-
-        for part in psutil.disk_partitions(all=False):
-            usage = psutil.disk_usage(part.mountpoint)
-            dev, total, used, free = df(part.mountpoint)
-            self.assertEqual(part.device, dev)
-            self.assertEqual(usage.total, total)
-            # 10 MB tollerance
-            if abs(usage.free - free) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % (usage.free, free))
-            if abs(usage.used - used) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % (usage.used, used))
-
-    def test_memory_maps(self):
-        sproc = get_test_subprocess()
-        time.sleep(1)
-        p = psutil.Process(sproc.pid)
-        maps = p.get_memory_maps(grouped=False)
-        pmap = sh('pmap -x %s' % p.pid).split('\n')
-        del pmap[0]; del pmap[0]  # get rid of header
-        while maps and pmap:
-            this = maps.pop(0)
-            other = pmap.pop(0)
-            addr, _, rss, dirty, mode, path = other.split(None, 5)
-            if not path.startswith('[') and not path.endswith(']'):
-                self.assertEqual(path, os.path.basename(this.path))
-            self.assertEqual(int(rss) * 1024, this.rss)
-            # test only rwx chars, ignore 's' and 'p'
-            self.assertEqual(mode[:3], this.perms[:3])
-
-    def test_vmem_total(self):
-        lines = sh('free').split('\n')[1:]
-        total = int(lines[0].split()[1]) * 1024
-        self.assertEqual(total, psutil.virtual_memory().total)
-
-    def test_vmem_used(self):
-        lines = sh('free').split('\n')[1:]
-        used = int(lines[0].split()[2]) * 1024
-        self.assert_eq_w_tol(used, psutil.virtual_memory().used, TOLERANCE)
-
-    def test_vmem_free(self):
-        lines = sh('free').split('\n')[1:]
-        free = int(lines[0].split()[3]) * 1024
-        self.assert_eq_w_tol(free, psutil.virtual_memory().free, TOLERANCE)
-
-    def test_vmem_buffers(self):
-        lines = sh('free').split('\n')[1:]
-        buffers = int(lines[0].split()[5]) * 1024
-        self.assert_eq_w_tol(buffers, psutil.virtual_memory().buffers, TOLERANCE)
-
-    def test_vmem_cached(self):
-        lines = sh('free').split('\n')[1:]
-        cached = int(lines[0].split()[6]) * 1024
-        self.assert_eq_w_tol(cached, psutil.virtual_memory().cached, TOLERANCE)
-
-    def test_swapmem_total(self):
-        lines = sh('free').split('\n')[1:]
-        total = int(lines[2].split()[1]) * 1024
-        self.assertEqual(total, psutil.swap_memory().total)
-
-    def test_swapmem_used(self):
-        lines = sh('free').split('\n')[1:]
-        used = int(lines[2].split()[2]) * 1024
-        self.assert_eq_w_tol(used, psutil.swap_memory().used, TOLERANCE)
-
-    def test_swapmem_free(self):
-        lines = sh('free').split('\n')[1:]
-        free = int(lines[2].split()[3]) * 1024
-        self.assert_eq_w_tol(free, psutil.swap_memory().free, TOLERANCE)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(LinuxSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
diff --git a/contrib/psutil-0.6.1/test/_osx.py b/contrib/psutil-0.6.1/test/_osx.py
deleted file mode 100644
index e71b0da..0000000
--- a/contrib/psutil-0.6.1/test/_osx.py
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _osx.py 1498 2012-07-24 21:41:28Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""OSX specific tests.  These are implicitly run by test_psutil.py."""
-
-import unittest
-import subprocess
-import time
-import sys
-import os
-import re
-
-import psutil
-
-from psutil._compat import PY3
-from test_psutil import reap_children, get_test_subprocess, sh
-
-
-PAGESIZE = os.sysconf("SC_PAGE_SIZE")
-TOLERANCE = 200 * 1024  # 200 KB
-
-
-def sysctl(cmdline):
-    """Expects a sysctl command with an argument and parse the result
-    returning only the value of interest.
-    """
-    p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-    result = p.communicate()[0].strip().split()[1]
-    if PY3:
-        result = str(result, sys.stdout.encoding)
-    try:
-        return int(result)
-    except ValueError:
-        return result
-
-def vm_stat(field):
-    """Wrapper around 'vm_stat' cmdline utility."""
-    out = sh('vm_stat')
-    for line in out.split('\n'):
-        if field in line:
-            break
-    else:
-        raise ValueError("line not found")
-    return int(re.search('\d+', line).group(0)) * PAGESIZE
-
-
-class OSXSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        self.pid = get_test_subprocess().pid
-
-    def tearDown(self):
-        reap_children()
-
-    def assert_eq_w_tol(self, first, second, tolerance):
-        difference = abs(first - second)
-        if difference <= tolerance:
-            return
-        msg = '%r != %r within %r delta (%r difference)' \
-              % (first, second, tolerance, difference)
-        raise AssertionError(msg)
-
-    def test_process_create_time(self):
-        cmdline = "ps -o lstart -p %s" %self.pid
-        p = subprocess.Popen(cmdline, shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0]
-        if PY3:
-            output = str(output, sys.stdout.encoding)
-        start_ps = output.replace('STARTED', '').strip()
-        start_psutil = psutil.Process(self.pid).create_time
-        start_psutil = time.strftime("%a %b %e %H:%M:%S %Y",
-                                     time.localtime(start_psutil))
-        self.assertEqual(start_ps, start_psutil)
-
-    def test_disks(self):
-        # test psutil.disk_usage() and psutil.disk_partitions()
-        # against "df -a"
-        def df(path):
-            out = sh('df -k "%s"' % path).strip()
-            lines = out.split('\n')
-            lines.pop(0)
-            line = lines.pop(0)
-            dev, total, used, free = line.split()[:4]
-            if dev == 'none':
-                dev = ''
-            total = int(total) * 1024
-            used = int(used) * 1024
-            free = int(free) * 1024
-            return dev, total, used, free
-
-        for part in psutil.disk_partitions(all=False):
-            usage = psutil.disk_usage(part.mountpoint)
-            dev, total, used, free = df(part.mountpoint)
-            self.assertEqual(part.device, dev)
-            self.assertEqual(usage.total, total)
-            # 10 MB tollerance
-            if abs(usage.free - free) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % usage.free, free)
-            if abs(usage.used - used) > 10 * 1024 * 1024:
-                self.fail("psutil=%s, df=%s" % usage.used, used)
-
-    # --- virtual mem
-
-    def test_vmem_total(self):
-        sysctl_hwphymem = sysctl('sysctl hw.memsize')
-        self.assertEqual(sysctl_hwphymem, psutil.TOTAL_PHYMEM)
-
-    def test_vmem_free(self):
-        num = vm_stat("free")
-        self.assert_eq_w_tol(psutil.virtual_memory().free, num, TOLERANCE)
-
-    def test_vmem_active(self):
-        num = vm_stat("active")
-        self.assert_eq_w_tol(psutil.virtual_memory().active, num, TOLERANCE)
-
-    def test_vmem_inactive(self):
-        num = vm_stat("inactive")
-        self.assert_eq_w_tol(psutil.virtual_memory().inactive, num, TOLERANCE)
-
-    def test_vmem_wired(self):
-        num = vm_stat("wired")
-        self.assert_eq_w_tol(psutil.virtual_memory().wired, num, TOLERANCE)
-
-    # --- swap mem
-
-    def test_swapmem_sin(self):
-        num = vm_stat("Pageins")
-        self.assertEqual(psutil.swap_memory().sin, num)
-
-    def test_swapmem_sout(self):
-        num = vm_stat("Pageouts")
-        self.assertEqual(psutil.swap_memory().sout, num)
-
-    def test_swapmem_total(self):
-        tot1 = psutil.swap_memory().total
-        tot2 = 0
-        # OSX uses multiple cache files:
-        # http://en.wikipedia.org/wiki/Paging#OS_X
-        for name in os.listdir("/var/vm/"):
-            file = os.path.join("/var/vm", name)
-            if os.path.isfile(file):
-                tot2 += os.path.getsize(file)
-        self.assertEqual(tot1, tot2)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(OSXSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
diff --git a/contrib/psutil-0.6.1/test/_posix.py b/contrib/psutil-0.6.1/test/_posix.py
deleted file mode 100755
index d7c3fd1..0000000
--- a/contrib/psutil-0.6.1/test/_posix.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _posix.py 1386 2012-06-27 15:44:36Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""POSIX specific tests.  These are implicitly run by test_psutil.py."""
-
-import unittest
-import subprocess
-import time
-import sys
-import os
-import datetime
-
-import psutil
-
-from psutil._compat import PY3
-from test_psutil import (get_test_subprocess, reap_children, PYTHON, LINUX, OSX,
-                         BSD, ignore_access_denied, sh, skipIf)
-
-
-def ps(cmd):
-    """Expects a ps command with a -o argument and parse the result
-    returning only the value of interest.
-    """
-    if not LINUX:
-        cmd = cmd.replace(" --no-headers ", " ")
-    p = subprocess.Popen(cmd, shell=1, stdout=subprocess.PIPE)
-    output = p.communicate()[0].strip()
-    if PY3:
-        output = str(output, sys.stdout.encoding)
-    if not LINUX:
-        output = output.split('\n')[1]
-    try:
-        return int(output)
-    except ValueError:
-        return output
-
-
-class PosixSpecificTestCase(unittest.TestCase):
-    """Compare psutil results against 'ps' command line utility."""
-
-    # for ps -o arguments see: http://unixhelp.ed.ac.uk/CGI/man-cgi?ps
-
-    def setUp(self):
-        self.pid = get_test_subprocess([PYTHON, "-E", "-O"],
-                                       stdin=subprocess.PIPE).pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_process_parent_pid(self):
-        ppid_ps = ps("ps --no-headers -o ppid -p %s" %self.pid)
-        ppid_psutil = psutil.Process(self.pid).ppid
-        self.assertEqual(ppid_ps, ppid_psutil)
-
-    def test_process_uid(self):
-        uid_ps = ps("ps --no-headers -o uid -p %s" %self.pid)
-        uid_psutil = psutil.Process(self.pid).uids.real
-        self.assertEqual(uid_ps, uid_psutil)
-
-    def test_process_gid(self):
-        gid_ps = ps("ps --no-headers -o rgid -p %s" %self.pid)
-        gid_psutil = psutil.Process(self.pid).gids.real
-        self.assertEqual(gid_ps, gid_psutil)
-
-    def test_process_username(self):
-        username_ps = ps("ps --no-headers -o user -p %s" %self.pid)
-        username_psutil = psutil.Process(self.pid).username
-        self.assertEqual(username_ps, username_psutil)
-
-    @ignore_access_denied
-    def test_process_rss_memory(self):
-        # give python interpreter some time to properly initialize
-        # so that the results are the same
-        time.sleep(0.1)
-        rss_ps = ps("ps --no-headers -o rss -p %s" %self.pid)
-        rss_psutil = psutil.Process(self.pid).get_memory_info()[0] / 1024
-        self.assertEqual(rss_ps, rss_psutil)
-
-    @ignore_access_denied
-    def test_process_vsz_memory(self):
-        # give python interpreter some time to properly initialize
-        # so that the results are the same
-        time.sleep(0.1)
-        vsz_ps = ps("ps --no-headers -o vsz -p %s" %self.pid)
-        vsz_psutil = psutil.Process(self.pid).get_memory_info()[1] / 1024
-        self.assertEqual(vsz_ps, vsz_psutil)
-
-    def test_process_name(self):
-        # use command + arg since "comm" keyword not supported on all platforms
-        name_ps = ps("ps --no-headers -o command -p %s" %self.pid).split(' ')[0]
-        # remove path if there is any, from the command
-        name_ps = os.path.basename(name_ps).lower()
-        name_psutil = psutil.Process(self.pid).name.lower()
-        self.assertEqual(name_ps, name_psutil)
-
-    @skipIf(OSX or BSD)
-    def test_process_create_time(self):
-        time_ps = ps("ps --no-headers -o start -p %s" %self.pid).split(' ')[0]
-        time_psutil = psutil.Process(self.pid).create_time
-        time_psutil = datetime.datetime.fromtimestamp(
-                        time_psutil).strftime("%H:%M:%S")
-        self.assertEqual(time_ps, time_psutil)
-
-    def test_process_exe(self):
-        ps_pathname = ps("ps --no-headers -o command -p %s" %self.pid).split(' ')[0]
-        psutil_pathname = psutil.Process(self.pid).exe
-        try:
-            self.assertEqual(ps_pathname, psutil_pathname)
-        except AssertionError:
-            # certain platforms such as BSD are more accurate returning:
-            # "/usr/local/bin/python2.7"
-            # ...instead of:
-            # "/usr/local/bin/python"
-            # We do not want to consider this difference in accuracy
-            # an error.
-            adjusted_ps_pathname = ps_pathname[:len(ps_pathname)]
-            self.assertEqual(ps_pathname, adjusted_ps_pathname)
-
-    def test_process_cmdline(self):
-        ps_cmdline = ps("ps --no-headers -o command -p %s" %self.pid)
-        psutil_cmdline = " ".join(psutil.Process(self.pid).cmdline)
-        self.assertEqual(ps_cmdline, psutil_cmdline)
-
-    def test_get_pids(self):
-        # Note: this test might fail if the OS is starting/killing
-        # other processes in the meantime
-        p = get_test_subprocess(["ps", "ax", "-o", "pid"], stdout=subprocess.PIPE)
-        output = p.communicate()[0].strip()
-        if PY3:
-            output = str(output, sys.stdout.encoding)
-        output = output.replace('PID', '')
-        p.wait()
-        pids_ps = []
-        for pid in output.split('\n'):
-            if pid:
-                pids_ps.append(int(pid.strip()))
-        # remove ps subprocess pid which is supposed to be dead in meantime
-        pids_ps.remove(p.pid)
-        pids_psutil = psutil.get_pid_list()
-        pids_ps.sort()
-        pids_psutil.sort()
-
-        # on OSX ps doesn't show pid 0
-        if OSX and 0 not in pids_ps:
-            pids_ps.insert(0, 0)
-
-        if pids_ps != pids_psutil:
-            difference = [x for x in pids_psutil if x not in pids_ps] + \
-                         [x for x in pids_ps if x not in pids_psutil]
-            self.fail("difference: " + str(difference))
-
-    def test_nic_names(self):
-        p = subprocess.Popen("ifconfig -a", shell=1, stdout=subprocess.PIPE)
-        output = p.communicate()[0].strip()
-        if PY3:
-            output = str(output, sys.stdout.encoding)
-        for nic in psutil.network_io_counters(pernic=True).keys():
-            for line in output.split():
-                if line.startswith(nic):
-                    break
-            else:
-                self.fail("couldn't find %s nic in 'ifconfig -a' output" % nic)
-
-    def test_get_users(self):
-        out = sh("who")
-        lines = out.split('\n')
-        users = [x.split()[0] for x in lines]
-        self.assertEqual(len(users), len(psutil.get_users()))
-        terminals = [x.split()[1] for x in lines]
-        for u in psutil.get_users():
-            self.assertTrue(u.name in users, u.name)
-            self.assertTrue(u.terminal in terminals, u.terminal)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(PosixSpecificTestCase))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
diff --git a/contrib/psutil-0.6.1/test/_windows.py b/contrib/psutil-0.6.1/test/_windows.py
deleted file mode 100644
index b5093aa..0000000
--- a/contrib/psutil-0.6.1/test/_windows.py
+++ /dev/null
@@ -1,368 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: _windows.py 1453 2012-07-13 19:55:11Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Windows specific tests.  These are implicitly run by test_psutil.py."""
-
-import os
-import unittest
-import platform
-import signal
-import time
-import warnings
-import atexit
-import sys
-import subprocess
-import errno
-import traceback
-
-import psutil
-import _psutil_mswindows
-from psutil._compat import PY3, callable, long
-from test_psutil import reap_children, get_test_subprocess, wait_for_pid, warn
-try:
-    import wmi
-except ImportError:
-    err = sys.exc_info()[1]
-    atexit.register(warn, "Couldn't run wmi tests: %s" % str(err))
-    wmi = None
-try:
-    import win32api
-    import win32con
-except ImportError:
-    err = sys.exc_info()[1]
-    atexit.register(warn, "Couldn't run pywin32 tests: %s" % str(err))
-    win32api = None
-
-
-
-class WindowsSpecificTestCase(unittest.TestCase):
-
-    def setUp(self):
-        sproc = get_test_subprocess()
-        wait_for_pid(sproc.pid)
-        self.pid = sproc.pid
-
-    def tearDown(self):
-        reap_children()
-
-    def test_issue_24(self):
-        p = psutil.Process(0)
-        self.assertRaises(psutil.AccessDenied, p.kill)
-
-    def test_special_pid(self):
-        p = psutil.Process(4)
-        self.assertEqual(p.name, 'System')
-        # use __str__ to access all common Process properties to check
-        # that nothing strange happens
-        str(p)
-        p.username
-        self.assertTrue(p.create_time >= 0.0)
-        try:
-            rss, vms = p.get_memory_info()
-        except psutil.AccessDenied:
-            # expected on Windows Vista and Windows 7
-            if not platform.uname()[1] in ('vista', 'win-7', 'win7'):
-                raise
-        else:
-            self.assertTrue(rss > 0)
-
-    def test_signal(self):
-        p = psutil.Process(self.pid)
-        self.assertRaises(ValueError, p.send_signal, signal.SIGINT)
-
-    def test_nic_names(self):
-        p = subprocess.Popen(['ipconfig', '/all'], stdout=subprocess.PIPE)
-        out = p.communicate()[0]
-        if PY3:
-            out = str(out, sys.stdout.encoding)
-        nics = psutil.network_io_counters(pernic=True).keys()
-        for nic in nics:
-            if "pseudo-interface" in nic.replace(' ', '-').lower():
-                continue
-            if nic not in out:
-                self.fail("%r nic wasn't found in 'ipconfig /all' output" % nic)
-
-    def test_exe(self):
-        for p in psutil.process_iter():
-            try:
-                self.assertEqual(os.path.basename(p.exe), p.name)
-            except psutil.Error:
-                pass
-
-    if wmi is not None:
-
-        # --- Process class tests
-
-        def test_process_name(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            self.assertEqual(p.name, w.Caption)
-
-        def test_process_exe(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            self.assertEqual(p.exe, w.ExecutablePath)
-
-        def test_process_cmdline(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            self.assertEqual(' '.join(p.cmdline), w.CommandLine.replace('"', ''))
-
-        def test_process_username(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            domain, _, username = w.GetOwner()
-            username = "%s\\%s" %(domain, username)
-            self.assertEqual(p.username, username)
-
-        def test_process_rss_memory(self):
-            time.sleep(0.1)
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            rss = p.get_memory_info().rss
-            self.assertEqual(rss, int(w.WorkingSetSize))
-
-        def test_process_vms_memory(self):
-            time.sleep(0.1)
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            vms = p.get_memory_info().vms
-            # http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx
-            # ...claims that PageFileUsage is represented in Kilo
-            # bytes but funnily enough on certain platforms bytes are
-            # returned instead.
-            wmi_usage = int(w.PageFileUsage)
-            if (vms != wmi_usage) and (vms != wmi_usage * 1024):
-                self.fail("wmi=%s, psutil=%s" % (wmi_usage, vms))
-
-        def test_process_create_time(self):
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(self.pid)
-            wmic_create = str(w.CreationDate.split('.')[0])
-            psutil_create = time.strftime("%Y%m%d%H%M%S",
-                                          time.localtime(p.create_time))
-            self.assertEqual(wmic_create, psutil_create)
-
-
-        # --- psutil namespace functions and constants tests
-
-        def test_NUM_CPUS(self):
-            num_cpus = int(os.environ['NUMBER_OF_PROCESSORS'])
-            self.assertEqual(num_cpus, psutil.NUM_CPUS)
-
-        def test_TOTAL_PHYMEM(self):
-            w = wmi.WMI().Win32_ComputerSystem()[0]
-            self.assertEqual(int(w.TotalPhysicalMemory), psutil.TOTAL_PHYMEM)
-
-        def test__UPTIME(self):
-            # _UPTIME constant is not public but it is used internally
-            # as value to return for pid 0 creation time.
-            # WMI behaves the same.
-            w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0]
-            p = psutil.Process(0)
-            wmic_create = str(w.CreationDate.split('.')[0])
-            psutil_create = time.strftime("%Y%m%d%H%M%S",
-                                          time.localtime(p.create_time))
-            # XXX - ? no actual test here
-
-        def test_get_pids(self):
-            # Note: this test might fail if the OS is starting/killing
-            # other processes in the meantime
-            w = wmi.WMI().Win32_Process()
-            wmi_pids = [x.ProcessId for x in w]
-            wmi_pids.sort()
-            psutil_pids = psutil.get_pid_list()
-            psutil_pids.sort()
-            if wmi_pids != psutil_pids:
-                difference = filter(lambda x:x not in wmi_pids, psutil_pids) + \
-                             filter(lambda x:x not in psutil_pids, wmi_pids)
-                self.fail("difference: " + str(difference))
-
-        def test_disks(self):
-            ps_parts = psutil.disk_partitions(all=True)
-            wmi_parts = wmi.WMI().Win32_LogicalDisk()
-            for ps_part in ps_parts:
-                for wmi_part in wmi_parts:
-                    if ps_part.device.replace('\\', '') == wmi_part.DeviceID:
-                        if not ps_part.mountpoint:
-                            # this is usually a CD-ROM with no disk inserted
-                            break
-                        try:
-                            usage = psutil.disk_usage(ps_part.mountpoint)
-                        except OSError:
-                            err = sys.exc_info()[1]
-                            if err.errno == errno.ENOENT:
-                                # usually this is the floppy
-                                break
-                            else:
-                                raise
-                        self.assertEqual(usage.total, int(wmi_part.Size))
-                        wmi_free = int(wmi_part.FreeSpace)
-                        self.assertEqual(usage.free, wmi_free)
-                        # 10 MB tollerance
-                        if abs(usage.free - wmi_free) > 10 * 1024 * 1024:
-                            self.fail("psutil=%s, wmi=%s" % usage.free, wmi_free)
-                        break
-                else:
-                    self.fail("can't find partition %s" % repr(ps_part))
-
-    if win32api is not None:
-
-        def test_get_num_handles(self):
-            p = psutil.Process(os.getpid())
-            before = p.get_num_handles()
-            handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION,
-                                          win32con.FALSE, os.getpid())
-            after = p.get_num_handles()
-            self.assertEqual(after, before+1)
-            win32api.CloseHandle(handle)
-            self.assertEqual(p.get_num_handles(), before)
-
-        def test_get_num_handles_2(self):
-            # Note: this fails from time to time; I'm keen on thinking
-            # it doesn't mean something is broken
-            def call(p, attr):
-                attr = getattr(p, name, None)
-                if attr is not None and callable(attr):
-                    ret = attr()
-                else:
-                    ret = attr
-
-            p = psutil.Process(self.pid)
-            attrs = []
-            failures = []
-            for name in dir(psutil.Process):
-                if name.startswith('_') \
-                or name.startswith('set_') \
-                or name in ('terminate', 'kill', 'suspend', 'resume', 'nice',
-                            'send_signal', 'wait', 'get_children', 'as_dict'):
-                    continue
-                else:
-                    try:
-                        call(p, name)
-                        num1 = p.get_num_handles()
-                        call(p, name)
-                        num2 = p.get_num_handles()
-                    except (psutil.NoSuchProcess, psutil.AccessDenied):
-                        pass
-                    else:
-                        if num2 > num1:
-                            fail = "failure while processing Process.%s method " \
-                                   "(before=%s, after=%s)" % (name, num1, num2)
-                            failures.append(fail)
-            if failures:
-                self.fail('\n' + '\n'.join(failures))
-
-
-import _psutil_mswindows
-from psutil._psmswindows import ACCESS_DENIED_SET
-
-def wrap_exceptions(callable):
-    def wrapper(self, *args, **kwargs):
-        try:
-            return callable(self, *args, **kwargs)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.errno in ACCESS_DENIED_SET:
-                raise psutil.AccessDenied(None, None)
-            if err.errno == errno.ESRCH:
-                raise psutil.NoSuchProcess(None, None)
-            raise
-    return wrapper
-
-class TestDualProcessImplementation(unittest.TestCase):
-    fun_names = [
-        # function name                 tolerance
-        ('get_process_cpu_times',       0.2),
-        ('get_process_create_time',     0.5),
-        ('get_process_num_handles',     1),  # 1 because impl #1 opens a handle
-        ('get_process_io_counters',     0),
-        ('get_process_memory_info',     1024),  # KB
-    ]
-
-    def test_compare_values(self):
-        # Certain APIs on Windows have 2 internal implementations, one
-        # based on documented Windows APIs, another one based
-        # NtQuerySystemInformation() which gets called as fallback in
-        # case the first fails because of limited permission error.
-        # Here we test that the two methods return the exact same value,
-        # see:
-        # http://code.google.com/p/psutil/issues/detail?id=304
-        def assert_ge_0(obj):
-            if isinstance(obj, tuple):
-                for value in obj:
-                    assert value >= 0, value
-            elif isinstance(obj, (int, long, float)):
-                assert obj >= 0, obj
-            else:
-                assert 0  # case not handled which needs to be fixed
-
-        def compare_with_tolerance(ret1, ret2, tolerance):
-            if ret1 == ret2:
-                return
-            else:
-                if isinstance(ret2, (int, long, float)):
-                    diff = abs(ret1 - ret2)
-                    assert diff <= tolerance, diff
-                elif isinstance(ret2, tuple):
-                    for a, b in zip(ret1, ret2):
-                        diff = abs(a - b)
-                        assert diff <= tolerance, diff
-
-        failures = []
-        for name, tolerance in self.fun_names:
-            meth1 = wrap_exceptions(getattr(_psutil_mswindows, name))
-            meth2 = wrap_exceptions(getattr(_psutil_mswindows, name + '_2'))
-            for p in psutil.process_iter():
-                #
-                try:
-                    ret1 = meth1(p.pid)
-                except psutil.NoSuchProcess:
-                    continue
-                except psutil.AccessDenied:
-                    ret1 = None
-                #
-                try:
-                    ret2 = meth2(p.pid)
-                except psutil.NoSuchProcess:
-                    # this is supposed to fail only in case of zombie process
-                    # never for permission error
-                    continue
-
-                # compare values
-                try:
-                    if ret1 is None:
-                        assert_ge_0(ret2)
-                    else:
-                        compare_with_tolerance(ret1, ret2, tolerance)
-                        assert_ge_0(ret1)
-                        assert_ge_0(ret2)
-                except AssertionError:
-                    err = sys.exc_info()[1]
-                    trace = traceback.format_exc()
-                    msg = '%s\npid=%s, method=%r, ret_1=%r, ret_2=%r' \
-                           % (trace, p.pid, name, ret1, ret2)
-                    failures.append(msg)
-                    break
-        if failures:
-            self.fail('\n\n'.join(failures))
-
-    def test_zombies(self):
-        # test that NPS is raised by the 2nd implementation in case a
-        # process no longer exists
-        ZOMBIE_PID = max(psutil.get_pid_list()) + 5000
-        for name, _ in self.fun_names:
-            meth = wrap_exceptions(getattr(_psutil_mswindows, name))
-            self.assertRaises(psutil.NoSuchProcess, meth, ZOMBIE_PID)
-
-
-if __name__ == '__main__':
-    test_suite = unittest.TestSuite()
-    test_suite.addTest(unittest.makeSuite(WindowsSpecificTestCase))
-    test_suite.addTest(unittest.makeSuite(TestDualProcessImplementation))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
diff --git a/contrib/psutil-0.6.1/test/test_memory_leaks.py b/contrib/psutil-0.6.1/test/test_memory_leaks.py
deleted file mode 100644
index 6983105..0000000
--- a/contrib/psutil-0.6.1/test/test_memory_leaks.py
+++ /dev/null
@@ -1,325 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: test_memory_leaks.py 1499 2012-07-25 12:42:31Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A test script which attempts to detect memory leaks by calling C
-functions many times and compare process memory usage before and
-after the calls.  It might produce false positives.
-"""
-
-import os
-import gc
-import unittest
-import time
-import socket
-import threading
-import types
-
-import psutil
-import psutil._common
-from psutil._compat import PY3, callable, xrange
-from test_psutil import POSIX, LINUX, WINDOWS, OSX, BSD, TESTFN
-from test_psutil import (reap_children, skipUnless, skipIf, supports_ipv6,
-                         safe_remove, get_test_subprocess)
-
-# disable cache for Process class properties
-psutil._common.cached_property.enabled = False
-
-LOOPS = 1000
-TOLERANCE = 4096
-
-
-class Base(unittest.TestCase):
-
-    proc = psutil.Process(os.getpid())
-
-    def execute(self, function, *args, **kwargs):
-        def call_many_times():
-            for x in xrange(LOOPS - 1):
-                self.call(function, *args, **kwargs)
-            del x
-            gc.collect()
-            return self.get_mem()
-
-        self.call(function, *args, **kwargs)
-        self.assertEqual(gc.garbage, [])
-        self.assertEqual(threading.active_count(), 1)
-
-        # RSS comparison
-        # step 1
-        rss1 = call_many_times()
-        # step 2
-        rss2 = call_many_times()
-
-        difference = rss2 - rss1
-        if difference > TOLERANCE:
-            # This doesn't necessarily mean we have a leak yet.
-            # At this point we assume that after having called the
-            # function so many times the memory usage is stabilized
-            # and if there are no leaks it should not increase any
-            # more.
-            # Let's keep calling fun for 3 more seconds and fail if
-            # we notice any difference.
-            stop_at = time.time() + 3
-            while 1:
-                self.call(function, *args, **kwargs)
-                if time.time() >= stop_at:
-                    break
-            del stop_at
-            gc.collect()
-            rss3 = self.get_mem()
-            difference = rss3 - rss2
-            if rss3 > rss2:
-                self.fail("rss2=%s, rss3=%s, difference=%s" \
-                          % (rss2, rss3, difference))
-
-    def get_mem(self):
-        return psutil.Process(os.getpid()).get_memory_info()[0]
-
-    def call(self, *args, **kwargs):
-        raise NotImplementedError("must be implemented in subclass")
-
-
-class TestProcessObjectLeaks(Base):
-    """Test leaks of Process class methods and properties"""
-
-    def __init__(self, *args, **kwargs):
-        Base.__init__(self, *args, **kwargs)
-        # skip tests which are not supported by Process API
-        supported_attrs = dir(psutil.Process)
-        for attr in [x for x in dir(self) if x.startswith('test')]:
-            if attr[5:] not in supported_attrs:
-                meth = getattr(self, attr)
-                @skipIf(True)
-                def test_(self):
-                    pass
-                setattr(self, attr, types.MethodType(test_, self))
-
-    def setUp(self):
-        gc.collect()
-
-    def tearDown(self):
-        reap_children()
-
-    def call(self, function, *args, **kwargs):
-        try:
-            obj = getattr(self.proc, function)
-            if callable(obj):
-                obj(*args, **kwargs)
-        except psutil.Error:
-            pass
-
-    def test_name(self):
-        self.execute('name')
-
-    def test_cmdline(self):
-        self.execute('cmdline')
-
-    def test_exe(self):
-        self.execute('exe')
-
-    def test_ppid(self):
-        self.execute('ppid')
-
-    def test_uids(self):
-        self.execute('uids')
-
-    def test_gids(self):
-        self.execute('gids')
-
-    def test_status(self):
-        self.execute('status')
-
-    def test_get_nice(self):
-        self.execute('get_nice')
-
-    def test_set_nice(self):
-        niceness = psutil.Process(os.getpid()).get_nice()
-        self.execute('set_nice', niceness)
-
-    def test_get_io_counters(self):
-        self.execute('get_io_counters')
-
-    def test_get_ionice(self):
-        self.execute('get_ionice')
-
-    def test_set_ionice(self):
-        self.execute('set_ionice', psutil.IOPRIO_CLASS_NONE)
-
-    def test_username(self):
-        self.execute('username')
-
-    def test_create_time(self):
-        self.execute('create_time')
-
-    def test_get_num_threads(self):
-        self.execute('get_num_threads')
-
-    def test_get_num_handles(self):
-        self.execute('get_num_handles')
-
-    def test_get_num_fds(self):
-        self.execute('get_num_fds')
-
-    def test_get_threads(self):
-        self.execute('get_threads')
-
-    def test_get_cpu_times(self):
-        self.execute('get_cpu_times')
-
-    def test_get_memory_info(self):
-        self.execute('get_memory_info')
-
-    def test_get_ext_memory_info(self):
-        self.execute('get_ext_memory_info')
-
-    def test_terminal(self):
-        self.execute('terminal')
-
-    @skipUnless(WINDOWS)
-    def test_resume(self):
-        self.execute('resume')
-
-    def test_getcwd(self):
-        self.execute('getcwd')
-
-    def test_get_cpu_affinity(self):
-        self.execute('get_cpu_affinity')
-
-    def test_set_cpu_affinity(self):
-        affinity = psutil.Process(os.getpid()).get_cpu_affinity()
-        self.execute('set_cpu_affinity', affinity)
-
-    def test_get_open_files(self):
-        safe_remove(TESTFN)  # needed after UNIX socket test has run
-        f = open(TESTFN, 'w')
-        try:
-            self.execute('get_open_files')
-        finally:
-            f.close()
-
-    # OSX implementation is unbelievably slow
-    @skipIf(OSX)
-    def test_get_memory_maps(self):
-        self.execute('get_memory_maps')
-
-    # Linux implementation is pure python so since it's slow we skip it
-    @skipIf(LINUX)
-    def test_get_connections(self):
-        def create_socket(family, type):
-            sock = socket.socket(family, type)
-            sock.bind(('', 0))
-            if type == socket.SOCK_STREAM:
-                sock.listen(1)
-            return sock
-
-        socks = []
-        socks.append(create_socket(socket.AF_INET, socket.SOCK_STREAM))
-        socks.append(create_socket(socket.AF_INET, socket.SOCK_DGRAM))
-        if supports_ipv6():
-            socks.append(create_socket(socket.AF_INET6, socket.SOCK_STREAM))
-            socks.append(create_socket(socket.AF_INET6, socket.SOCK_DGRAM))
-        if hasattr(socket, 'AF_UNIX'):
-            safe_remove(TESTFN)
-            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-            s.bind(TESTFN)
-            s.listen(1)
-            socks.append(s)
-        try:
-            self.execute('get_connections', kind='all')
-        finally:
-            for s in socks:
-                s.close()
-
-
-p = get_test_subprocess()
-DEAD_PROC = psutil.Process(p.pid)
-DEAD_PROC.kill()
-DEAD_PROC.wait()
-del p
-
-class TestProcessObjectLeaksZombie(TestProcessObjectLeaks):
-    """Same as above but looks for leaks occurring when dealing with
-    zombie processes raising NoSuchProcess exception.
-    """
-    proc = DEAD_PROC
-
-    if not POSIX:
-        def test_kill(self):
-            self.execute('kill')
-
-        def test_terminate(self):
-            self.execute('terminate')
-
-        def test_suspend(self):
-            self.execute('suspend')
-
-        def test_resume(self):
-            self.execute('resume')
-
-        def test_wait(self):
-            self.execute('wait')
-
-
-class TestModuleFunctionsLeaks(Base):
-    """Test leaks of psutil module functions."""
-
-    def setUp(self):
-        gc.collect()
-
-    def call(self, function, *args, **kwargs):
-        obj = getattr(psutil, function)
-        if callable(obj):
-            retvalue = obj(*args, **kwargs)
-
-    @skipIf(POSIX)
-    def test_pid_exists(self):
-        self.execute('pid_exists', os.getpid())
-
-    def test_virtual_memory(self):
-        self.execute('virtual_memory')
-
-    def test_swap_memory(self):
-        self.execute('swap_memory')
-
-    def test_cpu_times(self):
-        self.execute('cpu_times')
-
-    def test_per_cpu_times(self):
-        self.execute('cpu_times', percpu=True)
-
-    @skipUnless(WINDOWS)
-    def test_disk_usage(self):
-        self.execute('disk_usage', '.')
-
-    def test_disk_partitions(self):
-        self.execute('disk_partitions')
-
-    def test_network_io_counters(self):
-        self.execute('network_io_counters')
-
-    def test_disk_io_counters(self):
-        self.execute('disk_io_counters')
-
-    # XXX - on Windows this produces a false positive
-    @skipIf(WINDOWS)
-    def test_get_users(self):
-        self.execute('get_users')
-
-
-def test_main():
-    test_suite = unittest.TestSuite()
-    tests = [TestProcessObjectLeaksZombie,
-             TestProcessObjectLeaks,
-             TestModuleFunctionsLeaks,]
-    for test in tests:
-        test_suite.addTest(unittest.makeSuite(test))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-if __name__ == '__main__':
-    test_main()
diff --git a/contrib/psutil-0.6.1/test/test_psutil.py b/contrib/psutil-0.6.1/test/test_psutil.py
deleted file mode 100644
index ee6888a..0000000
--- a/contrib/psutil-0.6.1/test/test_psutil.py
+++ /dev/null
@@ -1,1946 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: test_psutil.py 1525 2012-08-16 16:32:03Z g.rodola $
-#
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-psutil test suite.
-
-Note: this is targeted for both python 2.x and 3.x so there's no need
-to use 2to3 tool first.
-"""
-
-from __future__ import division
-import unittest
-import os
-import sys
-import subprocess
-import time
-import signal
-import types
-import traceback
-import socket
-import warnings
-import atexit
-import errno
-import threading
-import tempfile
-import stat
-import collections
-import datetime
-
-import psutil
-from psutil._compat import PY3, callable, long
-
-
-PYTHON = os.path.realpath(sys.executable)
-DEVNULL = open(os.devnull, 'r+')
-TESTFN = os.path.join(os.getcwd(), "$testfile")
-POSIX = os.name == 'posix'
-LINUX = sys.platform.startswith("linux")
-WINDOWS = sys.platform.startswith("win32")
-OSX = sys.platform.startswith("darwin")
-BSD = sys.platform.startswith("freebsd")
-
-
-_subprocesses_started = set()
-
-def get_test_subprocess(cmd=None, stdout=DEVNULL, stderr=DEVNULL, stdin=None,
-                        wait=False):
-    """Return a subprocess.Popen object to use in tests.
-    By default stdout and stderr are redirected to /dev/null and the
-    python interpreter is used as test process.
-    If 'wait' is True attemps to make sure the process is in a
-    reasonably initialized state.
-    """
-    if cmd is None:
-        pyline = ""
-        if wait:
-            pyline += "open('%s', 'w'); " % TESTFN
-        pyline += "import time; time.sleep(3600);"
-        cmd_ = [PYTHON, "-c", pyline]
-    else:
-        cmd_ = cmd
-    sproc = subprocess.Popen(cmd_, stdout=stdout, stderr=stderr, stdin=stdin)
-    if wait:
-        if cmd is None:
-            stop_at = time.time() + 3
-            while time.time() > stop_at:
-                if os.path.exists(TESTFN):
-                    break
-                time.sleep(0.001)
-            else:
-                warn("couldn't make sure test file was actually created")
-        else:
-            wait_for_pid(sproc.pid)
-    _subprocesses_started.add(sproc.pid)
-    return sproc
-
-def warn(msg, warntype=RuntimeWarning):
-    """Raise a warning msg."""
-    warnings.warn(msg, warntype)
-
-def sh(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE):
-    """run cmd in a subprocess and return its output.
-    raises RuntimeError on error.
-    """
-    p = subprocess.Popen(cmdline, shell=True, stdout=stdout, stderr=stderr)
-    stdout, stderr = p.communicate()
-    if p.returncode != 0:
-        raise RuntimeError(stderr)
-    if stderr:
-        warn(stderr)
-    if PY3:
-        stdout = str(stdout, sys.stdout.encoding)
-    return stdout.strip()
-
-def which(program):
-    """Same as UNIX which command. Return None on command not found."""
-    def is_exe(fpath):
-        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
-
-    fpath, fname = os.path.split(program)
-    if fpath:
-        if is_exe(program):
-            return program
-    else:
-        for path in os.environ["PATH"].split(os.pathsep):
-            exe_file = os.path.join(path, program)
-            if is_exe(exe_file):
-                return exe_file
-    return None
-
-def wait_for_pid(pid, timeout=1):
-    """Wait for pid to show up in the process list then return.
-    Used in the test suite to give time the sub process to initialize.
-    """
-    raise_at = time.time() + timeout
-    while 1:
-        if pid in psutil.get_pid_list():
-            # give it one more iteration to allow full initialization
-            time.sleep(0.01)
-            return
-        time.sleep(0.0001)
-        if time.time() >= raise_at:
-            raise RuntimeError("Timed out")
-
-def reap_children(search_all=False):
-    """Kill any subprocess started by this test suite and ensure that
-    no zombies stick around to hog resources and create problems when
-    looking for refleaks.
-    """
-    pids = _subprocesses_started
-    if search_all:
-        this_process = psutil.Process(os.getpid())
-        for p in this_process.get_children(recursive=True):
-            pids.add(p.pid)
-    while pids:
-        pid = pids.pop()
-        try:
-            child = psutil.Process(pid)
-            child.kill()
-        except psutil.NoSuchProcess:
-            pass
-        except psutil.AccessDenied:
-            warn("couldn't kill child process with pid %s" % pid)
-        else:
-            child.wait(timeout=3)
-
-def check_ip_address(addr, family):
-    """Attempts to check IP address's validity."""
-    if not addr:
-        return
-    ip, port = addr
-    assert isinstance(port, int), port
-    if family == socket.AF_INET:
-        ip = list(map(int, ip.split('.')))
-        assert len(ip) == 4, ip
-        for num in ip:
-            assert 0 <= num <= 255, ip
-    assert 0 <= port <= 65535, port
-
-def safe_remove(fname):
-    try:
-        os.remove(fname)
-    except OSError:
-        pass
-
-def call_until(fun, expr, timeout=1):
-    """Keep calling function for timeout secs and exit if eval()
-    expression is True.
-    """
-    stop_at = time.time() + timeout
-    while time.time() < stop_at:
-        ret = fun()
-        if eval(expr):
-            return ret
-        time.sleep(0.001)
-    raise RuntimeError('timed out (ret=%r)' % ret)
-
-
-def skipIf(condition, reason="", warn=False):
-    """Decorator which skip a test under if condition is satisfied.
-    This is a substitute of unittest.skipIf which is available
-    only in python 2.7 and 3.2.
-    If 'reason' argument is provided this will be printed during
-    tests execution.
-    If 'warn' is provided a RuntimeWarning will be shown when all
-    tests are run.
-    """
-    def outer(fun, *args, **kwargs):
-        def inner(self):
-            if condition:
-                sys.stdout.write("skipped-")
-                sys.stdout.flush()
-                if warn:
-                    objname = "%s.%s" % (self.__class__.__name__, fun.__name__)
-                    msg = "%s was skipped" % objname
-                    if reason:
-                        msg += "; reason: " + repr(reason)
-                    atexit.register(warn, msg)
-                return
-            else:
-                return fun(self, *args, **kwargs)
-        return inner
-    return outer
-
-def skipUnless(condition, reason="", warn=False):
-    """Contrary of skipIf."""
-    if not condition:
-        return skipIf(True, reason, warn)
-    return skipIf(False)
-
-def ignore_access_denied(fun):
-    """Decorator to Ignore AccessDenied exceptions."""
-    def outer(fun, *args, **kwargs):
-        def inner(self):
-            try:
-                return fun(self, *args, **kwargs)
-            except psutil.AccessDenied:
-                pass
-        return inner
-    return outer
-
-def supports_ipv6():
-    """Return True if IPv6 is supported on this platform."""
-    if not socket.has_ipv6 or not hasattr(socket, "AF_INET6"):
-        return False
-    sock = None
-    try:
-        try:
-            sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
-            sock.bind(("::1", 0))
-        except (socket.error, socket.gaierror):
-            return False
-        else:
-            return True
-    finally:
-        if sock is not None:
-            sock.close()
-
-
-class ThreadTask(threading.Thread):
-    """A thread object used for running process thread tests."""
-
-    def __init__(self):
-        threading.Thread.__init__(self)
-        self._running = False
-        self._interval = None
-        self._flag = threading.Event()
-
-    def __repr__(self):
-        name =  self.__class__.__name__
-        return '<%s running=%s at %#x>' % (name, self._running, id(self))
-
-    def start(self, interval=0.001):
-        """Start thread and keep it running until an explicit
-        stop() request. Polls for shutdown every 'timeout' seconds.
-        """
-        if self._running:
-            raise ValueError("already started")
-        self._interval = interval
-        threading.Thread.start(self)
-        self._flag.wait()
-
-    def run(self):
-        self._running = True
-        self._flag.set()
-        while self._running:
-            time.sleep(self._interval)
-
-    def stop(self):
-        """Stop thread execution and and waits until it is stopped."""
-        if not self._running:
-            raise ValueError("already stopped")
-        self._running = False
-        self.join()
-
-
-class TestCase(unittest.TestCase):
-
-    def setUp(self):
-        safe_remove(TESTFN)
-
-    def tearDown(self):
-        reap_children()
-
-    if not hasattr(unittest.TestCase, "assertIn"):
-        def assertIn(self, member, container, msg=None):
-            if member not in container:
-                self.fail(msg or \
-                        '%s not found in %s' % (repr(member), repr(container)))
-
-    def assert_eq_w_tol(self, first, second, tolerance):
-        difference = abs(first - second)
-        if difference <= tolerance:
-            return
-        msg = '%r != %r within %r delta (%r difference)' \
-              % (first, second, tolerance, difference)
-        raise AssertionError(msg)
-
-    # ============================
-    # tests for system-related API
-    # ============================
-
-    def test_process_iter(self):
-        assert os.getpid() in [x.pid for x in psutil.process_iter()]
-        sproc = get_test_subprocess()
-        assert sproc.pid in [x.pid for x in psutil.process_iter()]
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-        assert sproc.pid not in [x.pid for x in psutil.process_iter()]
-
-    def test_TOTAL_PHYMEM(self):
-        x = psutil.TOTAL_PHYMEM
-        assert isinstance(x, (int, long))
-        assert x > 0
-        self.assertEqual(x, psutil.virtual_memory().total)
-
-    def test_BOOT_TIME(self):
-        x = psutil.BOOT_TIME
-        assert isinstance(x, float)
-        assert x > 0
-        assert x < time.time(), x
-
-    def test_NUM_CPUS(self):
-        self.assertEqual(psutil.NUM_CPUS, len(psutil.cpu_times(percpu=True)))
-        assert psutil.NUM_CPUS >= 1, psutil.NUM_CPUS
-
-    @skipUnless(POSIX)
-    def test_PAGESIZE(self):
-        # pagesize is used internally to perform different calculations
-        # and it's determined by using SC_PAGE_SIZE; make sure
-        # getpagesize() returns the same value.
-        import resource
-        self.assertEqual(os.sysconf("SC_PAGE_SIZE"), resource.getpagesize())
-
-    def test_deprecated_apis(self):
-        warnings.filterwarnings("error")
-        p = psutil.Process(os.getpid())
-        try:
-            self.assertRaises(DeprecationWarning, psutil.virtmem_usage)
-            self.assertRaises(DeprecationWarning, psutil.used_phymem)
-            self.assertRaises(DeprecationWarning, psutil.avail_phymem)
-            self.assertRaises(DeprecationWarning, psutil.total_virtmem)
-            self.assertRaises(DeprecationWarning, psutil.used_virtmem)
-            self.assertRaises(DeprecationWarning, psutil.avail_virtmem)
-            self.assertRaises(DeprecationWarning, psutil.phymem_usage)
-            self.assertRaises(DeprecationWarning, psutil.get_process_list)
-            self.assertRaises(DeprecationWarning, psutil.get_process_list)
-            if LINUX:
-                self.assertRaises(DeprecationWarning, psutil.phymem_buffers)
-                self.assertRaises(DeprecationWarning, psutil.cached_phymem)
-            try:
-                p.nice
-            except DeprecationWarning:
-                pass
-            else:
-                self.fail("p.nice didn't raise DeprecationWarning")
-        finally:
-            warnings.resetwarnings()
-
-    def test_deprecated_apis_retval(self):
-        warnings.filterwarnings("ignore")
-        p = psutil.Process(os.getpid())
-        try:
-            self.assertEqual(psutil.total_virtmem(), psutil.swap_memory().total)
-            self.assertEqual(psutil.get_process_list(), list(psutil.process_iter()))
-            self.assertEqual(p.nice, p.get_nice())
-        finally:
-            warnings.resetwarnings()
-
-    def test_virtual_memory(self):
-        mem = psutil.virtual_memory()
-        assert mem.total > 0, mem
-        assert mem.available > 0, mem
-        assert 0 <= mem.percent <= 100, mem
-        assert mem.used > 0, mem
-        assert mem.free >= 0, mem
-        for name in mem._fields:
-            if name != 'total':
-                value = getattr(mem, name)
-                if not value >= 0:
-                    self.fail("%r < 0 (%s)" % (name, value))
-                if value > mem.total:
-                    self.fail("%r > total (total=%s, %s=%s)" \
-                              % (name, mem.total, name, value))
-
-    def test_swap_memory(self):
-        mem = psutil.swap_memory()
-        assert mem.total > 0, mem
-        assert mem.used >= 0, mem
-        assert mem.free > 0, mem
-        assert 0 <= mem.percent <= 100, mem
-        assert mem.sin >= 0, mem
-        assert mem.sout >= 0, mem
-
-    def test_pid_exists(self):
-        sproc = get_test_subprocess(wait=True)
-        assert psutil.pid_exists(sproc.pid)
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(sproc.pid))
-        self.assertFalse(psutil.pid_exists(-1))
-
-    def test_pid_exists_2(self):
-        reap_children()
-        pids = psutil.get_pid_list()
-        for pid in pids:
-            try:
-                assert psutil.pid_exists(pid)
-            except AssertionError:
-                # in case the process disappeared in meantime fail only
-                # if it is no longer in get_pid_list()
-                time.sleep(.1)
-                if pid in psutil.get_pid_list():
-                    self.fail(pid)
-        pids = range(max(pids) + 5000, max(pids) + 6000)
-        for pid in pids:
-            self.assertFalse(psutil.pid_exists(pid))
-
-    def test_get_pid_list(self):
-        plist = [x.pid for x in psutil.process_iter()]
-        pidlist = psutil.get_pid_list()
-        self.assertEqual(plist.sort(), pidlist.sort())
-        # make sure every pid is unique
-        self.assertEqual(len(pidlist), len(set(pidlist)))
-
-    def test_test(self):
-        # test for psutil.test() function
-        stdout = sys.stdout
-        sys.stdout = DEVNULL
-        try:
-            psutil.test()
-        finally:
-            sys.stdout = stdout
-
-    def test_sys_cpu_times(self):
-        total = 0
-        times = psutil.cpu_times()
-        sum(times)
-        for cp_time in times:
-            assert isinstance(cp_time, float)
-            assert cp_time >= 0.0, cp_time
-            total += cp_time
-        self.assertEqual(total, sum(times))
-        str(times)
-
-    def test_sys_cpu_times2(self):
-        t1 = sum(psutil.cpu_times())
-        time.sleep(0.1)
-        t2 = sum(psutil.cpu_times())
-        difference = t2 - t1
-        if not difference >= 0.05:
-            self.fail("difference %s" % difference)
-
-    def test_sys_per_cpu_times(self):
-        for times in psutil.cpu_times(percpu=True):
-            total = 0
-            sum(times)
-            for cp_time in times:
-                assert isinstance(cp_time, float)
-                assert cp_time >= 0.0, cp_time
-                total += cp_time
-            self.assertEqual(total, sum(times))
-            str(times)
-
-    def test_sys_per_cpu_times2(self):
-        tot1 = psutil.cpu_times(percpu=True)
-        stop_at = time.time() + 0.1
-        while 1:
-            if time.time() >= stop_at:
-                break
-        tot2 = psutil.cpu_times(percpu=True)
-        for t1, t2 in zip(tot1, tot2):
-            t1, t2 = sum(t1), sum(t2)
-            difference = t2 - t1
-            if difference >= 0.05:
-                return
-        self.fail()
-
-    def test_sys_cpu_percent(self):
-        psutil.cpu_percent(interval=0.001)
-        psutil.cpu_percent(interval=0.001)
-        for x in range(1000):
-            percent = psutil.cpu_percent(interval=None)
-            assert isinstance(percent, float)
-            assert percent >= 0.0, percent
-            assert percent <= 100.0, percent
-
-    def test_sys_per_cpu_percent(self):
-        psutil.cpu_percent(interval=0.001, percpu=True)
-        psutil.cpu_percent(interval=0.001, percpu=True)
-        for x in range(1000):
-            percents = psutil.cpu_percent(interval=None, percpu=True)
-            for percent in percents:
-                assert isinstance(percent, float)
-                assert percent >= 0.0, percent
-                assert percent <= 100.0, percent
-
-    def test_disk_usage(self):
-        usage = psutil.disk_usage(os.getcwd())
-        assert usage.total > 0, usage
-        assert usage.used > 0, usage
-        assert usage.free > 0, usage
-        assert usage.total > usage.used, usage
-        assert usage.total > usage.free, usage
-        assert 0 <= usage.percent <= 100, usage.percent
-
-        # if path does not exist OSError ENOENT is expected across
-        # all platforms
-        fname = tempfile.mktemp()
-        try:
-            psutil.disk_usage(fname)
-        except OSError:
-            err = sys.exc_info()[1]
-            if err.args[0] != errno.ENOENT:
-                raise
-        else:
-            self.fail("OSError not raised")
-
-    def test_disk_partitions(self):
-        for disk in psutil.disk_partitions(all=False):
-            assert os.path.exists(disk.device), disk
-            assert os.path.isdir(disk.mountpoint), disk
-            assert disk.fstype, disk
-            assert isinstance(disk.opts, str)
-        for disk in psutil.disk_partitions(all=True):
-            if not WINDOWS:
-                try:
-                    os.stat(disk.mountpoint)
-                except OSError:
-                    # http://mail.python.org/pipermail/python-dev/2012-June/120787.html
-                    err = sys.exc_info()[1]
-                    if err.errno not in (errno.EPERM, errno.EACCES):
-                        raise
-                else:
-                    assert os.path.isdir(disk.mountpoint), disk.mountpoint
-            assert isinstance(disk.fstype, str)
-            assert isinstance(disk.opts, str)
-
-        def find_mount_point(path):
-            path = os.path.abspath(path)
-            while not os.path.ismount(path):
-                path = os.path.dirname(path)
-            return path
-
-        mount = find_mount_point(__file__)
-        mounts = [x.mountpoint for x in psutil.disk_partitions(all=True)]
-        self.assertIn(mount, mounts)
-        psutil.disk_usage(mount)
-
-    def test_network_io_counters(self):
-        def check_ntuple(nt):
-            self.assertEqual(nt[0], nt.bytes_sent)
-            self.assertEqual(nt[1], nt.bytes_recv)
-            self.assertEqual(nt[2], nt.packets_sent)
-            self.assertEqual(nt[3], nt.packets_recv)
-            self.assertEqual(nt[4], nt.errin)
-            self.assertEqual(nt[5], nt.errout)
-            self.assertEqual(nt[6], nt.dropin)
-            self.assertEqual(nt[7], nt.dropout)
-            assert nt.bytes_sent >= 0, nt
-            assert nt.bytes_recv >= 0, nt
-            assert nt.packets_sent >= 0, nt
-            assert nt.packets_recv >= 0, nt
-            assert nt.errin >= 0, nt
-            assert nt.errout >= 0, nt
-            assert nt.dropin >= 0, nt
-            assert nt.dropout >= 0, nt
-
-        ret = psutil.network_io_counters(pernic=False)
-        check_ntuple(ret)
-        ret = psutil.network_io_counters(pernic=True)
-        assert ret != []
-        for key in ret:
-            assert key
-            check_ntuple(ret[key])
-
-    def test_disk_io_counters(self):
-        def check_ntuple(nt):
-            self.assertEqual(nt[0], nt.read_count)
-            self.assertEqual(nt[1], nt.write_count)
-            self.assertEqual(nt[2], nt.read_bytes)
-            self.assertEqual(nt[3], nt.write_bytes)
-            self.assertEqual(nt[4], nt.read_time)
-            self.assertEqual(nt[5], nt.write_time)
-            assert nt.read_count >= 0, nt
-            assert nt.write_count >= 0, nt
-            assert nt.read_bytes >= 0, nt
-            assert nt.write_bytes >= 0, nt
-            assert nt.read_time >= 0, nt
-            assert nt.write_time >= 0, nt
-
-        ret = psutil.disk_io_counters(perdisk=False)
-        check_ntuple(ret)
-        ret = psutil.disk_io_counters(perdisk=True)
-        for key in ret:
-            assert key, key
-            check_ntuple(ret[key])
-
-    def test_get_users(self):
-        users = psutil.get_users()
-        assert users
-        for user in users:
-            assert user.name, user
-            user.terminal
-            user.host
-            assert user.started > 0.0, user
-            datetime.datetime.fromtimestamp(user.started)
-
-    # ====================
-    # Process object tests
-    # ====================
-
-    def test_kill(self):
-        sproc = get_test_subprocess(wait=True)
-        test_pid = sproc.pid
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.kill()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_terminate(self):
-        sproc = get_test_subprocess(wait=True)
-        test_pid = sproc.pid
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.terminate()
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_send_signal(self):
-        if POSIX:
-            sig = signal.SIGKILL
-        else:
-            sig = signal.SIGTERM
-        sproc = get_test_subprocess()
-        test_pid = sproc.pid
-        p = psutil.Process(test_pid)
-        name = p.name
-        p.send_signal(sig)
-        p.wait()
-        self.assertFalse(psutil.pid_exists(test_pid) and name == PYTHON)
-
-    def test_wait(self):
-        # check exit code signal
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        code = p.wait()
-        if os.name == 'posix':
-            self.assertEqual(code, signal.SIGKILL)
-        else:
-            self.assertEqual(code, 0)
-        self.assertFalse(p.is_running())
-
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.terminate()
-        code = p.wait()
-        if os.name == 'posix':
-            self.assertEqual(code, signal.SIGTERM)
-        else:
-            self.assertEqual(code, 0)
-        self.assertFalse(p.is_running())
-
-        # check sys.exit() code
-        code = "import time, sys; time.sleep(0.01); sys.exit(5);"
-        sproc = get_test_subprocess([PYTHON, "-c", code])
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.wait(), 5)
-        self.assertFalse(p.is_running())
-
-        # Test wait() issued twice.
-        # It is not supposed to raise NSP when the process is gone.
-        # On UNIX this should return None, on Windows it should keep
-        # returning the exit code.
-        sproc = get_test_subprocess([PYTHON, "-c", code])
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.wait(), 5)
-        self.assertIn(p.wait(), (5, None))
-
-        # test timeout
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.name
-        self.assertRaises(psutil.TimeoutExpired, p.wait, 0.01)
-
-        # timeout < 0 not allowed
-        self.assertRaises(ValueError, p.wait, -1)
-
-    @skipUnless(POSIX)
-    def test_wait_non_children(self):
-        # test wait() against processes which are not our children
-        code = "import sys;"
-        code += "from subprocess import Popen, PIPE;"
-        code += "cmd = ['%s', '-c', 'import time; time.sleep(10)'];" %PYTHON
-        code += "sp = Popen(cmd, stdout=PIPE);"
-        code += "sys.stdout.write(str(sp.pid));"
-        sproc = get_test_subprocess([PYTHON, "-c", code], stdout=subprocess.PIPE)
-
-        grandson_pid = int(sproc.stdout.read())
-        grandson_proc = psutil.Process(grandson_pid)
-        try:
-            self.assertRaises(psutil.TimeoutExpired, grandson_proc.wait, 0.01)
-            grandson_proc.kill()
-            ret = grandson_proc.wait()
-            self.assertEqual(ret, None)
-        finally:
-            if grandson_proc.is_running():
-                grandson_proc.kill()
-                grandson_proc.wait()
-
-    def test_wait_timeout_0(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        self.assertRaises(psutil.TimeoutExpired, p.wait, 0)
-        p.kill()
-        stop_at = time.time() + 2
-        while 1:
-            try:
-                code = p.wait(0)
-            except psutil.TimeoutExpired:
-                if time.time() >= stop_at:
-                    raise
-            else:
-                break
-        if os.name == 'posix':
-            self.assertEqual(code, signal.SIGKILL)
-        else:
-            self.assertEqual(code, 0)
-        self.assertFalse(p.is_running())
-
-    def test_cpu_percent(self):
-        p = psutil.Process(os.getpid())
-        p.get_cpu_percent(interval=0.001)
-        p.get_cpu_percent(interval=0.001)
-        for x in range(100):
-            percent = p.get_cpu_percent(interval=None)
-            assert isinstance(percent, float)
-            assert percent >= 0.0, percent
-            if os.name != 'posix':
-                assert percent <= 100.0, percent
-            else:
-                assert percent >= 0.0, percent
-
-    def test_cpu_times(self):
-        times = psutil.Process(os.getpid()).get_cpu_times()
-        assert (times.user > 0.0) or (times.system > 0.0), times
-        # make sure returned values can be pretty printed with strftime
-        time.strftime("%H:%M:%S", time.localtime(times.user))
-        time.strftime("%H:%M:%S", time.localtime(times.system))
-
-    # Test Process.cpu_times() against os.times()
-    # os.times() is broken on Python 2.6
-    # http://bugs.python.org/issue1040026
-    # XXX fails on OSX: not sure if it's for os.times(). We should
-    # try this with Python 2.7 and re-enable the test.
-
-    @skipUnless(sys.version_info > (2, 6, 1) and not OSX)
-    def test_cpu_times2(self):
-        user_time, kernel_time = psutil.Process(os.getpid()).get_cpu_times()
-        utime, ktime = os.times()[:2]
-
-        # Use os.times()[:2] as base values to compare our results
-        # using a tolerance  of +/- 0.1 seconds.
-        # It will fail if the difference between the values is > 0.1s.
-        if (max([user_time, utime]) - min([user_time, utime])) > 0.1:
-            self.fail("expected: %s, found: %s" %(utime, user_time))
-
-        if (max([kernel_time, ktime]) - min([kernel_time, ktime])) > 0.1:
-            self.fail("expected: %s, found: %s" %(ktime, kernel_time))
-
-    def test_create_time(self):
-        sproc = get_test_subprocess(wait=True)
-        now = time.time()
-        p = psutil.Process(sproc.pid)
-        create_time = p.create_time
-
-        # Use time.time() as base value to compare our result using a
-        # tolerance of +/- 1 second.
-        # It will fail if the difference between the values is > 2s.
-        difference = abs(create_time - now)
-        if difference > 2:
-            self.fail("expected: %s, found: %s, difference: %s"
-                      % (now, create_time, difference))
-
-        # make sure returned value can be pretty printed with strftime
-        time.strftime("%Y %m %d %H:%M:%S", time.localtime(p.create_time))
-
-    @skipIf(WINDOWS)
-    def test_terminal(self):
-        tty = sh('tty')
-        p = psutil.Process(os.getpid())
-        self.assertEqual(p.terminal, tty)
-
-    @skipIf(OSX, warn=False)
-    def test_get_io_counters(self):
-        p = psutil.Process(os.getpid())
-        # test reads
-        io1 = p.get_io_counters()
-        f = open(PYTHON, 'rb')
-        f.read()
-        f.close()
-        io2 = p.get_io_counters()
-        if not BSD:
-            assert io2.read_count > io1.read_count, (io1, io2)
-            self.assertEqual(io2.write_count, io1.write_count)
-        assert io2.read_bytes >= io1.read_bytes, (io1, io2)
-        assert io2.write_bytes >= io1.write_bytes, (io1, io2)
-        # test writes
-        io1 = p.get_io_counters()
-        f = tempfile.TemporaryFile()
-        if PY3:
-            f.write(bytes("x" * 1000000, 'ascii'))
-        else:
-            f.write("x" * 1000000)
-        f.close()
-        io2 = p.get_io_counters()
-        assert io2.write_count >= io1.write_count, (io1, io2)
-        assert io2.write_bytes >= io1.write_bytes, (io1, io2)
-        assert io2.read_count >= io1.read_count, (io1, io2)
-        assert io2.read_bytes >= io1.read_bytes, (io1, io2)
-
-    @skipUnless(LINUX)
-    def test_get_set_ionice(self):
-        from psutil import (IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE,
-                            IOPRIO_CLASS_IDLE)
-        self.assertEqual(IOPRIO_CLASS_NONE, 0)
-        self.assertEqual(IOPRIO_CLASS_RT, 1)
-        self.assertEqual(IOPRIO_CLASS_BE, 2)
-        self.assertEqual(IOPRIO_CLASS_IDLE, 3)
-        p = psutil.Process(os.getpid())
-        try:
-            p.set_ionice(2)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 4)
-            #
-            p.set_ionice(3)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 3)
-            self.assertEqual(value, 0)
-            #
-            p.set_ionice(2, 0)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 0)
-            p.set_ionice(2, 7)
-            ioclass, value = p.get_ionice()
-            self.assertEqual(ioclass, 2)
-            self.assertEqual(value, 7)
-            self.assertRaises(ValueError, p.set_ionice, 2, 10)
-        finally:
-            p.set_ionice(IOPRIO_CLASS_NONE)
-
-    def test_get_num_threads(self):
-        # on certain platforms such as Linux we might test for exact
-        # thread number, since we always have with 1 thread per process,
-        # but this does not apply across all platforms (OSX, Windows)
-        p = psutil.Process(os.getpid())
-        step1 = p.get_num_threads()
-
-        thread = ThreadTask()
-        thread.start()
-        try:
-            step2 = p.get_num_threads()
-            self.assertEqual(step2, step1 + 1)
-            thread.stop()
-        finally:
-            if thread._running:
-                thread.stop()
-
-    @skipUnless(WINDOWS)
-    def test_get_num_handles(self):
-        # a better test is done later into test/_windows.py
-        p = psutil.Process(os.getpid())
-        assert p.get_num_handles() > 0
-
-    def test_get_threads(self):
-        p = psutil.Process(os.getpid())
-        step1 = p.get_threads()
-
-        thread = ThreadTask()
-        thread.start()
-
-        try:
-            step2 = p.get_threads()
-            self.assertEqual(len(step2), len(step1) + 1)
-            # on Linux, first thread id is supposed to be this process
-            if LINUX:
-                self.assertEqual(step2[0].id, os.getpid())
-            athread = step2[0]
-            # test named tuple
-            self.assertEqual(athread.id, athread[0])
-            self.assertEqual(athread.user_time, athread[1])
-            self.assertEqual(athread.system_time, athread[2])
-            # test num threads
-            thread.stop()
-        finally:
-            if thread._running:
-                thread.stop()
-
-    def test_get_memory_info(self):
-        p = psutil.Process(os.getpid())
-
-        # step 1 - get a base value to compare our results
-        rss1, vms1 = p.get_memory_info()
-        percent1 = p.get_memory_percent()
-        assert rss1 > 0
-        assert vms1 > 0
-
-        # step 2 - allocate some memory
-        memarr = [None] * 1500000
-
-        rss2, vms2 = p.get_memory_info()
-        percent2 = p.get_memory_percent()
-        # make sure that the memory usage bumped up
-        assert rss2 > rss1
-        assert vms2 >= vms1  # vms might be equal
-        assert percent2 > percent1
-        del memarr
-
-#    def test_get_ext_memory_info(self):
-#       # tested later in fetch all test suite
-
-    def test_get_memory_maps(self):
-        p = psutil.Process(os.getpid())
-        maps = p.get_memory_maps()
-        paths = [x for x in maps]
-        self.assertEqual(len(paths), len(set(paths)))
-        ext_maps = p.get_memory_maps(grouped=False)
-
-        for nt in maps:
-            if not nt.path.startswith('['):
-                assert os.path.isabs(nt.path), nt.path
-                if POSIX:
-                    assert os.path.exists(nt.path), nt.path
-                else:
-                    # XXX - On Windows we have this strange behavior with
-                    # 64 bit dlls: they are visible via explorer but cannot
-                    # be accessed via os.stat() (wtf?).
-                    if '64' not in os.path.basename(nt.path):
-                        assert os.path.exists(nt.path), nt.path
-        for nt in ext_maps:
-            for fname in nt._fields:
-                value = getattr(nt, fname)
-                if fname == 'path':
-                    continue
-                elif fname in ('addr', 'perms'):
-                    assert value, value
-                else:
-                    assert isinstance(value, (int, long))
-                    assert value >= 0, value
-
-    def test_get_memory_percent(self):
-        p = psutil.Process(os.getpid())
-        assert p.get_memory_percent() > 0.0
-
-    def test_pid(self):
-        sproc = get_test_subprocess()
-        self.assertEqual(psutil.Process(sproc.pid).pid, sproc.pid)
-
-    def test_is_running(self):
-        sproc = get_test_subprocess(wait=True)
-        p = psutil.Process(sproc.pid)
-        assert p.is_running()
-        assert p.is_running()
-        p.kill()
-        p.wait()
-        assert not p.is_running()
-        assert not p.is_running()
-
-    def test_exe(self):
-        sproc = get_test_subprocess(wait=True)
-        exe = psutil.Process(sproc.pid).exe
-        try:
-            self.assertEqual(exe, PYTHON)
-        except AssertionError:
-            # certain platforms such as BSD are more accurate returning:
-            # "/usr/local/bin/python2.7"
-            # ...instead of:
-            # "/usr/local/bin/python"
-            # We do not want to consider this difference in accuracy
-            # an error.
-            ver = "%s.%s" % (sys.version_info[0], sys.version_info[1])
-            self.assertEqual(exe.replace(ver, ''), PYTHON.replace(ver, ''))
-
-    def test_cmdline(self):
-        sproc = get_test_subprocess([PYTHON, "-E"], wait=True)
-        self.assertEqual(psutil.Process(sproc.pid).cmdline, [PYTHON, "-E"])
-
-    def test_name(self):
-        sproc = get_test_subprocess(PYTHON, wait=True)
-        pyexe = os.path.basename(os.path.realpath(sys.executable)).lower()
-        self.assertEqual(psutil.Process(sproc.pid).name.lower(), pyexe)
-
-    if os.name == 'posix':
-
-        def test_uids(self):
-            p = psutil.Process(os.getpid())
-            real, effective, saved = p.uids
-            # os.getuid() refers to "real" uid
-            self.assertEqual(real, os.getuid())
-            # os.geteuid() refers to "effective" uid
-            self.assertEqual(effective, os.geteuid())
-            # no such thing as os.getsuid() ("saved" uid), but starting
-            # from python 2.7 we have os.getresuid()[2]
-            if hasattr(os, "getresuid"):
-                self.assertEqual(saved, os.getresuid()[2])
-
-        def test_gids(self):
-            p = psutil.Process(os.getpid())
-            real, effective, saved = p.gids
-            # os.getuid() refers to "real" uid
-            self.assertEqual(real, os.getgid())
-            # os.geteuid() refers to "effective" uid
-            self.assertEqual(effective, os.getegid())
-            # no such thing as os.getsuid() ("saved" uid), but starting
-            # from python 2.7 we have os.getresgid()[2]
-            if hasattr(os, "getresuid"):
-                self.assertEqual(saved, os.getresgid()[2])
-
-        def test_nice(self):
-            p = psutil.Process(os.getpid())
-            self.assertRaises(TypeError, p.set_nice, "str")
-            try:
-                try:
-                    first_nice = p.get_nice()
-                    p.set_nice(1)
-                    self.assertEqual(p.get_nice(), 1)
-                    # going back to previous nice value raises AccessDenied on OSX
-                    if not OSX:
-                        p.set_nice(0)
-                        self.assertEqual(p.get_nice(), 0)
-                except psutil.AccessDenied:
-                    pass
-            finally:
-                try:
-                    p.set_nice(first_nice)
-                except psutil.AccessDenied:
-                    pass
-
-    if os.name == 'nt':
-
-        def test_nice(self):
-            p = psutil.Process(os.getpid())
-            self.assertRaises(TypeError, p.set_nice, "str")
-            try:
-                self.assertEqual(p.get_nice(), psutil.NORMAL_PRIORITY_CLASS)
-                p.set_nice(psutil.HIGH_PRIORITY_CLASS)
-                self.assertEqual(p.get_nice(), psutil.HIGH_PRIORITY_CLASS)
-                p.set_nice(psutil.NORMAL_PRIORITY_CLASS)
-                self.assertEqual(p.get_nice(), psutil.NORMAL_PRIORITY_CLASS)
-            finally:
-                p.set_nice(psutil.NORMAL_PRIORITY_CLASS)
-
-    def test_status(self):
-        p = psutil.Process(os.getpid())
-        self.assertEqual(p.status, psutil.STATUS_RUNNING)
-        self.assertEqual(str(p.status), "running")
-
-    def test_status_constants(self):
-        # STATUS_* constants are supposed to be comparable also by
-        # using their str representation
-        self.assertTrue(psutil.STATUS_RUNNING == 0)
-        self.assertTrue(psutil.STATUS_RUNNING == long(0))
-        self.assertTrue(psutil.STATUS_RUNNING == 'running')
-        self.assertFalse(psutil.STATUS_RUNNING == 1)
-        self.assertFalse(psutil.STATUS_RUNNING == 'sleeping')
-        self.assertFalse(psutil.STATUS_RUNNING != 0)
-        self.assertFalse(psutil.STATUS_RUNNING != 'running')
-        self.assertTrue(psutil.STATUS_RUNNING != 1)
-        self.assertTrue(psutil.STATUS_RUNNING != 'sleeping')
-
-    def test_username(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        if POSIX:
-            import pwd
-            self.assertEqual(p.username, pwd.getpwuid(os.getuid()).pw_name)
-        elif WINDOWS:
-            expected_username = os.environ['USERNAME']
-            expected_domain = os.environ['USERDOMAIN']
-            domain, username = p.username.split('\\')
-            self.assertEqual(domain, expected_domain)
-            self.assertEqual(username, expected_username)
-        else:
-            p.username
-
-    @skipIf(not hasattr(psutil.Process, "getcwd"))
-    def test_getcwd(self):
-        sproc = get_test_subprocess(wait=True)
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.getcwd(), os.getcwd())
-
-    @skipIf(not hasattr(psutil.Process, "getcwd"))
-    def test_getcwd_2(self):
-        cmd = [PYTHON, "-c", "import os, time; os.chdir('..'); time.sleep(10)"]
-        sproc = get_test_subprocess(cmd, wait=True)
-        p = psutil.Process(sproc.pid)
-        call_until(p.getcwd, "ret == os.path.dirname(os.getcwd())", timeout=1)
-
-    @skipIf(not hasattr(psutil.Process, "get_cpu_affinity"))
-    def test_cpu_affinity(self):
-        p = psutil.Process(os.getpid())
-        initial = p.get_cpu_affinity()
-        all_cpus = list(range(len(psutil.cpu_percent(percpu=True))))
-        #
-        for n in all_cpus:
-            p.set_cpu_affinity([n])
-            self.assertEqual(p.get_cpu_affinity(), [n])
-        #
-        p.set_cpu_affinity(all_cpus)
-        self.assertEqual(p.get_cpu_affinity(), all_cpus)
-        #
-        p.set_cpu_affinity(initial)
-        invalid_cpu = [len(psutil.cpu_times(percpu=True)) + 10]
-        self.assertRaises(ValueError, p.set_cpu_affinity, invalid_cpu)
-
-    def test_get_open_files(self):
-        # current process
-        p = psutil.Process(os.getpid())
-        files = p.get_open_files()
-        self.assertFalse(TESTFN in files)
-        f = open(TESTFN, 'w')
-        call_until(p.get_open_files, "len(ret) != %i" % len(files))
-        filenames = [x.path for x in p.get_open_files()]
-        self.assertIn(TESTFN, filenames)
-        f.close()
-        for file in filenames:
-            assert os.path.isfile(file), file
-
-        # another process
-        cmdline = "import time; f = open(r'%s', 'r'); time.sleep(100);" % TESTFN
-        sproc = get_test_subprocess([PYTHON, "-c", cmdline], wait=True)
-        p = psutil.Process(sproc.pid)
-        for x in range(100):
-            filenames = [x.path for x in p.get_open_files()]
-            if TESTFN in filenames:
-                break
-            time.sleep(.01)
-        else:
-            self.assertIn(TESTFN, filenames)
-        for file in filenames:
-            assert os.path.isfile(file), file
-
-    def test_get_open_files2(self):
-        # test fd and path fields
-        fileobj = open(TESTFN, 'w')
-        p = psutil.Process(os.getpid())
-        for path, fd in p.get_open_files():
-            if path == fileobj.name or fd == fileobj.fileno():
-                break
-        else:
-            self.fail("no file found; files=%s" % repr(p.get_open_files()))
-        self.assertEqual(path, fileobj.name)
-        if WINDOWS:
-            self.assertEqual(fd, -1)
-        else:
-            self.assertEqual(fd, fileobj.fileno())
-        # test positions
-        ntuple = p.get_open_files()[0]
-        self.assertEqual(ntuple[0], ntuple.path)
-        self.assertEqual(ntuple[1], ntuple.fd)
-        # test file is gone
-        fileobj.close()
-        self.assertTrue(fileobj.name not in p.get_open_files())
-
-    def test_get_connections(self):
-        arg = "import socket, time;" \
-              "s = socket.socket();" \
-              "s.bind(('127.0.0.1', 0));" \
-              "s.listen(1);" \
-              "conn, addr = s.accept();" \
-              "time.sleep(100);"
-        sproc = get_test_subprocess([PYTHON, "-c", arg])
-        p = psutil.Process(sproc.pid)
-        for x in range(100):
-            cons = p.get_connections()
-            if cons:
-                break
-            time.sleep(.01)
-        self.assertEqual(len(cons), 1)
-        con = cons[0]
-        self.assertEqual(con.family, socket.AF_INET)
-        self.assertEqual(con.type, socket.SOCK_STREAM)
-        self.assertEqual(con.status, "LISTEN")
-        ip, port = con.local_address
-        self.assertEqual(ip, '127.0.0.1')
-        self.assertEqual(con.remote_address, ())
-        if WINDOWS:
-            self.assertEqual(con.fd, -1)
-        else:
-            assert con.fd > 0, con
-        # test positions
-        self.assertEqual(con[0], con.fd)
-        self.assertEqual(con[1], con.family)
-        self.assertEqual(con[2], con.type)
-        self.assertEqual(con[3], con.local_address)
-        self.assertEqual(con[4], con.remote_address)
-        self.assertEqual(con[5], con.status)
-        # test kind arg
-        self.assertRaises(ValueError, p.get_connections, 'foo')
-
-    @skipUnless(supports_ipv6())
-    def test_get_connections_ipv6(self):
-        s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
-        s.bind(('::1', 0))
-        s.listen(1)
-        cons = psutil.Process(os.getpid()).get_connections()
-        s.close()
-        self.assertEqual(len(cons), 1)
-        self.assertEqual(cons[0].local_address[0], '::1')
-
-    @skipUnless(hasattr(socket, 'AF_UNIX'))
-    def test_get_connections_unix(self):
-        # tcp
-        safe_remove(TESTFN)
-        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-        sock.bind(TESTFN)
-        conn = psutil.Process(os.getpid()).get_connections(kind='unix')[0]
-        self.assertEqual(conn.fd, sock.fileno())
-        self.assertEqual(conn.family, socket.AF_UNIX)
-        self.assertEqual(conn.type, socket.SOCK_STREAM)
-        self.assertEqual(conn.local_address, TESTFN)
-        self.assertTrue(not conn.remote_address)
-        self.assertTrue(not conn.status)
-        sock.close()
-        # udp
-        safe_remove(TESTFN)
-        sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
-        sock.bind(TESTFN)
-        conn = psutil.Process(os.getpid()).get_connections(kind='unix')[0]
-        self.assertEqual(conn.type, socket.SOCK_DGRAM)
-        sock.close()
-
-    @skipUnless(hasattr(socket, "fromfd") and not WINDOWS)
-    def test_connection_fromfd(self):
-        sock = socket.socket()
-        sock.bind(('localhost', 0))
-        sock.listen(1)
-        p = psutil.Process(os.getpid())
-        for conn in p.get_connections():
-            if conn.fd == sock.fileno():
-                break
-        else:
-            sock.close()
-            self.fail("couldn't find socket fd")
-        dupsock = socket.fromfd(conn.fd, conn.family, conn.type)
-        try:
-            self.assertEqual(dupsock.getsockname(), conn.local_address)
-            self.assertNotEqual(sock.fileno(), dupsock.fileno())
-        finally:
-            sock.close()
-            dupsock.close()
-
-    def test_get_connections_all(self):
-        tcp_template = "import socket;" \
-                       "s = socket.socket($family, socket.SOCK_STREAM);" \
-                       "s.bind(('$addr', 0));" \
-                       "s.listen(1);" \
-                       "conn, addr = s.accept();"
-
-        udp_template = "import socket, time;" \
-                       "s = socket.socket($family, socket.SOCK_DGRAM);" \
-                       "s.bind(('$addr', 0));" \
-                       "time.sleep(100);"
-
-        from string import Template
-        tcp4_template = Template(tcp_template).substitute(family=socket.AF_INET,
-                                                          addr="127.0.0.1")
-        udp4_template = Template(udp_template).substitute(family=socket.AF_INET,
-                                                          addr="127.0.0.1")
-        tcp6_template = Template(tcp_template).substitute(family=socket.AF_INET6,
-                                                          addr="::1")
-        udp6_template = Template(udp_template).substitute(family=socket.AF_INET6,
-                                                          addr="::1")
-
-        # launch various subprocess instantiating a socket of various
-        # families and types to enrich psutil results
-        tcp4_proc = get_test_subprocess([PYTHON, "-c", tcp4_template])
-        udp4_proc = get_test_subprocess([PYTHON, "-c", udp4_template])
-        if supports_ipv6():
-            tcp6_proc = get_test_subprocess([PYTHON, "-c", tcp6_template])
-            udp6_proc = get_test_subprocess([PYTHON, "-c", udp6_template])
-        else:
-            tcp6_proc = None
-            udp6_proc = None
-
-        # check matches against subprocesses just created
-        all_kinds = ("all", "inet", "inet4", "inet6", "tcp", "tcp4", "tcp6",
-                     "udp", "udp4", "udp6")
-        for p in psutil.Process(os.getpid()).get_children():
-            for conn in p.get_connections():
-                # TCP v4
-                if p.pid == tcp4_proc.pid:
-                    self.assertEqual(conn.family, socket.AF_INET)
-                    self.assertEqual(conn.type, socket.SOCK_STREAM)
-                    self.assertEqual(conn.local_address[0], "127.0.0.1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "LISTEN")
-                    for kind in all_kinds:
-                        cons = p.get_connections(kind=kind)
-                        if kind in ("all", "inet", "inet4", "tcp", "tcp4"):
-                            assert cons != [], cons
-                        else:
-                            self.assertEqual(cons, [], cons)
-                # UDP v4
-                elif p.pid == udp4_proc.pid:
-                    self.assertEqual(conn.family, socket.AF_INET)
-                    self.assertEqual(conn.type, socket.SOCK_DGRAM)
-                    self.assertEqual(conn.local_address[0], "127.0.0.1")
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "")
-                    for kind in all_kinds:
-                        cons = p.get_connections(kind=kind)
-                        if kind in ("all", "inet", "inet4", "udp", "udp4"):
-                            assert cons != [], cons
-                        else:
-                            self.assertEqual(cons, [], cons)
-                # TCP v6
-                elif p.pid == getattr(tcp6_proc, "pid", None):
-                    self.assertEqual(conn.family, socket.AF_INET6)
-                    self.assertEqual(conn.type, socket.SOCK_STREAM)
-                    self.assertIn(conn.local_address[0], ("::", "::1"))
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "LISTEN")
-                    for kind in all_kinds:
-                        cons = p.get_connections(kind=kind)
-                        if kind in ("all", "inet", "inet6", "tcp", "tcp6"):
-                            assert cons != [], cons
-                        else:
-                            self.assertEqual(cons, [], cons)
-                # UDP v6
-                elif p.pid == getattr(udp6_proc, "pid", None):
-                    self.assertEqual(conn.family, socket.AF_INET6)
-                    self.assertEqual(conn.type, socket.SOCK_DGRAM)
-                    self.assertIn(conn.local_address[0], ("::", "::1"))
-                    self.assertEqual(conn.remote_address, ())
-                    self.assertEqual(conn.status, "")
-                    for kind in all_kinds:
-                        cons = p.get_connections(kind=kind)
-                        if kind in ("all", "inet", "inet6", "udp", "udp6"):
-                            assert cons != [], cons
-                        else:
-                            self.assertEqual(cons, [], cons)
-
-    @skipUnless(POSIX)
-    def test_get_num_fds(self):
-        p = psutil.Process(os.getpid())
-        start = p.get_num_fds()
-        file = open(TESTFN, 'w')
-        self.assertEqual(p.get_num_fds(), start + 1)
-        sock = socket.socket()
-        self.assertEqual(p.get_num_fds(), start + 2)
-        file.close()
-        sock.close()
-        self.assertEqual(p.get_num_fds(), start)
-
-    def test_get_num_ctx_switches(self):
-        p = psutil.Process(os.getpid())
-        before = sum(p.get_num_ctx_switches())
-        for x in range(50000):
-            after = sum(p.get_num_ctx_switches())
-            if after > before:
-                return
-        self.fail("num ctx switches still the same after 50.000 iterations")
-
-    def test_parent_ppid(self):
-        this_parent = os.getpid()
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        self.assertEqual(p.ppid, this_parent)
-        self.assertEqual(p.parent.pid, this_parent)
-        # no other process is supposed to have us as parent
-        for p in psutil.process_iter():
-            if p.pid == sproc.pid:
-                continue
-            self.assertTrue(p.ppid != this_parent)
-
-    def test_get_children(self):
-        p = psutil.Process(os.getpid())
-        self.assertEqual(p.get_children(), [])
-        self.assertEqual(p.get_children(recursive=True), [])
-        sproc = get_test_subprocess()
-        children1 = p.get_children()
-        children2 = p.get_children(recursive=True)
-        for children in (children1, children2):
-            self.assertEqual(len(children), 1)
-            self.assertEqual(children[0].pid, sproc.pid)
-            self.assertEqual(children[0].ppid, os.getpid())
-
-    def test_get_children_recursive(self):
-        # here we create a subprocess which creates another one as in:
-        # A (parent) -> B (child) -> C (grandchild)
-        s =  "import subprocess, os, sys, time;"
-        s += "PYTHON = os.path.realpath(sys.executable);"
-        s += "cmd = [PYTHON, '-c', 'import time; time.sleep(3600);'];"
-        s += "subprocess.Popen(cmd);"
-        s += "time.sleep(3600);"
-        get_test_subprocess(cmd=[PYTHON, "-c", s])
-        p = psutil.Process(os.getpid())
-        self.assertEqual(len(p.get_children(recursive=False)), 1)
-        # give the grandchild some time to start
-        stop_at = time.time() + 1.5
-        while time.time() < stop_at:
-            children = p.get_children(recursive=True)
-            if len(children) > 1:
-                break
-        self.assertEqual(len(children), 2)
-        self.assertEqual(children[0].ppid, os.getpid())
-        self.assertEqual(children[1].ppid, children[0].pid)
-
-    def test_get_children_duplicates(self):
-        # find the process which has the highest number of children
-        from psutil._compat import defaultdict
-        table = defaultdict(int)
-        for p in psutil.process_iter():
-            try:
-                table[p.ppid] += 1
-            except psutil.Error:
-                pass
-        # this is the one, now let's make sure there are no duplicates
-        pid = max(sorted(table, key=lambda x: table[x]))
-        p = psutil.Process(pid)
-        try:
-            c = p.get_children(recursive=True)
-        except psutil.AccessDenied:  # windows
-            pass
-        else:
-            self.assertEqual(len(c), len(set(c)))
-
-    def test_suspend_resume(self):
-        sproc = get_test_subprocess(wait=True)
-        p = psutil.Process(sproc.pid)
-        p.suspend()
-        for x in range(100):
-            if p.status == psutil.STATUS_STOPPED:
-                break
-            time.sleep(0.01)
-        self.assertEqual(str(p.status), "stopped")
-        p.resume()
-        assert p.status != psutil.STATUS_STOPPED, p.status
-
-    def test_invalid_pid(self):
-        self.assertRaises(TypeError, psutil.Process, "1")
-        self.assertRaises(TypeError, psutil.Process, None)
-        # Refers to Issue #12
-        self.assertRaises(psutil.NoSuchProcess, psutil.Process, -1)
-
-    def test_as_dict(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        d = p.as_dict()
-        try:
-            import json
-        except ImportError:
-            pass
-        else:
-            # dict is supposed to be hashable
-            json.dumps(d)
-        #
-        d = p.as_dict(attrs=['exe', 'name'])
-        self.assertEqual(sorted(d.keys()), ['exe', 'name'])
-        #
-        p = psutil.Process(min(psutil.get_pid_list()))
-        d = p.as_dict(attrs=['get_connections'], ad_value='foo')
-        if not isinstance(d['connections'], list):
-            self.assertEqual(d['connections'], 'foo')
-
-    def test_zombie_process(self):
-        # Test that NoSuchProcess exception gets raised in case the
-        # process dies after we create the Process object.
-        # Example:
-        #  >>> proc = Process(1234)
-        #  >>> time.sleep(5)  # time-consuming task, process dies in meantime
-        #  >>> proc.name
-        # Refers to Issue #15
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-
-        for name in dir(p):
-            if name.startswith('_')\
-            or name in ('pid', 'send_signal', 'is_running', 'set_ionice',
-                        'wait', 'set_cpu_affinity', 'create_time', 'set_nice',
-                        'nice'):
-                continue
-            try:
-                meth = getattr(p, name)
-                if callable(meth):
-                    meth()
-            except psutil.NoSuchProcess:
-                pass
-            else:
-                self.fail("NoSuchProcess exception not raised for %r" % name)
-
-        # other methods
-        try:
-            if os.name == 'posix':
-                p.set_nice(1)
-            else:
-                p.set_nice(psutil.NORMAL_PRIORITY_CLASS)
-        except psutil.NoSuchProcess:
-            pass
-        else:
-            self.fail("exception not raised")
-        if hasattr(p, 'set_ionice'):
-            self.assertRaises(psutil.NoSuchProcess, p.set_ionice, 2)
-        self.assertRaises(psutil.NoSuchProcess, p.send_signal, signal.SIGTERM)
-        self.assertRaises(psutil.NoSuchProcess, p.set_nice, 0)
-        self.assertFalse(p.is_running())
-        if hasattr(p, "set_cpu_affinity"):
-            self.assertRaises(psutil.NoSuchProcess, p.set_cpu_affinity, [0])
-
-    def test__str__(self):
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        self.assertIn(str(sproc.pid), str(p))
-        # python shows up as 'Python' in cmdline on OS X so test fails on OS X
-        if not OSX:
-            self.assertIn(os.path.basename(PYTHON), str(p))
-        sproc = get_test_subprocess()
-        p = psutil.Process(sproc.pid)
-        p.kill()
-        p.wait()
-        self.assertIn(str(sproc.pid), str(p))
-        self.assertIn("terminated", str(p))
-
-    @skipIf(LINUX)
-    def test_pid_0(self):
-        # Process(0) is supposed to work on all platforms except Linux
-        p = psutil.Process(0)
-        self.assertTrue(p.name)
-
-        if os.name == 'posix':
-            self.assertEqual(p.uids.real, 0)
-            self.assertEqual(p.gids.real, 0)
-
-        self.assertIn(p.ppid, (0, 1))
-        #self.assertEqual(p.exe, "")
-        self.assertEqual(p.cmdline, [])
-        try:
-            p.get_num_threads()
-        except psutil.AccessDenied:
-            pass
-
-        try:
-            p.get_memory_info()
-        except psutil.AccessDenied:
-            pass
-
-        # username property
-        if POSIX:
-            self.assertEqual(p.username, 'root')
-        elif WINDOWS:
-            self.assertEqual(p.username, 'NT AUTHORITY\\SYSTEM')
-        else:
-            p.username
-
-        self.assertIn(0, psutil.get_pid_list())
-        self.assertTrue(psutil.pid_exists(0))
-
-    def test_Popen(self):
-        # Popen class test
-        # XXX this test causes a ResourceWarning on Python 3 because
-        # psutil.__subproc instance doesn't get propertly freed.
-        # Not sure what to do though.
-        cmd = [PYTHON, "-c", "import time; time.sleep(3600);"]
-        proc = psutil.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        try:
-            proc.name
-            proc.stdin
-            self.assertTrue(hasattr(proc, 'name'))
-            self.assertTrue(hasattr(proc, 'stdin'))
-            self.assertRaises(AttributeError, getattr, proc, 'foo')
-        finally:
-            proc.kill()
-            proc.wait()
-
-
-class TestFetchAllProcesses(unittest.TestCase):
-    # Iterates over all running processes and performs some sanity
-    # checks against Process API's returned values.
-
-    # Python 2.4 compatibility
-    if not hasattr(unittest.TestCase, "assertIn"):
-        def assertIn(self, member, container, msg=None):
-            if member not in container:
-                self.fail(msg or \
-                        '%s not found in %s' % (repr(member), repr(container)))
-
-    def setUp(self):
-        if POSIX:
-            import pwd
-            pall = pwd.getpwall()
-            self._uids = set([x.pw_uid for x in pall])
-            self._usernames = set([x.pw_name for x in pall])
-
-    def test_fetch_all(self):
-        valid_procs = 0
-        excluded_names = ['send_signal', 'suspend', 'resume', 'terminate',
-                          'kill', 'wait', 'as_dict', 'get_cpu_percent', 'nice',
-                          'parent', 'get_children', 'pid']
-        attrs = []
-        for name in dir(psutil.Process):
-            if name.startswith("_"):
-                continue
-            if name.startswith("set_"):
-                continue
-            if name in excluded_names:
-                continue
-            attrs.append(name)
-
-        for p in psutil.process_iter():
-            for name in attrs:
-                try:
-                    try:
-                        attr = getattr(p, name, None)
-                        if attr is not None and callable(attr):
-                            ret = attr()
-                        else:
-                            ret = attr
-                        valid_procs += 1
-                    except (psutil.NoSuchProcess, psutil.AccessDenied):
-                        err = sys.exc_info()[1]
-                        self.assertEqual(err.pid, p.pid)
-                        if err.name:
-                            # make sure exception's name attr is set
-                            # with the actual process name
-                            self.assertEqual(err.name, p.name)
-                        self.assertTrue(str(err))
-                        self.assertTrue(err.msg)
-                    else:
-                        if ret not in (0, 0.0, [], None, ''):
-                            assert ret, ret
-                        meth = getattr(self, name)
-                        meth(ret)
-                except Exception:
-                    err = sys.exc_info()[1]
-                    trace = traceback.format_exc()
-                    self.fail('%s\nproc=%s, method=%r, retvalue=%r'
-                              % (trace, p, name, ret))
-
-        # we should always have a non-empty list, not including PID 0 etc.
-        # special cases.
-        self.assertTrue(valid_procs > 0)
-
-    def cmdline(self, ret):
-        pass
-
-    def exe(self, ret):
-        if not ret:
-            assert ret == ''
-        else:
-            assert os.path.isabs(ret), ret
-            # Note: os.stat() may return False even if the file is there
-            # hence we skip the test, see:
-            # http://stackoverflow.com/questions/3112546/os-path-exists-lies
-            if POSIX:
-                assert os.path.isfile(ret), ret
-                if hasattr(os, 'access') and hasattr(os, "X_OK"):
-                    self.assertTrue(os.access(ret, os.X_OK))
-
-    def ppid(self, ret):
-        self.assertTrue(ret >= 0)
-
-    def name(self, ret):
-        self.assertTrue(isinstance(ret, str))
-        self.assertTrue(ret)
-
-    def create_time(self, ret):
-        self.assertTrue(ret > 0)
-        if not WINDOWS:
-            self.assertTrue(ret >= psutil.BOOT_TIME)
-        # make sure returned value can be pretty printed
-        # with strftime
-        time.strftime("%Y %m %d %H:%M:%S", time.localtime(ret))
-
-    def uids(self, ret):
-        for uid in ret:
-            self.assertTrue(uid >= 0)
-            self.assertIn(uid, self._uids)
-
-    def gids(self, ret):
-        # note: testing all gids as above seems not to be reliable for
-        # gid == 30 (nodoby); not sure why.
-        for gid in ret:
-            self.assertTrue(gid >= 0)
-            #self.assertIn(uid, self.gids)
-
-    def username(self, ret):
-        self.assertTrue(ret)
-        if os.name == 'posix':
-            self.assertIn(ret, self._usernames)
-
-    def status(self, ret):
-        self.assertTrue(ret >= 0)
-        self.assertTrue(str(ret) != '?')
-
-    def get_io_counters(self, ret):
-        for field in ret:
-            if field != -1:
-                self.assertTrue(field >= 0)
-
-    def get_ionice(self, ret):
-        self.assertTrue(ret.ioclass >= 0)
-        self.assertTrue(ret.value >= 0)
-
-    def get_num_threads(self, ret):
-        self.assertTrue(ret >= 1)
-
-    def get_threads(self, ret):
-        for t in ret:
-            self.assertTrue(t.id >= 0)
-            self.assertTrue(t.user_time >= 0)
-            self.assertTrue(t.system_time >= 0)
-
-    def get_cpu_times(self, ret):
-        self.assertTrue(ret.user >= 0)
-        self.assertTrue(ret.system >= 0)
-
-    def get_memory_info(self, ret):
-        self.assertTrue(ret.rss >= 0)
-        self.assertTrue(ret.vms >= 0)
-
-    def get_ext_memory_info(self, ret):
-        for name in ret._fields:
-            self.assertTrue(getattr(ret, name) >= 0)
-        if POSIX and ret.vms != 0:
-            # VMS is always supposed to be the highest
-            for name in ret._fields:
-                if name != 'vms':
-                    value = getattr(ret, name)
-                    assert ret.vms > value, ret
-        elif WINDOWS:
-            assert ret.peak_wset >= ret.wset, ret
-            assert ret.peak_paged_pool >= ret.paged_pool, ret
-            assert ret.peak_nonpaged_pool >= ret.nonpaged_pool, ret
-            assert ret.peak_pagefile >= ret.pagefile, ret
-
-    def get_open_files(self, ret):
-        for f in ret:
-            if WINDOWS:
-                assert f.fd == -1, f
-            else:
-                assert isinstance(f.fd, int), f
-            assert os.path.isabs(f.path), f
-            assert os.path.isfile(f.path), f
-
-    def get_num_fds(self, ret):
-        self.assertTrue(ret >= 0)
-
-    def get_connections(self, ret):
-        # all values are supposed to match Linux's tcp_states.h states
-        # table across all platforms.
-        valid_conn_states = ["ESTABLISHED", "SYN_SENT", "SYN_RECV", "FIN_WAIT1",
-                             "FIN_WAIT2", "TIME_WAIT", "CLOSE", "CLOSE_WAIT",
-                             "LAST_ACK", "LISTEN", "CLOSING", ""]
-        for conn in ret:
-            self.assertIn(conn.type, (socket.SOCK_STREAM, socket.SOCK_DGRAM))
-            self.assertIn(conn.family, (socket.AF_INET, socket.AF_INET6))
-            check_ip_address(conn.local_address, conn.family)
-            check_ip_address(conn.remote_address, conn.family)
-            if conn.status not in valid_conn_states:
-                self.fail("%s is not a valid status" %conn.status)
-            # actually try to bind the local socket; ignore IPv6
-            # sockets as their address might be represented as
-            # an IPv4-mapped-address (e.g. "::127.0.0.1")
-            # and that's rejected by bind()
-            if conn.family == socket.AF_INET:
-                s = socket.socket(conn.family, conn.type)
-                s.bind((conn.local_address[0], 0))
-                s.close()
-
-            if not WINDOWS and hasattr(socket, 'fromfd'):
-                dupsock = None
-                try:
-                    try:
-                        dupsock = socket.fromfd(conn.fd, conn.family, conn.type)
-                    except (socket.error, OSError):
-                        err = sys.exc_info()[1]
-                        if err.args[0] == errno.EBADF:
-                            continue
-                        raise
-                    # python >= 2.5
-                    if hasattr(dupsock, "family"):
-                        self.assertEqual(dupsock.family, conn.family)
-                        self.assertEqual(dupsock.type, conn.type)
-                finally:
-                    if dupsock is not None:
-                        dupsock.close()
-
-    def getcwd(self, ret):
-        if ret is not None:  # BSD may return None
-            assert os.path.isabs(ret), ret
-            try:
-                st = os.stat(ret)
-            except OSError:
-                err = sys.exc_info()[1]
-                # directory has been removed in mean time
-                if err.errno != errno.ENOENT:
-                    raise
-            else:
-                self.assertTrue(stat.S_ISDIR(st.st_mode))
-
-    def get_memory_percent(self, ret):
-        assert 0 <= ret <= 100, ret
-
-    def is_running(self, ret):
-        self.assertTrue(ret)
-
-    def get_cpu_affinity(self, ret):
-        assert ret != [], ret
-
-    def terminal(self, ret):
-        if ret is not None:
-            assert os.path.isabs(ret), ret
-            assert os.path.exists(ret), ret
-
-    def get_memory_maps(self, ret):
-        for nt in ret:
-            for fname in nt._fields:
-                value = getattr(nt, fname)
-                if fname == 'path':
-                    if not value.startswith('['):
-                        assert os.path.isabs(nt.path), nt.path
-                        # commented as on Linux we might get '/foo/bar (deleted)'
-                        #assert os.path.exists(nt.path), nt.path
-                elif fname in ('addr', 'perms'):
-                    self.assertTrue(value)
-                else:
-                    assert isinstance(value, (int, long))
-                    assert value >= 0, value
-
-    def get_num_handles(self, ret):
-        if WINDOWS:
-            assert ret >= 0
-        else:
-            assert ret > 0
-
-    def get_nice(self, ret):
-        if POSIX:
-            assert -20 <= ret <= 20, ret
-        else:
-            priorities = [getattr(psutil, x) for x in dir(psutil)
-                          if x.endswith('_PRIORITY_CLASS')]
-            self.assertIn(ret, priorities)
-
-    def get_num_ctx_switches(self, ret):
-        self.assertTrue(ret.voluntary >= 0)
-        self.assertTrue(ret.involuntary >= 0)
-
-if hasattr(os, 'getuid'):
-    class LimitedUserTestCase(TestCase):
-        """Repeat the previous tests by using a limited user.
-        Executed only on UNIX and only if the user who run the test script
-        is root.
-        """
-        # the uid/gid the test suite runs under
-        PROCESS_UID = os.getuid()
-        PROCESS_GID = os.getgid()
-
-        def __init__(self, *args, **kwargs):
-            TestCase.__init__(self, *args, **kwargs)
-            # re-define all existent test methods in order to
-            # ignore AccessDenied exceptions
-            for attr in [x for x in dir(self) if x.startswith('test')]:
-                meth = getattr(self, attr)
-                def test_(self):
-                    try:
-                        meth()
-                    except psutil.AccessDenied:
-                        pass
-                setattr(self, attr, types.MethodType(test_, self))
-
-        def setUp(self):
-            os.setegid(1000)
-            os.seteuid(1000)
-            TestCase.setUp(self)
-
-        def tearDown(self):
-            os.setegid(self.PROCESS_UID)
-            os.seteuid(self.PROCESS_GID)
-            TestCase.tearDown(self)
-
-        def test_nice(self):
-            try:
-                psutil.Process(os.getpid()).set_nice(-1)
-            except psutil.AccessDenied:
-                pass
-            else:
-                self.fail("exception not raised")
-
-
-def cleanup():
-    reap_children(search_all=True)
-    DEVNULL.close()
-    safe_remove(TESTFN)
-
-atexit.register(cleanup)
-
-def test_main():
-    tests = []
-    test_suite = unittest.TestSuite()
-    tests.append(TestCase)
-    tests.append(TestFetchAllProcesses)
-
-    if POSIX:
-        from _posix import PosixSpecificTestCase
-        tests.append(PosixSpecificTestCase)
-
-    # import the specific platform test suite
-    if LINUX:
-        from _linux import LinuxSpecificTestCase as stc
-    elif WINDOWS:
-        from _windows import WindowsSpecificTestCase as stc
-        from _windows import TestDualProcessImplementation
-        tests.append(TestDualProcessImplementation)
-    elif OSX:
-        from _osx import OSXSpecificTestCase as stc
-    elif BSD:
-        from _bsd import BSDSpecificTestCase as stc
-    tests.append(stc)
-
-    if hasattr(os, 'getuid'):
-        if os.getuid() == 0:
-            tests.append(LimitedUserTestCase)
-        else:
-            atexit.register(warn, "Couldn't run limited user tests ("
-                                  "super-user privileges are required)")
-
-    for test_class in tests:
-        test_suite.addTest(unittest.makeSuite(test_class))
-    unittest.TextTestRunner(verbosity=2).run(test_suite)
-
-if __name__ == '__main__':
-    test_main()
diff --git a/contrib/selenium_python_client.tar.gz b/contrib/selenium_python_client.tar.gz
deleted file mode 100644
index 182a7a82307ed4b9a4a6ab457be31a7393aa73c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 20031
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
a&)w(lbN9LX+<iXB&;JMZ)j3W8kO2T0>Qp`e

diff --git a/screenshots/check_ningx_status-active_conns.png b/screenshots/check_ningx_status-active_conns.png
deleted file mode 100644
index 047c169dc30a3f43d5c5fed473bf381277381f1f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 357724
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
OtH)7?Jbmz)*Z)6*MjXZf

diff --git a/screenshots/check_ningx_status-rps.png b/screenshots/check_ningx_status-rps.png
deleted file mode 100644
index 33ce27ce8ea469777e36d9609a372e044fe611f5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 352462
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
F{(r86#Bcxr

diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..43b117f
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,3 @@
+[metadata]
+version = 0.0.0
+license_files = LICENSE
\ No newline at end of file
-- 
GitLab