Files
core-build/build/tools/terminal-server.py
Dennis Jensen c706764434 FIX-GENERIC-00002
Move the Profile Specific Release directory data into the appropriate Profile directory.  Add a build-tool that copies this release information from the appropriate Profile Release directory into the common Release directory during build as part of the make checkout: –and– update: just after the point where the data has been updated.

A checkout prior to this point will yield:
* The Common Release directory contains the release information for multiple Profiles making it non-generic
* The Release directory was laid out in Version Product Build order instead of Product Version Build order, which is more intuitive because generally a Build belongs to a Version, which belongs to a Product
2016-12-20 10:38:59 -06:00

128 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
#+
# Copyright 2015 iXsystems, Inc.
# All rights reserved
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted providing that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#####################################################################
import argparse
import socket
import threading
import serial
class Main(object):
def __init__(self):
self.console = None
self.server = None
self.logfile = None
self.clients = []
def handle_connection(self, sock, addr):
print('New connection from {0}:{1}'.format(*addr))
self.clients.append(sock)
# Disable local echo
sock.send('\xff\xfb\x01')
sock.recv(3)
# Suppress go-ahead
sock.send('\xff\xfb\x03')
sock.recv(3)
while True:
ch = sock.recv(1)
if not ch:
print('Connection from {0}:{1} closed'.format(*addr))
self.clients.remove(sock)
sock.shutdown(socket.SHUT_RDWR)
return
self.console.write(ch)
def console_reader(self):
while True:
try:
ch = self.console.read()
except serial.SerialException as e:
print('Cannot read from serial port: {0}'.format(str(e)))
return
if self.logfile:
self.logfile.write(ch)
if ch == '\n':
self.logfile.flush()
for i in self.clients:
i.send(ch)
def start_server(self, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
sock.bind(('', port))
sock.listen(1)
while True:
try:
client, addr = sock.accept()
except KeyboardInterrupt:
sock.shutdown(socket.SHUT_RDWR)
return
t = threading.Thread(target=self.handle_connection, args=(client, addr))
t.daemon = True
t.start()
def main(self):
parser = argparse.ArgumentParser()
parser.add_argument('-c', metavar='CON-PORT', help='Port device node')
parser.add_argument('-l', metavar='LOGFILE', help='Log file')
parser.add_argument('-p', metavar='TCP-PORT', help='TCP port number to listen on')
args = parser.parse_args()
if args.l:
self.logfile = open(args.l, 'a+')
try:
self.console = serial.Serial(args.c, 9600)
except OSError as e:
print('Cannot open serial port: {0}'.format(str(e)))
return
t1 = threading.Thread(target=self.console_reader)
t1.daemon = True
t1.start()
self.start_server(int(args.p))
if self.logfile:
self.logfile.close()
self.console.close()
if __name__ == '__main__':
m = Main()
m.main()