7 from pexpect import fdpexpect, TIMEOUT
9 parser = argparse.ArgumentParser(description='Connect to serial console ' +
11 parser.add_argument('--port', required=True,
12 help='serial console device to connect ' +
13 'to (e.g. /dev/pts/X)')
14 parser.add_argument('--hostname', default="buster",
15 help='hostname of the system for login process ' +
17 parser.add_argument('--user', default="root",
18 help='user name to use for login (default: root)')
19 parser.add_argument('--password', default="grml",
20 help='password for login (default: grml)')
21 parser.add_argument('--tries', default="12", type=int,
22 help='Number of retries for finding the login prompt')
23 parser.add_argument('--poweroff', action="store_true", default=False,
24 help='send "poweroff" command after all other commands')
25 parser.add_argument('command', nargs='+',
26 help='command to execute after logging in')
30 def print_ser_lines(ser):
31 for line in ser.readlines():
32 print("<<", line) # line will be a binary string
35 def write_ser_line(ser, text):
37 ser.write(("%s\n" % text).encode())
41 def login(ser, hostname, user, password, timeout=5):
43 child = fdpexpect.fdspawn(ser.fileno())
47 child.expect("%s@%s" % (user, hostname), timeout=timeout)
52 print("Waiting for login prompt...")
53 child.expect("%s login:" % hostname, timeout=timeout)
54 print("Logging in...")
55 write_ser_line(ser, user)
57 write_ser_line(ser, password)
60 print("Waiting for shell prompt...")
61 child.expect("%s@%s" % (user, hostname), timeout=timeout)
65 args = parser.parse_args()
66 hostname = args.hostname
67 password = args.password
70 commands = args.command
72 ser = serial.Serial(port, 115200)
77 for i in range(args.tries):
79 print("Logging into %s via serial console [try %s]" % (port, i))
80 login(ser, hostname, user, password)
83 except Exception as except_inst:
84 print("Login failure (try %s):" % (i, ), except_inst, file=sys.stderr)
88 write_ser_line(ser, "")
91 print("Running commands...")
92 for command in commands:
93 write_ser_line(ser, command)
96 print("Sending final poweroff command...")
97 write_ser_line(ser, "poweroff")
99 # after poweroff, the serial device will probably vanish. do not attempt reading from it anymore.
104 if __name__ == "__main__":