Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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))
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)