构建动态tftp服务器的python3框架

fbtftp的Python项目详细描述


[![构建状态](https://travis-ci.org/facebook/fbtftp.svg?branch=master)(https://travis ci.org/facebook/fbtftp)
[![codebeat徽章](https://codebeat.co/badges/2d4c7650-4752-4adf-a570-1948ecb4d6a8)(https://codebeat.co/projects/github com facebook fbtftp)

\fbtftp是什么?

`fbtftp`是facebook对动态tftp服务器框架的实现。它可以让您创建自定义的tftp服务器,并以非常简单的方式将您自己的逻辑封装到其中。
Facebook目前在生产中使用它,并且它在全球范围内部署在我们所有的数据中心中。



我们最终编写了自己的tftp
框架,并决定将其开源。

`fbtftp'是由于需要一个易于配置和易于扩展的tftp服务器而诞生的,这种服务器可以大规模工作。标准的
`in.tftpd`是一个用c编写的20多年的软件,很难扩展。


`fbtftp`是用'python3'编写的,它允许您插入自己的逻辑:

*将每个会话和服务器范围的统计数据发布到您的基础结构中已生成响应数据:
*可以是磁盘中的文件;
*可以是动态创建的文件;
*命名!

在Facebook上如何使用"FBTFTP"?

我们基于该框架创建了自己的Facebook特定服务器:

*从我们的HTTP存储库流式传输静态文件(initrd和kernels)(无需
用文件填充TFTP根目录);
*动态生成每台计算机的GRUB2配置(无需复制磁盘上的GRUB2
配置文件);
*将每台服务器和每个连接的统计信息发布到我们的内部监视系统中;
*部署简单且"容器就绪",只需将应用程序复制到某个地方,
启动它就完成了。

它比其他tftp服务器好吗?

这取决于你的需要!` fbtftp`是用python 3编写的,使用
多处理模型;它的主要关注点不是速度,而是灵活性和
可伸缩性。但在我们的数据中心规模下,它足够快:)
非常适合需要可扩展性和自定义功能的大型安装。



框架实现了以下rfc:

*[rfc 1350](https://tools.ietf.org/html/rfc1350)(主要tftp规范)
*[rfc 2347](https://tools.ietf.org/html/rfc2347)(选项扩展)
*[rfc 2348](https://tools.ietf.org/html/rfc2348)(blocksize选项)
*[RFC 2349](https://tools.ietf.org/html/rfc2349)(超时间隔和传输
大小选项)。

请注意,服务器框架仅支持RRQ(只读)操作。
(谁在2016年使用WRQ TFTP请求?:p)



您只需了解三个类和两个回调函数,
就可以了:


*`baseserver`:这个类实现了在提供的udp端口上接受新的
请求的过程。可以传递默认的tftp参数,如timeout、port
number和retries。这个类不必直接使用
,您必须从它继承并重写"get_handler()"方法来
返回"basehandler"的一个实例。
该类接受"server_stats_callback",下面详细介绍。回调
不是重新进入的,如果需要,必须实现自己的锁定逻辑。此回调将定期执行,您可以使用它将
服务器级统计信息发布到监视基础结构。提供了一系列预定义的
计数器。请参阅类文档以了解更多信息。

*`basehandler`:此类处理与单个客户端的对话。这个类
存在于其单独的过程中,proces是由"baserserver"
类派生的,该类将确保在会话结束时正确获取子级。不要按原样使用该类,而是从该类继承并重写"get_response_data()"方法。此类方法必须返回"responseData"的子类的实例。

*`responseData`:它是一个类似文件的类,实现了"read(num-bytes)"、
`size()和"close()"。作为前两个类,您必须从中继承
,并实现这些方法。这个类基本上允许您定义如何返回实际数据:定期(默认情况下每60秒)调用的函数。回调不是重新进入的,如果需要的话,可以使用
来实现自己的锁定逻辑。此回调将定期执行
,您可以使用它向监视
基础结构发布服务器级统计信息。提供了一系列预定义的计数器。
请参阅类文档以了解更多信息。

*`session\u stats\u callback`:当客户端会话结束时调用的函数。


[`epoll`](http://linux.die.net/man/4/epoll))
*python 3.x

因此,可以使用

```
```
python setup.py build
````


python setup.py install
````


如果要在系统范围内安装"fbttp",请确保以根用户身份运行。您还可以使用"virtualenv",或者以用户身份安装它,方法是运行:

`````
python setup.py install--user
````

让我们来看看如何编写一个简单的
服务器,该服务器提供来自磁盘的文件:

``python
来自fbttp.base廑handler import basehandler
来自fbttptp.base廑handler import responsedata
来自fbttptp.base廑server import baseserver

import os

文件响应数据(响应数据):
def\u init\uu(self,path):
self.[u size=os.stat(path).st\u size
self.[u reader=open(path,'rb')

def read(self,n):
return self.[u reader.read(n)

def size(self):
return self.[u size


def close(self):
self.\u reader.close()


def print_session_stats(stats):
print(stats)

def print_server_stats(stats):
counters=stats.get_and_reset_all_counters()
print('server stats-every{}seconds'。format(stats.interval))
打印(计数器)

class statichandler(basehandler):
def初始(self,server addr,peer,path,options,root,stats回调):
self.\u root=root
super()。\uu初始(server addr,peer,path,options,stats回调)

def获取响应数据(self):
返回fileresponsedata(os.path.join(self.\u root,self.\u path))


类staticserver(baseserver):
定义初始化(self,地址,端口,重试,超时,根,
处理程序统计回调,服务器状态回调=无:
self.\u根=根
self.\u处理程序状态回调=处理程序状态回调
super()。\u初始化(地址、端口、重试、超时、服务器状态回调)

def get_处理程序(self、服务器地址、对等、路径、选项):
statichandler(
server addr,peer,path,options,self.\u root,
self.\u handler\u stats\u callback)


def main():
server=staticserver(ip='',port='1069',retries=3,timeout=5,
root='/var/tftproot',打印会话统计,
打印服务器统计信息)
尝试:
server.run()
除了键盘中断:
server.close()

如果```

是谁写的?< BR>fbtftp由marcin wyszynski(@marcinwyszynski)和angelo faila<;pallotron@fb.com>;在facebook爱尔兰创建。


其他荣誉贡献者:
*andrea barberio<;barberio@fb.com>;

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java返回入for循环或外循环   Android是由java引起的。安全cert.CertPathValidatorException:找不到证书路径的信任锚点   PHP和Java之间有什么区别?   java我想将gridview更改为recyclerview   java获取分页的行数   试图在Java类中计算CKJM时发生类错误   java如何在BIRT报告中集成谷歌地图   java我可以在enum上使用Spring的@Component吗?   在Android Java的硬件键盘上设置CAPS_LOCK和NUM_LOCK   XSD 1.1断言中基于java XSD attributevalue的regexvalidation   java从命令行设置spring属性文件位置   Ogg格式的java语音录制?   java我能找到Groovy代码块中可能抛出的所有(已检查的)异常吗?   java为什么这会导致ClassCastException?   java在安卓 studio中的活动之间传递数据   java Intellij:如何从现有进程更新运行配置环境?   java我们如何创建Dagger 2的依赖关系图?   java如何从JSP页面到servlet获取数据   Java https连接证书不受信任+javax。网ssl。SSLException:PKIX路径生成失败