Source code for railgun.userhost.server
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# @file: railgun/userhost/server.py
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This file is released under BSD 2-clause license.
import socket
[docs]class UserHostServer(object):
"""User credential server that assigns system accounts for each runner
task. This server runs single threaded, and will not block if all users
are assigned.
"""
def __init__(self, userpool):
self.pool = userpool
def _serve_request(self, conn):
"""Serve a incoming request."""
f = conn.makefile('rw')
act, arg = tuple(v for v in f.readline().strip().split(' ') if v)
if act == 'get':
user = self.pool.acquire(int(arg))
if user:
print('get %s -> okay %s' % (arg, user))
f.write('okay %s\n' % user)
else:
print('get %s -> fail' % arg)
f.write('error\n')
elif act == 'put':
print('put %s -> okay' % arg)
self.pool.release(arg)
f.write('okay\n')
else:
print('unknown: %s' % act)
f.write('unknown action\n')
f.flush()
[docs] def run(self, port, interface='', backlog=100):
"""Run the user credential server.
:param port: The port of the user credential server.
:type port: :class:`int`
:param interface: The interface for the server to listen.
:type interface: :class:`str`
:param backlog: The TCP backlog size.
:type backlog: :class:`int`
"""
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sck.bind((interface, port))
sck.listen(backlog)
while True:
conn, addr = sck.accept()
conn.settimeout(10)
try:
self._serve_request(conn)
except Exception:
pass
conn.close()
sck.close()