#!/usr/bin/python # Copyright (c) 2016, Globo.com <https://github.com/globocom> # This file is part of globocom/zabbix-scripts # (see https://github.com/globocom/zabbix-scripts). # License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause from os import path from sys import argv, exit from logprint import LogPrint from pyzabbix import ZabbixAPI from argparse import ArgumentParser from progressbar import ProgressBar, Percentage, ETA, ReverseBar, RotatingMarker, Timer parser = ArgumentParser(description = 'This script removes all hosts from a given hostgroup id. It can also remove a host by its name.') parser.add_argument('--url', dest = 'url', required = True, help = 'Zabbix server address') parser.add_argument('--user', dest = 'user', required = True, help = 'Zabbix user') parser.add_argument('--password', dest = 'password', required = True, help = 'Zabbix password') parser.add_argument('--no-verbose', dest = 'verbose', action = 'store_false', help = 'Don\'t show any logs on screen') parser.add_argument('--verbose', dest = 'verbose', action = 'store_true') parser.set_defaults(verbose=False) parser.add_argument('--loglevel', dest = 'loglevel', default = 'ERROR', help = 'Debug level. DEBUG/INFO/WARNING/ERROR/CRITICAL') parser.add_argument('--hostname', dest = 'hostname', help = 'Host name to be removed') parser.add_argument('--groupname', dest = 'groupname', help = 'Hostgroup name to be cleaned (all hosts DELETED)! USE WITH CAUTION') parser.add_argument('--no-run', dest = 'run', action = 'store_false', help = 'Don\'t remove anything, just count (works only with hostgroup)') parser.add_argument('--run', dest = 'run', action = 'store_true', help = 'Remove every match (works only with hostgroup)') args = parser.parse_args() TIMEOUT = 30.0 LOGFILE = "/tmp/%s.log" % path.basename(argv[0]) logger = LogPrint(echo=args.verbose, logfile=LOGFILE, loglevel=args.loglevel.upper()) if not args.hostname and not args.groupname: logger.error('You MUST use at least one of --hostname or --groupname.') exit(1) try: zapi = ZabbixAPI(args.url,timeout=TIMEOUT) zapi.login(args.user,args.password) except Exception, e: logger.error("Unable to login: %s" % (e)) exit(1) def deleteHostByName(hostname): logger.print_json(zapi.globo.deleteMonitors(host=hostname)) return def deleteHostsByHostgroup(groupname): hostgroup = zapi.hostgroup.get(output=['groupid'],filter={'name': groupname}) if hostgroup.__len__() != 1: logger.error('Hostgroup not found: %s\n\tFound this: %s' % (groupname,hostgroup)) groupid = int(hostgroup[0]['groupid']) hosts = zapi.host.get(output=['name','hostid'],groupids=groupid) total = len(hosts) logger.info('Hosts found: %d' % (total)) if ( args.run ): x = 0 bar = ProgressBar(maxval=total,widgets=[Percentage(), ReverseBar(), ETA(), RotatingMarker(), Timer()]).start() logger.echo = False for host in hosts: x = x + 1 bar.update(x) logger.debug('(%d/%d) >> Removing >> %s' % (x, total, host)) out = zapi.globo.deleteMonitors(host['name']) bar.finish() logger.echo = True else: logger.info('No host removed due to --no-run arg. Full list of hosts:') for host in hosts: logger.info('%s' % host['name']) return if ( args.hostname ): deleteHostByName(hostname=args.hostname) exit(0) if ( args.groupname ): deleteHostsByHostgroup(groupname=args.groupname) exit(0) zapi.user.logout()