61 lines
1.3 KiB
Python
Executable File
61 lines
1.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import argparse
|
|
import socket
|
|
import time
|
|
import os
|
|
import signal
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'--timeout', '-t',
|
|
type=int,
|
|
metavar='SECONDS',
|
|
help='Number of seconds to wait for host',
|
|
)
|
|
parser.add_argument(
|
|
'host',
|
|
help='Remote host name',
|
|
)
|
|
parser.add_argument(
|
|
'service',
|
|
nargs='?',
|
|
default='ssh',
|
|
help='Service/port on remote host',
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def wait_for(host, service, timeout=None):
|
|
if timeout:
|
|
deadline = time.time() + timeout
|
|
else:
|
|
deadline = None
|
|
while True:
|
|
try:
|
|
sock = socket.create_connection((host, service))
|
|
except socket.error:
|
|
if deadline and time.time() >= deadline:
|
|
break
|
|
time.sleep(1)
|
|
else:
|
|
sock.close()
|
|
return True
|
|
return False
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
|
|
try:
|
|
if not wait_for(args.host, args.service, args.timeout):
|
|
raise SystemExit(1)
|
|
except KeyboardInterrupt:
|
|
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
|
os.kill(os.getpid(), signal.SIGINT)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|