根据需要通过HTTP生成和流式输出命令

时间:2016-10-19 16:22:30

标签: http streaming

我现在正在做一个瑞士军队Linux。我遇到了运行命令的情况,然后将其传输到HTTP服务器,该服务器只为该流提供服务。这是整个场景:

  1. 使用类似

    的行启动服务器
    $ httpondemand parecord
    

    服务器无法立即启动parecord。

  2. HTTP客户端连接。

    $ wget -O - http://server/ | mpv -
    

    我可以HAZ" /"

  3. 服务器:启动parecord,获取一些输出,回复" 200 叹息,faaain,",发送输出。
  4. 我即将自己编写这个工具,但我想我是否已经知道是否有任何能够做到这一点。

1 个答案:

答案 0 :(得分:0)

我找不到一个可以做到这一点的工具,所以我最终写了一个,由于超出本文档范围的原因,它被命名为todd。我仍然宁愿使用已经存在的东西,所以这不是我理想的解决方案。

#!/usr/bin/env python

from socketserver import TCPServer
from http.server import BaseHTTPRequestHandler
import subprocess as sp
from sys import *

class ToddHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()

        # Do not start the command until after a connection has been made.
        p = sp.Popen(argv[1:], stdout=sp.PIPE)
        while True:
            data = p.stdout.read(1024)
            if len(data) == 0:
                break

            try:
                self.wfile.write(data)
            except BrokenPipeError:
                break
            except ConnectionResetError:
                break
        p.stdout.close()
        p.wait()  # Kill the zombie.

if len(argv) == 1:
    stderr.write('usage: todd command [arg1 arg2 ...]\n')

# Create the server.
server = TCPServer(('', 10000), ToddHandler)

# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()