@ -18,12 +18,14 @@
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import socket
import binascii
import datetime
import time
import sys
import math
import re
import binascii
import select
import socket
import sys
import time
HAS_PSUTIL = False
try :
@ -349,6 +351,10 @@ def main():
state = params [ ' state ' ]
path = params [ ' path ' ]
search_regex = params [ ' search_regex ' ]
if search_regex is not None :
compiled_search_re = re . compile ( search_regex , re . MULTILINE )
else :
compiled_search_re = None
if port and path :
module . fail_json ( msg = " port and path parameter can not both be passed to wait_for " )
@ -404,55 +410,72 @@ def main():
if path :
try :
os . stat ( path )
if search_regex :
try :
f = open ( path )
try :
if re . search ( search_regex , f . read ( ) , re . MULTILINE ) :
break
else :
time . sleep ( 1 )
finally :
f . close ( )
except IOError :
time . sleep ( 1 )
pass
else :
break
except OSError , e :
# File not present
if e . errno == 2 :
time . sleep ( 1 )
else :
# If anything except file not present, throw an error
if e . errno != 2 :
elapsed = datetime . datetime . now ( ) - start
module . fail_json ( msg = " Failed to stat %s , %s " % ( path , e . strerror ) , elapsed = elapsed . seconds )
# file doesn't exist yet, so continue
else :
# File exists. Are there additional things to check?
if not compiled_search_re :
# nope, succeed!
break
try :
f = open ( path )
try :
if re . search ( compiled_search_re , f . read ( ) ) :
# String found, success!
break
finally :
f . close ( )
except IOError :
pass
elif port :
alt_connect_timeout = math . ceil ( ( end - datetime . datetime . now ( ) ) . total_seconds ( ) )
try :
s = _create_connection ( ( host , port ) , connect_timeout )
if search_regex :
s = _create_connection ( ( host , port ) , min ( connect_timeout , alt_connect_timeout ) )
except :
# Failed to connect by connect_timeout. wait and try again
pass
else :
# Connected -- are there additional conditions?
if compiled_search_re :
data = ' '
matched = False
while 1 :
data + = s . recv ( 1024 )
if not data :
while datetime . datetime . now ( ) < end :
max_timeout = math . ceil ( ( end - datetime . datetime . now ( ) ) . total_seconds ( ) )
( readable , w , e ) = select . select ( [ s ] , [ ] , [ ] , max_timeout )
if not readable :
# No new data. Probably means our timeout
# expired
continue
response = s . recv ( 1024 )
if not response :
# Server shutdown
break
elif re . search ( search_regex , data , re . MULTILINE ) :
data + = response
if re . search ( compiled_search_re , data ) :
matched = True
break
# Shutdown the client socket
s . shutdown ( socket . SHUT_RDWR )
s . close ( )
if matched :
s . shutdown ( socket . SHUT_RDWR )
s . close ( )
# Found our string, success!
break
else :
# Connection established, success!
s . shutdown ( socket . SHUT_RDWR )
s . close ( )
break
except :
time . sleep ( 1 )
pass
else :
time . sleep ( 1 )
else :
# Conditions not yet met, wait and try again
time . sleep ( 1 )
else : # while-else
# Timeout expired
elapsed = datetime . datetime . now ( ) - start
if port :
if search_regex :
@ -485,4 +508,5 @@ def main():
# import module snippets
from ansible . module_utils . basic import *
main ( )
if __name__ == ' __main__ ' :
main ( )