Blame | Last modification | View Log | Download | RSS feed
#!/usr/bin/env pythonfrom __future__ import print_function"""The clang static analyzer results viewer."""import sysimport impimport osimport posixpathimport threadingimport timetry:from urllib.request import urlopenexcept ImportError:from urllib2 import urlopenimport webbrowser# How long to wait for server to start.kSleepTimeout = .05kMaxSleeps = int(60 / kSleepTimeout)# Default server parameterskDefaultHost = '127.0.0.1'kDefaultPort = 8181kMaxPortsToTry = 100###def url_is_up(url):try:o = urlopen(url)except IOError:return Falseo.close()return Truedef start_browser(port, options):import webbrowserurl = 'http://%s:%d' % (options.host, port)# Wait for server to start...if options.debug:sys.stderr.write('%s: Waiting for server.' % sys.argv[0])sys.stderr.flush()for i in range(kMaxSleeps):if url_is_up(url):breakif options.debug:sys.stderr.write('.')sys.stderr.flush()time.sleep(kSleepTimeout)else:print('WARNING: Unable to detect that server started.', file=sys.stderr)if options.debug:print('%s: Starting webbrowser...' % sys.argv[0], file=sys.stderr)webbrowser.open(url)def run(port, options, root):# Prefer to look relative to the installed binaryshare = os.path.dirname(__file__) + "/../share/scan-view"if not os.path.isdir(share):# Otherwise look relative to the sourceshare = os.path.dirname(__file__) + "/../../scan-view/share"sys.path.append(share)import ScanViewtry:print('Starting scan-view at: http://%s:%d' % (options.host,port))print(' Use Ctrl-C to exit.')httpd = ScanView.create_server((options.host, port),options, root)httpd.serve_forever()except KeyboardInterrupt:passdef port_is_open(port):try:import socketserverexcept ImportError:import SocketServer as socketservertry:t = socketserver.TCPServer((kDefaultHost, port), None)except:return Falset.server_close()return Truedef main():import argparseparser = argparse.ArgumentParser(description="The clang static analyzer ""results viewer.")parser.add_argument("root", metavar="<results directory>", type=str)parser.add_argument('--host', dest="host", default=kDefaultHost, type=str,help="Host interface to listen on. (default=%s)" % kDefaultHost)parser.add_argument('--port', dest="port", default=None, type=int,help="Port to listen on. (default=%s)" % kDefaultPort)parser.add_argument("--debug", dest="debug", default=0,action="count",help="Print additional debugging information.")parser.add_argument("--auto-reload", dest="autoReload", default=False,action="store_true",help="Automatically update module for each request.")parser.add_argument("--no-browser", dest="startBrowser", default=True,action="store_false",help="Don't open a webbrowser on startup.")parser.add_argument("--allow-all-hosts", dest="onlyServeLocal",default=True, action="store_false",help='Allow connections from any host (access ''restricted to "127.0.0.1" by default)')args = parser.parse_args()# Make sure this directory is in a reasonable state to view.if not posixpath.exists(posixpath.join(args.root, 'index.html')):parser.error('Invalid directory, analysis results not found!')# Find an open port. We aren't particularly worried about race# conditions here. Note that if the user specified a port we only# use that one.if args.port is not None:port = args.portelse:for i in range(kMaxPortsToTry):if port_is_open(kDefaultPort + i):port = kDefaultPort + ibreakelse:parser.error('Unable to find usable port in [%d,%d)' %(kDefaultPort, kDefaultPort+kMaxPortsToTry))# Kick off thread to wait for server and start web browser, if# requested.if args.startBrowser:threading.Thread(target=start_browser, args=(port, args)).start()run(port, args, args.root)if __name__ == '__main__':main()