diff --git a/wait_for b/wait_for index 201063d6a02..e1cc1b38e00 100644 --- a/wait_for +++ b/wait_for @@ -27,32 +27,57 @@ def main(): module = AnsibleModule( argument_spec = dict( - name=dict(required=True), + host=dict(default='127.0.0.1'), timeout=dict(default=300), - port=dict(default=22), + delay=dict(default=0), + port=dict(required=True), + state=dict(default='started', choices=['started', 'stopped']), ), ) params = module.params - host = params['name'] + host = params['host'] timeout = int(params['timeout']) + delay = int(params['delay']) port = int(params['port']) + state = params['state'] - end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + if delay: + time.sleep(delay) - while datetime.datetime.now() < end: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - s.connect( (host, port) ) - s.close() - break - except: - time.sleep(1) - else: - module.fail_json(msg="Timeout when waiting for %s"%(host)) + if state is 'stopped': + ### first wait for the host to go down + end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) - module.exit_json(msg="%s responds on %s"%(host, port)) + while datetime.datetime.now() < end: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(5) + try: + s.connect( (host, port) ) + s.close() + time.sleep(1) + except: + break + else: + module.fail_json(msg="Timeout when waiting for %s to stop."%(host)) + + if state is 'started': + ### wait for the host to come up + end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + + while datetime.datetime.now() < end: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect( (host, port) ) + s.close() + break + except: + time.sleep(1) + else: + module.fail_json(msg="Timeout when waiting for %s"%(host)) + + module.exit_json(state=state, port=port) # this is magic, see lib/ansible/module_common.py #<>