1*4882a593Smuzhiyun#! /usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (C) 2018 Garmin Ltd. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunimport os 9*4882a593Smuzhiyunimport sys 10*4882a593Smuzhiyunimport logging 11*4882a593Smuzhiyunimport argparse 12*4882a593Smuzhiyunimport sqlite3 13*4882a593Smuzhiyunimport warnings 14*4882a593Smuzhiyunwarnings.simplefilter("default") 15*4882a593Smuzhiyun 16*4882a593Smuzhiyunsys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), 'lib')) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunimport hashserv 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunVERSION = "1.0.0" 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunDEFAULT_BIND = 'unix://./hashserve.sock' 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun 25*4882a593Smuzhiyundef main(): 26*4882a593Smuzhiyun parser = argparse.ArgumentParser(description='Hash Equivalence Reference Server. Version=%s' % VERSION, 27*4882a593Smuzhiyun epilog='''The bind address is the path to a unix domain socket if it is 28*4882a593Smuzhiyun prefixed with "unix://". Otherwise, it is an IP address 29*4882a593Smuzhiyun and port in form ADDRESS:PORT. To bind to all addresses, leave 30*4882a593Smuzhiyun the ADDRESS empty, e.g. "--bind :8686". To bind to a specific 31*4882a593Smuzhiyun IPv6 address, enclose the address in "[]", e.g. 32*4882a593Smuzhiyun "--bind [::1]:8686"''' 33*4882a593Smuzhiyun ) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun parser.add_argument('-b', '--bind', default=DEFAULT_BIND, help='Bind address (default "%(default)s")') 36*4882a593Smuzhiyun parser.add_argument('-d', '--database', default='./hashserv.db', help='Database file (default "%(default)s")') 37*4882a593Smuzhiyun parser.add_argument('-l', '--log', default='WARNING', help='Set logging level') 38*4882a593Smuzhiyun parser.add_argument('-u', '--upstream', help='Upstream hashserv to pull hashes from') 39*4882a593Smuzhiyun parser.add_argument('-r', '--read-only', action='store_true', help='Disallow write operations from clients') 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun args = parser.parse_args() 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun logger = logging.getLogger('hashserv') 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun level = getattr(logging, args.log.upper(), None) 46*4882a593Smuzhiyun if not isinstance(level, int): 47*4882a593Smuzhiyun raise ValueError('Invalid log level: %s' % args.log) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun logger.setLevel(level) 50*4882a593Smuzhiyun console = logging.StreamHandler() 51*4882a593Smuzhiyun console.setLevel(level) 52*4882a593Smuzhiyun logger.addHandler(console) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun server = hashserv.create_server(args.bind, args.database, upstream=args.upstream, read_only=args.read_only) 55*4882a593Smuzhiyun server.serve_forever() 56*4882a593Smuzhiyun return 0 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun 59*4882a593Smuzhiyunif __name__ == '__main__': 60*4882a593Smuzhiyun try: 61*4882a593Smuzhiyun ret = main() 62*4882a593Smuzhiyun except Exception: 63*4882a593Smuzhiyun ret = 1 64*4882a593Smuzhiyun import traceback 65*4882a593Smuzhiyun traceback.print_exc() 66*4882a593Smuzhiyun sys.exit(ret) 67