Python 2.7.9+gevent

Python 2.7.9+gevent会出问题。
如果你使用gevent 1.0 ,比如你使用Ubuntu 14.10,使用apt-get安装的缺省版本就是它,报的错误是:global name SSLContext not defined.这个路线我现在还没有分析。
如果你使用gevent 1.0.1,同样在Ubuntu 14.10,使用sudo easy_install -U gevent,安装的版本是目前gevent的最新版本1.0.1。提示的错误是:global name sslwrap not defined。

根据Debian的bug report,这个问题已经出现好长时间了。

Google的解决方案如下:
1. https://gist.github.com/ellimilial/5ef1d1917e00970d4457

sudo apt-get install python-dev cython git python-pip
sudo pip install git+git://github.com/ellimilial/gevent.git@master

not work。因为网络的原故,从github直接这么安装着实是慢得要死。

2. https://github.com/gevent/gevent/issues/477
这里面提供的代码经过测试是好用的,前提是使用gevent的最新1.0.1版本。

gist地址:https://gist.github.com/zz/af7d9efa539999757950

代码如下:

# Re-add sslwrap to Python 2.7.9
import inspect
__ssl__ = __import__('ssl')

try:
    _ssl = __ssl__._ssl
except AttributeError:
    _ssl = __ssl__._ssl2

def new_sslwrap(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=__ssl__.CERT_NONE,  ssl_version=__ssl__.PROTOCOL_SSLv23, ca_certs=None, ciphers=None):
    context = __ssl__.SSLContext(ssl_version)
    context.verify_mode = cert_reqs or __ssl__.CERT_NONE
    if ca_certs:
        context.load_verify_locations(ca_certs)
    if certfile:
        context.load_cert_chain(certfile, keyfile)
    if ciphers:
        context.set_ciphers(ciphers)

    caller_self = inspect.currentframe().f_back.f_locals['self']
    return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self)

if not hasattr(_ssl, 'sslwrap'):
    _ssl.sslwrap = new_sslwrap

考虑到使用方便,可以使用下面代码(因为这条import当时忘记了,结果又重新修改了一下)

# Re-add sslwrap to Python 2.7.9
import inspect

def new_sslwrap(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=__ssl__.CERT_NONE,  ssl_version=__ssl__.PROTOCOL_SSLv23, ca_certs=None, ciphers=None):
    context = __ssl__.SSLContext(ssl_version)
    context.verify_mode = cert_reqs or __ssl__.CERT_NONE
    if ca_certs:
        context.load_verify_locations(ca_certs)
    if certfile:
        context.load_cert_chain(certfile, keyfile)
    if ciphers:
        context.set_ciphers(ciphers)

    caller_self = inspect.currentframe().f_back.f_locals['self']
    return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self)

if not hasattr(_ssl, 'sslwrap'):
    _ssl.sslwrap = new_sslwrap

加到这段代码之下:

try:
    _ssl = __ssl__._ssl
except AttributeError:
    _ssl = __ssl__._ssl2

修改文件的位置:/usr/local/lib/python2.7/dist-packages/gevent-1.0.1-py2.7-linux-x86_64.egg/gevent
文件名:ssl.py

记得Ubuntu下使用gksu来应用权限。

此记。
———-
为什么会遇到这个问题:之前一篇文章说使用gevent速度会快些。已经加上了,速度什么的没有体会,反倒让这个问题折腾了,太喜爱技术的问题,以后还是少点发散吧。

Ajaxterm – Web Based SSH Terminal Client

官方主站:Ajaxterm

安装很简单:
sudo apt-get install ajaxterm

这个包需要openssh-server
建议包含的包括:rssh molly-guard openssh-blacklist openssh-blacklist-extra
推荐的包:python-psyco

安装好之后,用/etc/init.d/ajaxterm start|stop启用服务,就可以访问http://127.0.0.1:8022来使用term了。

本来以为后续会非常容易,但是参照http://wiki.kartbuilding.net/index.php/Ajaxterm所给出的内容,在缺省安装的情况下还是遇到了不少的麻烦。
[code language=”bash”]
ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled/proxy.conf
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load
ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load
[/code]
等同于
[code language=”bash”]
sudo a2enmod proxy
sudo a2enmod proxy_http
[/code]

编辑/etc/apache2/sites-available/default-ssl文件:
[code language=”xml”]

SetEnvIf Request_URI “^/u” dontlog
ErrorLog /var/log/apache2/error.log
Loglevel warn
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

ProxyRequests Off AuthUserFile /srv/ajaxterm/.htpasswd
AuthName EnterPassword
AuthType Basic
require valid-user

Order Deny,allow
Allow from all ProxyPass / http://localhost:8022/
ProxyPassReverse / http://localhost:8022/

[/code]
其中我修改了一处:
SSLCertificateFile /etc/apache2/ssl/apache.pem

SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
这两个文件的创建如:
[code language=”bash”]
$sudo openssl req -new -x509 -nodes -out server.crt -keyout server.key
[/code]
这样直接启动apache还是会出错,因为/srv/ajaxterm所需要的文件并不存在。
[code language=”bash”]
sudo mkdir /srv/ajaxterm
sudo htpasswd -bc /srv/ajaxterm/.htpasswd [user] [pass]
[/code]

重新启动apache2,在另一台电脑上登录。接受了SSL的认证登录后,上面熟悉的登录界面出现了。

参考:
1. AjaxTerm
2. Ubuntu Document – AjaxTerm
3. SSL/TLS Strong Encryption: FAQ
4. Running a Reverse Proxy in Apache
5.