文档章节

twisted学习-5 defer异步回调 结合paramiko

jastme
 jastme
发布于 2014/08/20 21:11
字数 460
阅读 113
收藏 0

我们学习了defer了实例,现在我们来写个基于paramiko的异步连接服务器的代码

#!/usr/bin/python
# -*- coding:cp936 -*-
from optparse import OptionParser
import paramiko
from twisted.internet import reactor, defer

parser = OptionParser(usage="%prog",version="version %prog 1.0.0")
parser.add_option("-f", "--files",action="store", type="string", dest="files", help="give the file's name")
(options, args) = parser.parse_args()

class UPDATE:

    def __init__(self,hostname,username,password):
        self.hostname = hostname
        self.username = username
        self.password = password

    def update(self):
        paramiko.util.log_to_file('/tmp/update.log')
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            s.connect(hostname=self.hostname,username=self.username,password=self.password)
            stdin,stdout,stderr=s.exec_command('cd /opt;tar xvf %s;' %options.files.split('/')[-1])
        except Exception as e:
            return '%s %s' %(self.hostname,e)
        result=stdout.read()
        s.close()
        return '%s %s' %(self.hostname,result.strip('\n'))

    def transport(self):
        try:
            t=paramiko.Transport((self.hostname,22))
#            mykey = paramiko.RSAKey.from_private_key_file(rsakey,password='jastme')  #use key
#            t.connect(user,mykey)
            t.connect(username=self.username,password=self.password)
            sftp=paramiko.SFTPClient.from_transport(t)
            sftp.put('/root/%s' %(options.files.split('/')[-1]),'/opt/%s' %(options.files.split('/')[-1]),confirm=True)
        except Exception as e:
            return '%s %s' %(self.hostname,e)
        sftp.close()
        return 'Copy files %s to %s Sucessed' %(options.files.split('/')[-1],self.hostname)

def updatedf(hostname,username,password):
    d=defer.Deferred()
    reactor.callLater(1,d.callback,UPDATE(hostname,username,password).update())
    return d

def transportdf(hostname,username,password):
    d=defer.Deferred()
    reactor.callLater(1,d.callback,UPDATE(hostname,username,password).transport())
    return d

def printData(x):
    print x

if __name__ == '__main__':

    serverlist=['192.168.16.102','192.168.16.209']
    input=raw_input("1. 推送文件到服务器\n2. 更新\n3. 推送文件后更新\n")
    if input == '1':
        for server in serverlist:
            dt=transportdf(server,'root','pass')
            dt.addCallback(printData)
    elif input == '2':
        for server in serverlist:
            du=updatedf(server,'root','pass')
            du.addCallback(printData)
    elif input == '3':
        for server in serverlist:
            dt=transportdf(server,'root','pass')
            dt.addCallback(printData)
            du=updatedf(server,'root','pass')
            du.addCallback(printData)
    reactor.callLater(1, reactor.stop)
    reactor.run()

这是一个远程连接服务器,推送文件,使用命令解压包的程序(当然,我们还可以做很多扩展,可以把它写成一个自动化更新服务器的代码)。我们用callback来回调paramiko的函数。看过前面章节的朋友应该很容易读懂这个代码。

在这个代码,我们使用的try来避免抛出错误后代码异常退出的情况,利用execpt来返回错误,从而充分的利用callback来回调这些信息。

© 著作权归作者所有

jastme
粉丝 39
博文 137
码字总数 62396
作品 0
成都
程序员
私信 提问
(转) Twisted :第十九部分 改变之前的想法

简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 类添加了一个新的特性—— ——这正是我们今天要研究的. 异步编程将请求...

水果糖
2016/01/27
33
0
WEB服务器自动化脚本,paramiko结合twisted实例应用

updatewebserver.py #!/usr/bin/python 2014-10-15 by jastme from optparse import OptionParserimport paramikofrom twisted.internet import reactor, deferimport os,time parser = Opti......

jastme
2014/10/16
0
0
(转) Twisted : 第十四部分 Deferred用于同步环境

介绍 这部分我们要介绍Deferred的另外一个功能。便于讨论,我们设定如下情景:假设由于众多的内部网请求一个外部诗歌下载服务器,但由于这个外部下载服务器性能太差或请求负荷太重。因此,我...

水果糖
2016/01/27
12
0
zg手册 之 twisted 开发(1)-- twisted 框架介绍

异步非阻塞框架 twisted 是一个事件驱动的网络开发框架,使用 python 开发。 twisted 框架编写的服务器有几个基本的元素: 应用程序对象(application):管理应用程序资源的对象,一个应用程序...

东昕
2014/06/21
0
0
(转) Twisted : 第八部分 使用Deferred的诗歌下载客户端

客户端4.0 我们已经对deferreds有些理解了,现在我们可以使用它重写我们的客户端。你可以在twisted-client-4/get-poetry.py中看到它的实现。 这里的getpoetry已经再也不需要callback与errba...

水果糖
2016/01/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

vmstat命令详解

https://www.cnblogs.com/ggjucheng/archive/2012/01/05/2312625.html

流光韶逝
10分钟前
0
0
如何理解算法时间复杂度的表示

先从O(1) 来说,理论上哈希表就是O(1)。因为哈希表是通过哈希函数来映射的,所以拿到一个关键 字,用哈希函数转换一下,就可以直接从表中取出对应的值。和现存数据有多少毫无关系,故而每次执...

yky20190625
26分钟前
2
0
分布式架构 实现分布式锁的常见方式

一、我们为什么需要分布式锁? 在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制...

太猪-YJ
今天
5
0
GitLab Docker 安装记录

安装环境 环境Centos7.4 64 1.拉取镜像文件 docker pull gitlab/gitlab-ce:latest 2.docker 安装 git.zddts.com 为访问域名或换成可以访问的IP docker run -d --hostname git.***.com -p ......

侠者圣
今天
0
0
EfficientNet: 再论 CNN 的网络规模

由于这里公式无法正常显示,所有内容以图片内容上传,如有需要,可提供 pdf 版。

爱吃草莓的皮卡丘
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部