| 
					
				 | 
			
			
				@@ -0,0 +1,92 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#!/usr/bin/python3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# coding: utf-8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ Installation notes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# To get it working (SNI support) on debian wheezy: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# - apt-get install python3-openssl python3-minimal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# - apt-get install -t wheezy-backports python3-requests python3-urllib3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ Imports 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import re 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import argparse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import requests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import traceback 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ Constants 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_NAME = "web-checker" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_DESC = "tool to check web page content" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_VERSION = "0.1" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ WebPage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class WebPage(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _options = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _elapsed = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, options): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._options = options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def elapsed(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return "%.3f" % (self._elapsed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def check(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        start_time = time.time() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        r = requests.get(self._options.url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                timeout=self._options.timeout, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                verify=not self._options.no_ssl_verify) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._elapsed = time.time() - start_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if r.status_code != self._options.status: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            raise AssertionError('Wrong HTTP code returned: %d != %d' % (r.status_code, self._options.status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if self._options.regexp is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                exp = re.compile(self._options.regexp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise ValueError('Content regex is invalid: %s' % (self._options.regexp)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            matched = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if hasattr(r, 'text') and r.text is not None and exp.findall(r.text) != []: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                matched = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif hasattr(r, 'content') and r.content is not None and exp.findall(r.content) != []: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                matched = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not matched: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise AssertionError('Web page content do not match regexp: %s' % (self._options.regexp)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ main 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def main(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser = argparse.ArgumentParser(prog=_NAME, description=_DESC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-v', '--version', action='version', version='%(prog)s ' + _VERSION ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-d', '--debug', dest='debug', default=False, action='store_true', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            help='Print additional debug informations: traceback, etc. (default: no)') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-t', '--timeout', dest='timeout', default=5, type=int, help='Timeout in seconds') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-s', '--status', dest='status', default=200, type=int, help='Expected HTTP status') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-r', '--regexp', dest='regexp', default=None, help='Regexp matching for web page content') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-n', '--no-ssl-verify', dest='no_ssl_verify', default=False, action='store_true', help='Disable SSL certificate verification') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('-E', '--elapsed', dest='elapsed', default=False, action='store_true', help='Return elapsed time instead of status') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument('url') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    options = parser.parse_args() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        w = WebPage(options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        w.check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = w.elapsed() if options.elapsed else 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = '' if options.elapsed else 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if options.debug: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print('Exception raised: %s' % (e)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            traceback.print_exc(file=sys.stderr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sys.exit(-1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    print(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# {{{ __main__ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if __name__ == "__main__": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    main() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# }}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# vim: foldmethod=marker foldlevel=0 foldenable 
			 |