def main(args=None): parser = ArgumentParser() parser.add_argument('-u', '--user', help='LDAP username') args = parser.parse_args(args) args.user = args.user or get_os_username() logging.basicConfig( level=logging.WARNING, format='%(asctime)s %(name)s %(levelname)s %(message)s') uptime(args)
def main(args=None): """ e.g. $ sa-notify --wework user1 --content 'xxx' $ echo 'xxx' | sa-notify --wework user1,user2 --email [email protected] [email protected] """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( "-u", "--user", help="LDAP username, use your OS user name by default.") parser.add_argument("-c", "--content", help="content.") parser.add_argument("-s", "--subject", help='subject. default="%(default)s"', default=DEFAULT_TITLE) parser.add_argument("-f", "--from-addr", help="From address, currently only works for email.") parser.add_argument( "--company", help= "Company user in, used when multiple company or tenant is configured.") for type_ in NOTIFY_TYPES: parser.add_argument("--%s" % type_, nargs="*", help="your enterprise address of %s." % type_) parser.add_argument( "--markdown", help="use markdown rendering, only wework & telegram supported", action="store_true", ) args = parser.parse_args(args) args.user = args.user or get_os_username() logging.basicConfig( level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s") if not any(vars(args)[type_] for type_ in NOTIFY_TYPES): parser.error("too few arguments") if args.content is None: args.content = sys.stdin.read() if not args.content: parser.error("content empty") notify(args)
def main(args=None): """ e.g. $ sa-notify --wechat user1 --content 'xxx' $ echo 'xxx' | sa-notify --wechat user1,user2 --email [email protected] [email protected] """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('-c', '--content', help='content.') parser.add_argument('-s', '--subject', help='subject. default="%(default)s"', default=DEFAULT_TITLE) parser.add_argument('-f', '--from-addr', help='From address, currently only works for email.') for type_ in NOTIFY_TYPES: parser.add_argument('--%s' % type_, nargs='*', help='your enterprise address of %s.' % type_) args = parser.parse_args(args) args.user = args.user or get_os_username() logging.basicConfig( level=logging.INFO, format='%(asctime)s %(name)s %(levelname)s %(message)s') if not any(vars(args)[type_] for type_ in NOTIFY_TYPES): parser.error("too few arguments") if args.content is None: args.content = sys.stdin.read() if not args.content: parser.error("content empty") notify(args)
def main(): """ e.g. API DOC: https://cloud.tencent.com/document/api/386/6632 $ sa-bs device list -j $ sa-bs device list -a alias $ sa-bs device list --alias host $ sa-bs vpc list -e createTime vpcId $ sa-bs vpc subnet $ sa-bs vpc subnet_ips --vpcId 1001 --subnetId 6555 -j $ sa-bs vpc subnet_ips --subnetName SA $ sa-bs vpc subnet_by_cpm_id --alias host22 $ sa-bs eip list -a eip $ sa-bs lb list $ sa-bs -vvvv eip list --eipIds '[\\"eip-xxxxxxxx\\"]' -r $ sa-bs eip list --eip 1.1.1.1 $ sa-bs vpc register_batch_ip --subnetName SA --ip 10.0.0.1 $ sa-bs eip apply $ sa-bs eip bind_vpc_ip --eip 1.1.1.1 --vpcIp 10.0.0.1 $ sa-bs vpc create_interface --alias host11 host22 --subnetName DBA-dummy $ sa-bs device reload_os --passwd XXXXXX --subnetName OfflineComputation --alias host88 $ sa-bs device modify_alias --alias host33 --instanceId cpm-xxxxxxxx $ sa-bs -vvvv vpc create_subnet --subnetName Isolation-dummy --cidrBlock 10.0.1.0/24 --vlanId 2222 ## 机型组合 $ sa-bs device list -e deviceClassCode $ sa-bs device os --deviceClassCode Y0-BS09v2 -a osNameDisplay osTypeId $ sa-bs device class_partition --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 --deviceClassCode "Y0-BS09v2" $ sa-bs device class_partition --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 $ sa-bs device elastic_price --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 $ sa-bs device inventory --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 --deviceClassCode "Y0-BS09v2" --subnetName OfflineComputation $ sa-bs device hardware_info --alias host11 $ sa-bs device hardware_specification ### 购买机器 ( see https://cloud.tencent.com/document/api/386/6638 ) $ sa-bs device buy --goodsNum 2 --timeSpan 1 --timeUnit m --alias new_host \ --subnetName SA --ip 10.0.0.2 10.0.0.3 \ --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 \ --raidId 25 \ --deviceClassCode "Y0-BS09v2" --needSecurityAgent 0 --needMonitorAgent 0 --autoRenewFlag 1 $ sa-bs device deploy_process --instanceId cpm-xxxxxxxx $ sa-bs device deploy_process --alias host11 $ sa-bs device operation_log --alias host22 ## CVM $ sa-bs cvm instances """ # NOQA parser = argparse.ArgumentParser(epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('-v', '--verbose', action='count', default=0, help='verbose.') # compatible with py2 & 3 subparsers = parser.add_subparsers(help='Sub commands', dest='subparser') subparsers.required = True # level = logging.DEBUG # logging.basicConfig(level=level, # format='%(asctime)s %(name)s %(levelname)s %(message)s') device_parser = subparsers.add_parser('device', help='') populate_subparser(device_parser, mod_suffix='bm') device_parser.set_defaults(func=device) eip_parser = subparsers.add_parser('eip', help='') populate_subparser(eip_parser, mod_suffix='bmEip') eip_parser.set_defaults(func=bmeip) lb_parser = subparsers.add_parser('lb', help='') populate_subparser(lb_parser, mod_suffix='bmLb') lb_parser.set_defaults(func=bmlb) vpc_parser = subparsers.add_parser('vpc', help='') populate_subparser(vpc_parser, mod_suffix='bmVpc') vpc_parser.set_defaults(func=bmvpc) cvm_parser = subparsers.add_parser('cvm', help='') populate_subparser(cvm_parser, mod_suffix='Cvm') cvm_parser.set_defaults(func=cvm) args = parser.parse_args() args.user = args.user or get_os_username() level = logging.WARNING - args.verbose * 10 logging.basicConfig(level=level, format='%(asctime)s %(name)s %(levelname)s %(message)s') sys.exit(args.func(args))
def main(): """ e.g. # try test $ sa-icinga notify --wechat lihan --email [email protected] --test # need icinga pass os environment vars $ sa-icinga notify --wechat lihan --email [email protected] # icinga2 doc: http://docs.icinga.org/icinga2/latest/doc/module/icinga2/toc $ sa-icinga ack --host sa --service check-puppet --comment 'hehe' $ sa-icinga ack --host 'sa*' --service 'check-puppet' $ sa-icinga ack --host 'sa*' --service 'check-puppet' --remove $ sa-icinga show --filter 'host.name == "sa" && service.name == "check-puppet"' $ sa-icinga show --type host --filter 'match("sa*", host.name)' | less $ sa-icinga show --type service --filter 'regex("check_[a-z]*", service.name)' | less $ sa-icinga show --type notification --filter 'notification.host_name == "sa"' | less $ sa-icinga show --type user | grep lihan $ sa-icinga show --filter 'service.name == "check-puppet"' --attrs acknowledgement """ parser = argparse.ArgumentParser(epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('-v', '--verbose', help='Show more infomation.', action='store_true') # compatible with py2 & 3 subparsers = parser.add_subparsers(help='Sub commands', dest='subparser') subparsers.required = True notify_parser = subparsers.add_parser('notify', help='Notify.') notify_parser.add_argument('--test', action='store_true', help='test') for type_ in NOTIFY_TYPES: notify_parser.add_argument('--%s' % type_, nargs='*', help='your enterprise address of %s.' % type_) notify_parser.set_defaults(func=notify) notify_parser.set_defaults(parser_name='notify') ack_parser = subparsers.add_parser('ack', help='Acknowledge service or host problem.') ack_parser.add_argument('--host', '-H', help='host', required=True) ack_parser.add_argument('--service', '-s', help='service') ack_parser.add_argument('--comment', '-c', help='comment', default='ack by sa-icinga') ack_parser.add_argument('--notify', help='whether notify', default=False, action='store_true') ack_parser.add_argument('--remove', help='remove ack', action='store_true') ack_parser.set_defaults(func=ack) ack_parser.set_defaults(parser_name='ack') show_parser = subparsers.add_parser('show', help='Show objects.') show_parser.add_argument('--type', '-t', help='type of objects', default='service') show_parser.add_argument('--filter', '-f', help='filter') show_parser.add_argument('--attrs', '-a', help='attrs of the objects to show', nargs='*') show_parser.add_argument('--raw', '-r', help='ouput raw json data', action='store_true') show_parser.set_defaults(func=show) show_parser.set_defaults(parser_name='show') args = parser.parse_args() args.user = args.user or get_os_username() logging.basicConfig(level=logging.INFO, format='%(asctime)s %(name)s %(levelname)s %(message)s') if not args.verbose: requests_logger.setLevel(logging.ERROR) if args.parser_name == 'notify': if not any(vars(args)[type_] for type_ in NOTIFY_TYPES): notify_parser.error("too few arguments") args.func(args)
def main(): """ e.g. ## query ### normal query $ sa-access query --term ip 1.1.1.1 $ sa-access query -q 2.2.2.2 --term appname app1 -n 20 $ sa-access query --term appname app1 remote_addr 2.2.2.2 -n 10 $ sa-access query -q 'remote_addr:[1.1.1.0 TO 1.1.1.254]' -n10 $ sa-access query -q 'remote_addr:"1.1.1.0/24"' -n10 ### aggs query $ sa-access query -x bandwidth $ sa-access query -x sum bytes_sent $ sa-access query -t host movie.example.com -x bandwidth --by dt 30s $ sa-access query -t host movie.example.com -x max bytes_sent --by dt 30s $ sa-access query -q 'Baiduspider' -t host movie.example.com -x bandwidth --by nurl $ sa-access query -t host movie.example.com -x bandwidth --by ip $ sa-access query -x count --by ip $ sa-access query -x unique_count browser_id --by ip #### by multi field or script $ sa-access query --term appname app1 -x count --by-multi remote_addr normalize_url $ sa-access query --term appname app1 -x count \ --by-script "doc['remote_addr'].value + ' ' + doc['normalize_url'].value" ##### by ip and nurl $ sa-access query --term appname app1 -x count \ --by-script "def ip=doc['remote_addr'].value; \ ip + ' ' + doc['normalize_url'].value" ###### If you use old version elasticsearch, you will get ip in long integer, then you can do the following: $ sa-access query --term appname app1 -x count \ --by-script "def ip=doc['remote_addr'].value;(ip >>24) \ + '.' + ((ip >> 16) % 256) + '.' + ((ip >> 8) % 256) \ + '.' + (ip % 256) + ' ' + doc['normalize_url'].value" ##### by ip section and nurl $ sa-access query --term appname app1 -x count \ --by-script "def ip=doc['remote_addr'].value; \ ip.substring(0, ip.lastIndexOf('.')) + ' ' + doc['normalize_url'].value" ## analyze ### qps is abnormal, we try to find which (ip, nurl) pair contribute to it. $ sa-access analyze --term appname app1 -x count --by-multi remote_addr nurl $ sa-access analyze --term appname app1 -x bandwidth --by-multi nurl $ sa-access analyze --term host music.example.com -x count --by nurl \ -a '2017-03-28 09:30' -d 15 -b '2017-03-28 10:30' ## explain $ sa-access explain $ sa-access explain -f remote_addr upstream_response_time """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('-v', '--verbose', action='count', default=0, help='verbose.') # compatible with py2 & 3 subparsers = parser.add_subparsers(help='Sub commands', dest='subparser') subparsers.required = True explain_parser = subparsers.add_parser( 'explain', help='show the explanation of fields') explain_parser.add_argument('-f', '--field', nargs='*', help='es doc field') explain_parser.set_defaults(func=explain) # TODO: support more time format # sub command, diff tops analyze_parser = subparsers.add_parser('analyze', help='analyze access log to find ' 'abnormal IP, UA, UID, NURL, etc.') analyze_parser.add_argument('-r', '--raw', action='store_true', help='Whether to use raw json output.') analyze_parser.add_argument('-q', '--query-string', help='Lucene query string.') analyze_parser.add_argument('-t', '--term', nargs='*', metavar='<term name> <term value>', help='term query.') # time analyze_parser.add_argument( '-a', '--start-normal', type=timeformat, default=timeformat(-30), help='start time of the normal period(default: %(default)s ' 'means %(default)s mins before, or specify datetime string).') analyze_parser.add_argument( '-b', '--start-abnormal', type=timeformat, default=timeformat(-15), help='start time of the abnormal period(default: %(default)s ' 'means %(default)s mins before, or specify datetime string).') analyze_parser.add_argument('-d', '--duration', type=int, default=15, help='time duration(default: %(default)s ' 'means a duration of %(default)s mins).') # aggs analyze_parser.add_argument('-N', '--agg-number', type=int, default=20, help='size of agg y(default: %(default)s).') analyze_parser.add_argument('-x', '--agg-x', nargs='*', required=True, help='x of the aggregation(built-in: %s, ' 'or custom: `<agg_func> <field>`).' % builtin_x) analyze_parser.add_argument('-y', '--agg-y', '--by', nargs='*', help='y of the aggregation(built-in: %s, ' 'or custom: `<field>`).' % builtin_y) analyze_parser.add_argument('-m', '--agg-multi-y', '--by-multi', nargs='*', help='y of the aggregation, multi field') analyze_parser.add_argument('-S', '--agg-script-y', '--by-script', help='y of the aggregation, script') analyze_parser.set_defaults(func=analyze) query_parser = subparsers.add_parser('query', help='query nginx access') query_parser.add_argument('-r', '--raw', action='store_true', help='Whether to use raw json output.') query_parser.add_argument('-q', '--query-string', help='Lucene query string.') query_parser.add_argument( '-s', '--start', type=timeformat, default=timeformat(-15), help='start time(default: %(default)s ' 'means %(default)s mins before, or specify datetime string).') query_parser.add_argument('-d', '--duration', type=int, default=15, help='time duration(default: %(default)s ' 'means a duration of %(default)s mins).') query_parser.add_argument( '-n', '--number', type=int, help='number of documents(default: 0 for aggs query, ' '{doc_query_default} for only-docs query).'.format( doc_query_default=N_DOC_DEFAULT)) query_parser.add_argument('-t', '--term', nargs='*', metavar='<term name> <term value>', help='term query.') # aggs query_parser.add_argument('-N', '--agg-number', type=int, default=20, help='size of agg y(default: %(default)s).') query_parser.add_argument('-x', '--agg-x', nargs='*', help='x of the aggregation(built-in: %s, ' 'or custom: `<agg_func> <field>`).' % builtin_x) query_parser.add_argument('-y', '--agg-y', '--by', nargs='*', help='y of the aggregation(built-in: %s, ' 'or custom: `<field>`).' % builtin_y) query_parser.add_argument('-m', '--agg-multi-y', '--by-multi', nargs='*', help='y of the aggregation, multi field') query_parser.add_argument('-S', '--agg-script-y', '--by-script', help='y of the aggregation, script') query_parser.add_argument('--min-value', '--min', help='filter result entires with the min value') query_parser.set_defaults(func=query) args = parser.parse_args() args.user = args.user or get_os_username() if args.func == query: if args.term and len(args.term) % 2: parser.error('-t/--term should accept name/value pairs.') if not args.agg_x and (args.agg_y or args.agg_multi_y or args.agg_script_y): parser.error('-x/--agg-x should be provided.') if args.start is None: parser.error( '-s/--start invalid, must be negative integer, or datetime string' ) if args.func == analyze: if args.term and len(args.term) % 2: parser.error('-t/--term should accept name/value pairs.') if not args.agg_y and not args.agg_multi_y and not args.agg_script_y: parser.error('aggs y should be provided.') if args.start_abnormal is None or args.start_normal is None: parser.error( '-a, -b invalid, must be negative integer, or datetime string') levels = [level for v, level in VERBOSE_LEVEL if args.verbose >= v] level = min(levels) logging.getLogger("requests").setLevel(level) logging.getLogger("elasticsearch").setLevel(level) logging.basicConfig( level=level, format='%(asctime)s %(name)s %(levelname)s %(message)s') sys.exit(args.func(args))
def main(args=None): """ e.g. $ sa-dns ensure sub1.subdomain1 --type CNAME --value {domain}.anotherdomain. --enable $ sa-dns remove subdomain1,subdomain2 $ sa-dns -d example.com dump $ sa-dns show -tlu """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('-d', '--domain', default=DOMAIN, help='Top level domain. (default: %(default)s)') # compatible with py2 & 3 subparsers = parser.add_subparsers(help='Sub commands', dest='subparser') subparsers.required = True dump_parser = subparsers.add_parser('dump', help='Dump dns records.') dump_parser.set_defaults(func=dump) dump_parser.set_defaults(parser_name='dump') list_parser = subparsers.add_parser('list', help='List dns records.') list_parser.add_argument('-s', '--search', help='Filter by search keywords.') list_parser.add_argument('-S', '--sub-domain', help='Filter by sub domain.') list_parser.set_defaults(func=list_) list_parser.set_defaults(parser_name='list') show_parser = subparsers.add_parser('show', help='Show information.') show_parser.add_argument('-t', '--record-type', action='store_true', help='Show record type supported') show_parser.add_argument('-l', '--record-line', action='store_true', help='Show record line supported') show_parser.add_argument('-u', '--user-log', action='store_true', help='Show user log') show_parser.set_defaults(func=show) show_parser.set_defaults(parser_name='show') ensure_parser = subparsers.add_parser( 'ensure', help="Add or modified, " "ensure the dns records that demanded to present.") ensure_parser.add_argument('sub_domains', help='Sub domains, comma-separated.') ensure_parser.add_argument('--type', choices=['A', 'CNAME', 'MX', 'TXT'], required=True, help='DNS record type.') ensure_parser.add_argument( '--value', required=True, help='DNS record value. ' 'Support pattern, like `{domain}.h1.aqb.so`. ' 'Avaliable variable are domain, sub_domain, type') ensure_parser.add_argument('--ttl', default=DEFAULT_TTL, help='DNS record time-to-live.' '(default: %(default)s)') ensure_parser.add_argument('--mx', default=DEFAULT_MX, help='MX priority value, required by MX record.' '(default: %(default)s)') ensure_parser.add_argument('--line', default=DEFAULT_LINE, help='DNS record line.' '(default: %(default)s)') ensure_status = ensure_parser.add_mutually_exclusive_group(required=True) ensure_status.add_argument('--enable', action='store_true', help='Enable the DNS records.') ensure_status.add_argument('--disable', action='store_true', help='Disable the DNS records.') ensure_parser.add_argument( '--excl', '--exclusive', action='store_true', help='Exclusive, disable other records with the same type.') ensure_parser.add_argument('--dry-run', action='store_true', help='Dry run.') ensure_parser.set_defaults(func=ensure) ensure_parser.set_defaults(parser_name='ensure') remove_parser = subparsers.add_parser('remove', help='Remove dns records.') remove_parser.add_argument('sub_domains', help='Sub domains, comma-separated.') remove_parser.add_argument('--type', choices=['', 'A', 'CNAME', 'MX', 'TXT'], default='', help='DNS record type.') remove_parser.add_argument( '--value', default='', help='DNS record value. ' 'Support pattern, like `{domain}.h1.aqb.so`. ' 'Avaliable variable are domain, sub_domain, type') remove_parser.add_argument('--line', default=DEFAULT_LINE, help='DNS record line.' '(default: %(default)s)') remove_parser.add_argument('--dry-run', action='store_true', help='Dry run.') remove_parser.set_defaults(func=remove) remove_parser.set_defaults(parser_name='remove') monitor_parser = subparsers.add_parser('monitor', help='DNSPod Monitor.') monitor_subparser = monitor_parser.add_subparsers( help='Monitor Sub Commands.') monitor_list_parser = monitor_subparser.add_parser('list', help='List monitors.') monitor_list_parser.add_argument('-a', '--all', action='store_true', help='List all monitors.') monitor_list_parser.add_argument('-S', '--sub-domain', help='Filter by sub domain.') monitor_list_parser.set_defaults(func=list_monitor) monitor_add_parser = monitor_subparser.add_parser('add', help='Add monitors.') monitor_add_parser.add_argument('sub_domains', help='Sub domains, comma-separated.') monitor_add_parser.add_argument( '-p', '--port', default=80, help='monitor HTTP(S) port.(default: %(default)s)') monitor_add_parser.add_argument( '-i', '--monitor-interval', default=60, choices=[60, 180, 360, 600], help='monitor interval. (default: %(default)s)') monitor_add_parser.add_argument( '-t', '--monitor-schema-type', default='http', choices=['http', 'https'], help='monitor schema type. (default: %(default)s)') monitor_add_parser.add_argument( '-P', '--monitor-uri-path', default='/', help='monitor uri path. (default: %(default)s)') monitor_add_parser.add_argument( '--points', default='ctc,cuc,cmc,ctc-2,cuc-2,cmc-2,ctc-3,cuc-3,cmc-3', help='comma-separated monitor points/probes. (default: %(default)s)') monitor_add_parser.add_argument( '-b', '--bak-ip-mode', default='pass', help= 'chose from pass, pause, pause2, auto or comma-separated ip. (default: %(default)s)' ) monitor_add_parser.add_argument( '--send-to-callback', action='store_true', help='whether send to dns monitor callback') monitor_add_parser.add_argument('--dry-run', action='store_true', help='Dry run.') monitor_add_parser.set_defaults(func=add_monitor) monitor_remove_parser = monitor_subparser.add_parser( 'remove', help='Remove monitors.') monitor_remove_parser.add_argument('sub_domains', help='Sub domains, comma-separated.') monitor_remove_parser.add_argument('--dry-run', action='store_true', help='Dry run.') monitor_remove_parser.set_defaults(func=remove_monitor) args = parser.parse_args(args) args.user = args.user or get_os_username() logging.basicConfig( level=logging.INFO, format='%(asctime)s %(name)s %(levelname)s %(message)s') args.func(args)
def main(): """ e.g. # try test $ sa-icinga notify --wework lihan --email [email protected] --test # need icinga pass os environment vars $ sa-icinga notify --wework lihan --email [email protected] # icinga2 doc: http://docs.icinga.org/icinga2/latest/doc/module/icinga2/toc $ sa-icinga ack --host sa --service check-puppet --comment 'hehe' $ sa-icinga ack --host 'sa*' --service 'check-puppet' $ sa-icinga ack --host 'sa*' --service 'check-puppet' --remove $ sa-icinga show --filter 'host.name == "sa" && service.name == "check-puppet"' $ sa-icinga show --type host --filter 'match("sa*", host.name)' | less $ sa-icinga show --type service --filter 'regex("check_[a-z]*", service.name)' | less $ sa-icinga show --type notification --filter 'notification.host_name == "sa"' | less $ sa-icinga show --type user | grep lihan $ sa-icinga show --filter 'service.name == "check-puppet"' --attrs acknowledgement """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) parser.add_argument("-u", "--user", help="LDAP username, use your OS user name by default.") parser.add_argument("-v", "--verbose", help="Show more infomation.", action="store_true") # compatible with py2 & 3 subparsers = parser.add_subparsers(help="Sub commands", dest="subparser") subparsers.required = True notify_parser = subparsers.add_parser("notify", help="Notify.") notify_parser.add_argument("--test", action="store_true", help="test") notify_parser.add_argument("--company", help="Company that this user is in, will be passed to notify function") for type_ in NOTIFY_TYPES: notify_parser.add_argument( "--%s" % type_, nargs="*", help="your enterprise address of %s." % type_ ) notify_parser.set_defaults(func=notify) notify_parser.set_defaults(parser_name="notify") ack_parser = subparsers.add_parser("ack", help="Acknowledge service or host problem.") ack_parser.add_argument("--host", "-H", help="host", required=True) ack_parser.add_argument("--service", "-s", help="service") ack_parser.add_argument("--comment", "-c", help="comment", default="ack by sa-icinga") ack_parser.add_argument("--notify", help="whether notify", default=False, action="store_true") ack_parser.add_argument("--remove", help="remove ack", action="store_true") ack_parser.set_defaults(func=ack) ack_parser.set_defaults(parser_name="ack") show_parser = subparsers.add_parser("show", help="Show objects.") show_parser.add_argument("--type", "-t", help="type of objects", default="service") show_parser.add_argument("--filter", "-f", help="filter") show_parser.add_argument("--attrs", "-a", help="attrs of the objects to show", nargs="*") show_parser.add_argument("--raw", "-r", help="ouput raw json data", action="store_true") show_parser.set_defaults(func=show) show_parser.set_defaults(parser_name="show") args = parser.parse_args() args.user = args.user or get_os_username() logging.basicConfig(level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s") if not args.verbose: requests_logger.setLevel(logging.ERROR) if args.parser_name == "notify": if not any(vars(args)[type_] for type_ in NOTIFY_TYPES): sys.exit(0) args.func(args)
def main(): """ e.g. sa-disk usage sa-disk usage -n 5 -d 3 sa-disk usage -r /data1/ncdu-export-%-20160513142844.gz sa-disk usage -c /tmp sa-disk usage -p /data sa-disk usage --force-check sa-disk clean """ parser = argparse.ArgumentParser( epilog=main.__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '-u', '--user', help='LDAP username, use your OS user name by default.') parser.add_argument('--debug', action='store_true', help='debug.') # compatible with py2 & 3 subparsers = parser.add_subparsers(help='Sub commands', dest='subparser') subparsers.required = True usage_parser = subparsers.add_parser('usage', help='Disk usage operation.') usage_parser.add_argument('-p', '--ncdu-data-path', help='Path to store ncdu exported data', default=None) usage_parser.add_argument('-r', '--data-file', metavar='DATA_FILE', help='Read ncdu export data file.') usage_parser.add_argument('-n', '--topn', type=int, nargs='?', help='Specify top N huge files for output.', const=5) usage_parser.add_argument('-d', '--max-depth', type=int, help='Max path depth to calc top N.', default=3) usage_parser.add_argument('-c', '--check-path', metavar='CHECK_PATH', help='Check disk and export ncdu data file.', default=DEFAULT_CHECK_PATH) usage_parser.add_argument( '-f', '--force-check', action='store_true', help='force check, do not use existing exported file') usage_parser.add_argument( '-R', '--force-read', action='store_true', help='force read latest exported data file, do not check') usage_parser.add_argument('-b', '--block', action='store_true', help='disk usage check block mode.') usage_parser.set_defaults(func=usage) clean_parser = subparsers.add_parser( 'clean', help='Clean disk, including outdated ncdu ' 'exported data file.') clean_parser.set_defaults(func=clean) args = parser.parse_args() args.user = args.user or get_os_username() log_level = logging.DEBUG if args.debug else logging.INFO # logger.setLevel(log_level) # ch = logging.StreamHandler() # ch.setLevel(log_level) # formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') # ch.setFormatter(formatter) # logger.addHandler(ch) logging.basicConfig( level=log_level, format='%(asctime)s %(name)s %(levelname)s %(message)s') args.func(args)