| #!/usr/bin/python3 |
| # SPDX-License-Identifier: LGPL-2.1-or-later |
| # |
| |
| import argparse |
| import logging |
| import pexpect |
| import sys |
| |
| |
| def run(args): |
| |
| ret = 1 |
| logger = logging.getLogger("test-shutdown") |
| |
| logger.info("spawning test") |
| console = pexpect.spawn(args.command, args.arg, env={ |
| "TERM": "linux", |
| }, encoding='utf-8', timeout=30) |
| |
| if args.verbose: |
| console.logfile = sys.stdout |
| |
| logger.debug("child pid %d" % console.pid) |
| |
| try: |
| logger.info("waiting for login prompt") |
| console.expect('H login: ', 10) |
| |
| logger.info("log in and start screen") |
| console.sendline('root') |
| console.expect('bash.*# ', 10) |
| console.sendline('screen') |
| console.expect('screen0 ', 10) |
| console.sendcontrol('a') |
| console.send('c') |
| console.expect('screen1 ', 10) |
| |
| # console.interact() |
| |
| console.sendline('tty') |
| console.expect(r'/dev/(pts/\d+)') |
| pty = console.match.group(1) |
| logger.info("window 1 at line %s", pty) |
| |
| logger.info("schedule reboot") |
| console.sendline('shutdown -r') |
| console.expect("Reboot scheduled for (?P<date>.*), use 'shutdown -c' to cancel", 2) |
| date = console.match.group('date') |
| logger.info("reboot scheduled for %s", date) |
| |
| console.sendcontrol('a') |
| console.send('0') |
| logger.info("verify broadcast message") |
| console.expect('Broadcast message from root@H on %s' % pty, 2) |
| console.expect('The system is going down for reboot at %s' % date, 2) |
| |
| logger.info("check show output") |
| console.sendline('shutdown --show') |
| console.expect("Reboot scheduled for %s, use 'shutdown -c' to cancel" % date, 2) |
| |
| logger.info("cancel shutdown") |
| console.sendline('shutdown -c') |
| console.sendcontrol('a') |
| console.send('1') |
| console.expect('The system shutdown has been cancelled', 2) |
| |
| logger.info("call for reboot") |
| console.sendline('sleep 10; shutdown -r now') |
| console.sendcontrol('a') |
| console.send('0') |
| console.expect("The system is going down for reboot NOW!", 12) |
| |
| logger.info("waiting for reboot") |
| |
| console.expect('H login: ', 10) |
| console.sendline('root') |
| console.expect('bash.*# ', 10) |
| |
| console.sendline('> /testok') |
| |
| logger.info("power off") |
| console.sendline('poweroff') |
| |
| logger.info("expect termination now") |
| console.expect(pexpect.EOF) |
| |
| ret = 0 |
| except Exception as e: |
| logger.error(e) |
| logger.info("killing child pid %d" % console.pid) |
| console.terminate() |
| |
| return ret |
| |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser(description='test logind shutdown feature') |
| parser.add_argument("-v", "--verbose", action="store_true", help="verbose") |
| parser.add_argument("command", help="command to run") |
| parser.add_argument("arg", nargs='*', help="args for command") |
| |
| args = parser.parse_args() |
| |
| if args.verbose: |
| level = logging.DEBUG |
| else: |
| level = logging.INFO |
| |
| logging.basicConfig(level=level) |
| |
| sys.exit(run(args)) |
| |
| # vim: sw=4 et |