⛏️ index : haiku.git

#!/usr/bin/env python

import socket
import subprocess
import sys


address = '0.0.0.0'
port = 4242


def receiveExactly(connection, size):
	data = '';
	while size > 0:
		dataReceived = connection.recv(size)
		if not dataReceived:
			raise EOFError()
		data += dataReceived
		size -= len(dataReceived)
	return data


def handleConnection(listenerSocket):
	(controlConnection, controlAddress) = listenerSocket.accept()
	(stdioConnection, stdioAddress) = listenerSocket.accept()
	(stderrConnection, stderrAddress) = listenerSocket.accept()

	print 'accepted client connections'

	try:
		commandLength = receiveExactly(controlConnection, 8)
		commandToRun = receiveExactly(controlConnection, int(commandLength))

		print 'received command: ' + commandToRun

		exitCode = subprocess.call(commandToRun, stdin=stdioConnection,
			stdout=stdioConnection, stderr=stderrConnection, shell=True)

		controlConnection.send(str(exitCode))
	finally:
		controlConnection.close()
		stdioConnection.close()
		stderrConnection.close()

	print 'client connections closed'


listenerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listenerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

try:
	listenerSocket.bind((address, port))
except socket.error, msg:
	sys.exit('Failed to bind to %s port %d: %s' % (address, port, msg[1]))

listenerSocket.listen(3)

print 'started listening on adddress %s port %s' % (address, port)

while True:
	handleConnection(listenerSocket)