2016-10-19 3 views
0

私は少しスイス軍のLinuxingをやっています。私はコマンドを実行したい場所に行き、それをHTTPサーバーにパイプして、そのストリームだけを処理します。ここでは全体のシナリオがあります:オンデマンドでHTTP経由でコマンドの出力を生成してストリーム化する

  1. スタートServerはすぐにparecord起動しない

    $ httpondemand parecord 
    

    のような行を使用してサーバー。

  2. HTTPクライアントが接続します。

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

    I CAN HAZ "/"?

  3. サーバー:parecordを開始し、何らかの出力を取得し、 "200 sigh、faaain"と返信します。

私はこのツールを自分で作成しようとしていますが、すでにこれが可能なものがあれば尋ねると思いました。

答えて

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() 
関連する問題