commit a3a2b73ce920acdd99212feaa11596469b7282c4 Author: Alexander Dobdin Date: Mon Jul 27 05:31:41 2015 +0300 initial ng diff --git a/cmds.py b/cmds.py new file mode 100755 index 0000000..1e79e12 --- /dev/null +++ b/cmds.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# Copyright 2015 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import argparse +import nodes +import logging +import sys +import loadconf + + +def main(argv=None): + if argv is None: + argv = sys.argv + + parser = argparse.ArgumentParser(description='need to add description') + parser.add_argument('--config', default='config.yaml', + help='Config file') + parser.add_argument('-o', '--dest-file', default='/tmp/', + help='output archive file') + parser.add_argument('-f', '--nodes', + help='nodes file', default='nodes.json') + parser.add_argument('-e', '--extended', default="0", + help='exec once by role cmdfiles') + parser.add_argument('-c', '--cluster', help='cluster id') + parser.add_argument('-d', '--debug', + help="Print lots of debugging statements", + action="store_const", dest="loglevel", + const=logging.DEBUG, + default=logging.WARNING,) + parser.add_argument('-v', '--verbose', + help="Be verbose", + action="store_const", dest="loglevel", + const=logging.INFO,) + + args = parser.parse_args(argv[1:]) + logging.basicConfig(level=args.loglevel, + format='%(asctime)s %(levelname)s %(message)s') + args.extended = args.extended == "1" + conf = loadconf.load_conf(args.config) + n = nodes.Nodes(filesd=conf['rqdir'], + logdir=conf['logdir'], + extended=args.extended, + fuelip=conf['fuelip'], + cluster=args.cluster, + sshopts=conf['ssh']['opts'], + sshvars=conf['ssh']['vars'], + timeout=conf['timeout'], + destdir=args.dest_file) + # nodes.print_nodes() + n.get_node_file_list() + n.launch_ssh(conf['out-dir']) + n.get_conf_files(conf['out-dir']) + n.create_archive_general(conf['out-dir'], '/tmp/timmy-gen.tar.bz2', 60) + n.print_nodes() + return 0 + +if __name__ == '__main__': + exit(main(sys.argv)) diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..10fc778 --- /dev/null +++ b/config.yaml @@ -0,0 +1,10 @@ +ssh: + opts: -oConnectTimeout=2 -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oLogLevel=error -lroot -oBatchMode=yes + vars: OPENRC=/root/openrc IPTABLES_STR="iptables -nvL" +fuelip: 127.0.0.1 +rqdir: ./rq +logdir: ./logs +out-dir: ../timmy-ng/info +timeout: 15 +find: + template: -name '*.log' diff --git a/default.yaml b/default.yaml new file mode 100644 index 0000000..81751cc --- /dev/null +++ b/default.yaml @@ -0,0 +1,12 @@ +ssh: + opts: -oConnectTimeout=2 -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oLogLevel=error -lroot -oBatchMode=yes + vars: OPENRC=/root/openrc IPTABLES_STR="iptables -nvL" +#cluster: 0 +fuelip: localhost +out-dir: /tmp/timmy-gen/info +timeout: 15 +find: + template: -name '*.gz' -o -name '*.log' -o -name '*-[0-9]4' + path: /var/log/ +logs-archive: /tmp/timmy-logs.tar +compress-timeout: 3600 diff --git a/flock.py b/flock.py new file mode 100644 index 0000000..1b4cae3 --- /dev/null +++ b/flock.py @@ -0,0 +1,86 @@ +#! /usr/bin/env python + +import os +import errno +import fcntl + + +class FLock: + ''' + Ensures application is running only once, by using a lock file. + + Ensure call to lock works. Then call unlock at program exit. + + You cannot read or write to the lock file, but for some reason you can + remove it. Once removed, it is still in a locked state somehow. Another + application attempting to lock against the file will fail, even though + the directory listing does not show the file. Mysterious, but we are glad + the lock integrity is upheld in such a case. + + Instance variables: + lockfile -- Full path to lock file + lockfd -- File descriptor of lock file exclusively locked + ''' + def __init__(self, lockfile): + self.lockfile = lockfile + self.lockfd = None + + def lock(self): + ''' + Creates and holds on to the lock file with exclusive access. + Returns True if lock successful, False if it is not, and raises + an exception upon operating system errors encountered creating the + lock file. + ''' + try: + # + # Create or else open and trucate lock file, in read-write mode. + # + # A crashed app might not delete the lock file, so the + # os.O_CREAT | os.O_EXCL combination that guarantees + # atomic create isn't useful here. That is, we don't want to + # fail locking just because the file exists. + # + # Could use os.O_EXLOCK, but that doesn't exist yet in my Python + # + self.lockfd = os.open(self.lockfile, + os.O_TRUNC | os.O_CREAT | os.O_RDWR) + + # Acquire exclusive lock on the file, but don't block waiting for it + fcntl.flock(self.lockfd, fcntl.LOCK_EX | fcntl.LOCK_NB) + + # Writing to file is pointless, nobody can see it + os.write(self.lockfd, "lockfile") + + return True + except (OSError, IOError), e: + # Lock cannot be acquired is okay, everything else reraise exception + if e.errno in (errno.EACCES, errno.EAGAIN): + return False + else: + raise + + def unlock(self): + try: + # FIRST unlink file, then close it. This way, we avoid file + # existence in an unlocked state + os.unlink(self.lockfile) + # Just in case, let's not leak file descriptors + os.close(self.lockfd) + except (OSError, IOError), e: + # Ignore error destroying lock file. See class doc about how + # lockfile can be erased and everything still works normally. + pass + +# Test main routine +if __name__ == '__main__': + import time + applock = FLock('./cmds.lock') + if (applock.lock()): + # Hint: try running 2nd program instance while this instance sleeps + print("Obtained lock, sleeping 10 seconds") + time.sleep(10) + print("Unlocking") + applock.unlock() + else: + print("Unable to obtain lock, exiting") diff --git a/getlogs.py b/getlogs.py new file mode 100755 index 0000000..522f12a --- /dev/null +++ b/getlogs.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# Copyright 2015 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +main module +""" + +import argparse +import logging +import sys +import nodes +import loadconf +import flock + + +def main(argv=None): + if argv is None: + argv = sys.argv + + parser = argparse.ArgumentParser(description='need to add description') + parser.add_argument('-a', '--dest-file', default='/tmp/', + help='directory with output archive') + parser.add_argument('-f', '--nodes', + help='nodes file', default='nodes.json') + parser.add_argument('-t', '--timeout', + help='timeout for command', type=int, default=15) + parser.add_argument('-l', '--log-dir', + help='log directory', default='./logs/') + parser.add_argument('-e', '--extended', default="0", + help='exec once by role cmdfiles') + parser.add_argument('-c', '--cluster', help='cluster id') + parser.add_argument('-d', '--debug', + help="Print lots of debugging statements", + action="store_const", dest="loglevel", + const=logging.DEBUG, + default=logging.WARNING,) + parser.add_argument('-v', '--verbose', + help="Be verbose", + action="store_const", dest="loglevel", + const=logging.INFO,) + + args = parser.parse_args(argv[1:]) + logging.basicConfig(level=args.loglevel, + format='%(asctime)s %(levelname)s %(message)s') + conf = loadconf.load_conf('config.yaml') + args.extended = args.extended == "1" + n = nodes.Nodes(filesd=conf['rqdir'], + logdir=conf['logdir'], + extended=args.extended, + fuelip=conf['fuelip'], + cluster=args.cluster, + sshopts=conf['ssh']['opts'], + sshvars=conf['ssh']['vars'], + timeout=conf['timeout'], + destdir=args.dest_file) + lock = flock.FLock('/tmp/timmy-logs.lock') + if not lock.lock(): + logging.warning('Unable to obtain lock, skipping "logs"-part') + n.get_node_file_list() + n.calculate_log_size(conf['find']['template']) + if n.is_enough_space(): + n.get_log_files(conf['out-dir']) + n.create_archive_logs(conf['find']['template'], + conf['logs-archive'], + conf['compress-timeout']) + n.add_logs_archive(conf['out-dir'], nodes.lkey, + conf['logs-archive'], 120) + n.compress_archive(conf['logs-archive'], conf['compress-timeout']) + n.print_nodes() + lock.unlock() + return 0 + +if __name__ == '__main__': + exit(main(sys.argv)) diff --git a/launch.sh b/launch.sh new file mode 100755 index 0000000..145cc64 --- /dev/null +++ b/launch.sh @@ -0,0 +1,2 @@ +rm -rf info +time (./cmds.py -e 1 -d -v 2>&1 | tee cmds.log; ./getlogs.py -d -v 2>&1 | tee getlogs.log) diff --git a/loadconf.py b/loadconf.py new file mode 100644 index 0000000..b88d370 --- /dev/null +++ b/loadconf.py @@ -0,0 +1,28 @@ +import yaml +import logging +import sys + + +def load_conf(filename): + try: + with open('default.yaml', 'r') as f: + conf = yaml.load(f) + with open(filename, 'r') as f: + nc = yaml.load(f) + conf.update(nc) + except IOError as e: + logging.error("I/O error(%s): %s" % (e.errno, e.strerror)) + sys.exit(1) + except ValueError: + logging.error("Could not convert data") + sys.exit(1) + except: + logging.error("Unexpected error: %s" % sys.exc_info()[0]) + sys.exit(1) + logging.info(conf) + return conf + + +if __name__ == '__main__': + conf = load_conf('config.yaml') + print(conf) diff --git a/nodes.py b/nodes.py new file mode 100644 index 0000000..e47df2f --- /dev/null +++ b/nodes.py @@ -0,0 +1,579 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# Copyright 2015 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +main module +""" + +import argparse +import flock +import json +import os +import logging +import sys +import threading +from tools import * + + +ckey = 'cmds' +fkey = 'files' +lkey = 'logs' + + +class Node(object): + + def __init__(self, node_id, mac, cluster, roles, os_platform, + online, status, ip): + self.node_id = node_id + self.mac = mac + self.cluster = cluster + self.roles = roles + self.os_platform = os_platform + self.online = online + self.status = status + self.ip = ip + self.files = {} + self.data = {} + self.logsize = 0 + + def set_files(self, dirname, key, ds, version): + files = [] + for role in self.roles: + if role in ds[key]['by-role'].keys(): + for f in ds[key]['by-role'][role]: + files += [os.path.join(dirname, key, 'by-role', role, f)] + if (('release-'+version in ds[key].keys()) and + (role in ds[key]['release-'+version].keys())): + for f in ds[key]['release-'+version][role]: + files += [os.path.join(dirname, key, + 'release-'+version, role, f)] + for f in ds[key]['by-os'][self.os_platform].keys(): + files += [os.path.join(dirname, key, 'by-os', + self.os_platform, f)] + for f in ds[key]['default']['default'].keys(): + files += [os.path.join(dirname, key, 'default', 'default', f)] + self.files[key] = sorted(set(files)) + logging.debug('set_files:\nkey: %s, node: %s, file_list: %s' % + (key, self.node_id, self.files[key])) + + def checkos(self, filename): + bname = str(os.path.basename(filename)) + logging.debug('check os: node: %s, filename %s' % + (self.node_id, filename)) + if bname[0] == '.': + if self.os_platform in bname: + logging.info('os %s in filename %s' % + (self.os_platform, filename)) + return True + else: + return False + return True + + def exclude_non_os(self): + for key in self.files.keys(): + self.files[key] = [f for f in self.files[key] if self.checkos(f)] + + def add_files(self, dirname, key, ds): + for role in self.roles: + if role in ds[key]['once-by-role'].keys(): + for f in ds[key]['once-by-role'][role]: + self.files[key] += [os.path.join(dirname, key, + 'once-by-role', role, f)] + self.files[key] = sorted(set(self.files[key])) + logging.debug('add files:\nnode: %s, key: %s, files:\n%s' % + (self.node_id, key, self.files[key])) + + def exec_cmd(self, label, sshvars, sshopts, odir='info', timeout=15): + sn = 'node-%s' % self.node_id + cl = 'cluster-%s' % self.cluster + logging.debug('%s/%s/%s/%s' % (odir, label, cl, sn)) + ddir = os.path.join(odir, label, cl, sn) + mdir(ddir) + for f in self.files[label]: + logging.info('node:%s(%s), exec: %s' % (self.node_id, self.ip, f)) + outs, errs, code = ssh_node(ip=self.ip, + filename=f, + sshvars=sshvars, + sshopts=sshopts, + timeout=timeout, + command='' + ) + if code != 0: + logging.error("node: %s, ip: %s, cmdfile: %s," + " code: %s, error message: %s" % + (self.node_id, self.ip, f, code, errs)) + dfile = os.path.join(ddir, 'node-%s-%s-%s' % + (self.node_id, self.ip, os.path.basename(f))) + logging.info('outfile: %s' % dfile) + try: + with open(dfile, 'w') as df: + df.write(outs) + except: + logging.error("Can't write to file %s" % dfile) + + def du_logs(self, label, sshopts, odir='info', timeout=15): + logging.info('node:%s(%s), filelist: %s' % + (self.node_id, self.ip, label)) + cmd = 'du -b %s' % self.data[label].replace('\n', ' ') + logging.info('node: %s, logs du-cmd: %s' % (self.node_id, cmd)) + outs, errs, code = ssh_node(ip=self.ip, + command=cmd, + sshopts=sshopts, + sshvars='', + timeout=timeout) + if code != 0: + logging.warning("node: %s, ip: %s, cmdfile: %s, " + "code: %s, error message: %s" % + (self.node_id, self.ip, label, code, errs)) + if code == 124: + logging.error("node: %s, ip: %s, command: %s, " + "timeout code: %s, error message: %s" % + (self.node_id, self.ip, label, code, errs)) + # mark node as offline + self.online = False + if self.online: + size = 0 + for s in outs.splitlines(): + size += int(s.split()[0]) + self.logsize = size + logging.info("node: %s, ip: %s, size: %s" % + (self.node_id, self.ip, self.logsize)) + + def get_files(self, label, logdir, sshopts, odir='info', timeout=15): + logging.info('node:%s(%s), filelist: %s' % + (self.node_id, self.ip, label)) + sn = 'node-%s' % self.node_id + cl = 'cluster-%s' % self.cluster + ddir = os.path.join(odir, label, cl, sn) + mdir(ddir) + # logging.info(self.data) + outs, errs, code = get_files_rsync(ip=self.ip, + data=self.data[label], + sshopts=sshopts, + dpath=ddir, + timeout=timeout) + if code != 0: + logging.warning("get_files: node: %s, ip: %s, label: %s, " + "code: %s, error message: %s" % + (self.node_id, self.ip, label, code, errs)) + + def get_data_from_files(self, key): + self.data[key] = '' + for fname in self.files[key]: + try: + with open(fname, 'r') as dfile: + self.data[key] += '\n'+"".join(line for line in dfile + if (not line.isspace() and + line[0] != '#')) + except: + logging.error('could not read file: %s' % fname) + logging.debug('node: %s, key: %s, data:\n%s' % + (self.node_id, key, self.data[key])) + + def log_size_from_find(self, template, sshopts, odir, timeout=5): + # template = "\( -name '*.gz' -o -name '*.log' -o -name '*-[0-9]4' \)" + cmd = ("find " + "/var/log -type f \( %s \) -exec du -b {} +" % template) + logging.info('node: %s, logs du-cmd: %s' % (self.node_id, cmd)) + outs, errs, code = ssh_node(ip=self.ip, + command=cmd, + sshopts=sshopts, + sshvars='', + timeout=timeout) + if code == 124: + logging.error("node: %s, ip: %s, command: %s, " + "timeout code: %s, error message: %s" % + (self.node_id, self.ip, cmd, code, errs)) + self.logsize = -1 + return -1 + size = 0 + for s in outs.splitlines(): + size += int(s.split()[0]) + self.logsize = size + logging.info("log size from find: node: %s, ip: %s, size: %s bytes" % + (self.node_id, self.ip, self.logsize)) + return self.logsize + + def print_files(self): + for k in self.files.keys(): + print('key: %s' % (k)) + for f in self.files[k]: + print(f) + print('\n') + + def __str__(self): + if self.status in ['ready', 'discover'] and self.online: + my_id = self.node_id + else: + my_id = '#' + str(self.node_id) + + templ = '{0} {1.cluster} {1.ip} {1.mac} {1.os_platform} ' + templ += '{2} {1.online} {1.status}' + return templ.format(my_id, self, ','.join(self.roles)) + + +class Nodes(object): + """Class nodes """ + + def __init__(self, filesd, logdir, extended, timeout, + fuelip, cluster, sshopts, sshvars, destdir, filename=None): + self.dirname = filesd.rstrip('/') + if (not os.path.exists(self.dirname)): + logging.error("directory %s doesn't exist" % (self.dirname)) + sys.exit(1) + self.files = get_dir_structure(filesd)[os.path.basename(self.dirname)] + self.fuelip = fuelip + self.sshopts = sshopts + self.sshvars = sshvars + self.timeout = timeout + self.destdir = destdir + self.get_version() + self.cluster = cluster + self.logdir = logdir + self.extended = extended + logging.info('extended: %s' % self.extended) + if filename is not None: + try: + with open(filename, 'r') as json_data: + self.njdata = json.load(json_data) + except: + logging.error("Can't load data from file %s" % filename) + sys.exit(6) + else: + self.njdata = json.loads(self.get_nodes()) + self.load_nodes() + + def get_nodes(self): + fuel_node_cmd = 'fuel node list --json' + nodes_json, err, code = ssh_node(ip=self.fuelip, + command=fuel_node_cmd, + sshopts=self.sshopts, + sshvars='DUMMY=""', + timeout=self.timeout, + filename=None) + if code != 0: + logging.error("Can't get fuel node list %s" % err) + sys.exit(4) + return nodes_json + + def load_nodes(self): + node = Node(node_id=0, + cluster=0, + mac='n/a', + os_platform='centos', + roles=['fuel'], + status='ready', + online=True, + ip=self.fuelip) + self.nodes = {self.fuelip: node} + for node in self.njdata: + node_roles = node.get('roles') + if not node_roles: + roles = ['None'] + elif isinstance(node_roles, list): + roles = node_roles + else: + roles = str(node_roles).split(', ') + node_ip = str(node['ip']) + keys = "cluster mac os_platform status online".split() + params = {'node_id': node['id'], + 'roles': roles, + 'ip': node_ip} + for key in keys: + params[key] = node[key] + self.nodes[node_ip] = Node(**params) + + def get_version(self): + cmd = "awk -F ':' '/release/ {print \$2}' /etc/nailgun/version.yaml" + release, err, code = ssh_node(ip=self.fuelip, + command=cmd, + sshopts=self.sshopts, + sshvars='', + timeout=self.timeout, + filename=None) + if code != 0: + logging.error("Can't get fuel version %s" % err) + sys.exit(3) + self.version = release.rstrip('\n').strip(' ').strip('"') + logging.info('release:%s' % (self.version)) + + def get_node_file_list(self): + for key in self.files.keys(): + # ### case + roles = [] + for node in self.nodes.values(): + node.set_files(self.dirname, key, self.files, self.version) + if self.extended and key == ckey and node.online: + for role in node.roles: + if role not in roles: + roles.append(role) + logging.info('role: %s, node: %s' % + (role, node.node_id)) + node.add_files(self.dirname, key, self.files) + node.exclude_non_os() + if key == ckey: + logging.info('node: %s, os: %s, key: %s, files: %s' % + (node.node_id, + node.os_platform, + key, + node.files[key])) + for key in [fkey, lkey]: + for node in self.nodes.values(): + node.get_data_from_files(key) + for node in self.nodes.values(): + logging.debug('%s' % node.files[ckey]) + + def launch_ssh(self, odir='info', timeout=15): + lock = flock.FLock('/tmp/timmy-cmds.lock') + if not lock.lock(): + logging.warning('Unable to obtain lock, skipping "cmds"-part') + return '' + label = ckey + threads = [] + for node in self.nodes.values(): + if (self.cluster and str(self.cluster) != str(node.cluster) and + node.cluster != 0): + continue + if node.status in ['ready', 'discover'] and node.online: + t = threading.Thread(target=node.exec_cmd, + args=(label, + self.sshvars, + self.sshopts, + odir, + self.timeout,)) + threads.append(t) + t.start() + for t in threads: + t.join() + lock.unlock() + + def calculate_log_size(self, template, timeout=15): + label = lkey + threads = [] + for node in self.nodes.values(): + if (self.cluster and str(self.cluster) != str(node.cluster) and + node.cluster != 0): + continue + if node.status in ['ready', 'discover'] and node.online: + t = threading.Thread(target=node.du_logs, + args=(label, + self.sshopts, + 5,)) + threads.append(t) + t.start() + for t in threads: + t.join() + lsize = 0 + for node in self.nodes.values(): + lsize += node.logsize + logging.info('Full log size on nodes: %s bytes' % lsize) + fuelnode = self.nodes[self.fuelip] + if fuelnode.log_size_from_find(template, + self.sshopts, + 5) > 0: + lsize += fuelnode.logsize + logging.info('Full log size on nodes(with fuel): %s bytes' % lsize) + self.alogsize = lsize / 1024 + + def is_enough_space(self, coefficient=2.2): + outs, errs, code = free_space(self.destdir, timeout=1) + if code != 0: + logging.error("Can't get free space: %s" % errs) + return False + fs = int(outs.rstrip('\n')) + logging.info('logsize: %s, free space: %s Kb' % (self.alogsize, fs)) + if (self.alogsize*coefficient > fs): + logging.error('Not enough space on device') + return False + else: + return True + + def create_archive_general(self, outdir, outfile, timeout): + cmd = "tar jcf '%s' %s" % (outfile, outdir) + logging.info(cmd) + outs, errs, code = ssh_node(ip='localhost', + command=cmd, + sshopts=self.sshopts, + sshvars='', + timeout=timeout, + outputfile=outfile) + if code != 0: + logging.error("Can't create archive %s" % (errs)) + + def create_archive_logs(self, template, outfile, timeout): + sdir = '/var/log' + fuelnode = self.nodes[self.fuelip] + tstr = '--transform \\"flags=r;s|^|logs/fuel/|\\"' + cmd = ("find %s -type f \( %s \) -print0 " + "| tar --create %s --file - " + "--null --files-from -" % + (sdir, template, tstr)) + outs, errs, code = ssh_node(ip=fuelnode.ip, + command=cmd, + sshopts=self.sshopts, + sshvars='', + timeout=timeout, + outputfile=outfile) + if code != 0: + logging.warning("stderr from tar: %s" % (errs)) + + def add_logs_archive(self, directory, key, outfile, timeout): + cmd = ("tar --append --file=%s --directory %s %s" % + (outfile, directory, key)) + outs, errs, code = ssh_node(ip='localhost', command=cmd, + sshopts=self.sshopts, + sshvars='', + timeout=timeout) + if code != 2 and code != 0: + logging.warning("stderr from tar: %s" % (errs)) + + def compress_archive(self, filename, timeout): + cmd = 'bzip2 -f %s' % filename + outs, errs, code = launch_cmd(command=cmd, + timeout=timeout) + if code != 0: + logging.warning("Can't compress archive %s" % (errs)) + + def get_conf_files(self, odir=fkey, timeout=15): + lock = flock.FLock('/tmp/timmy-files.lock') + if not lock.lock(): + logging.warning('Unable to obtain lock, skipping "files"-part') + return '' + label = fkey + threads = [] + for node in self.nodes.values(): + if (self.cluster and str(self.cluster) != str(node.cluster) and + node.cluster != 0): + continue + if node.status in ['ready', 'discover'] and node.online: + t = threading.Thread(target=node.get_files, + args=(label, + self.logdir, + self.sshopts, + odir, + self.timeout,)) + threads.append(t) + t.start() + for t in threads: + t.join() + lock.unlock() + + def get_log_files(self, odir='logfiles', timeout=15): + # lock = flock.FLock('/tmp/timmy-logs.lock') + # if not lock.lock(): + # logging.warning('Unable to obtain lock, skipping "logs"-part') + # return '' + label = lkey + threads = [] + for node in self.nodes.values(): + if (self.cluster and str(self.cluster) != str(node.cluster) and + node.cluster != 0): + continue + if (node.status in ['ready', 'discover'] and + node.online and str(node.node_id) != '0'): + t = threading.Thread(target=node.get_files, + args=(label, + self.logdir, + self.sshopts, + odir, + self.timeout,)) + threads.append(t) + t.start() + for t in threads: + t.join() + # lock.unlock() + + def print_nodes(self): + """print nodes""" + print('#node-id, cluster, admin-ip, mac, os, roles, online, status') + for node in sorted(self.nodes.values(), key=lambda x: x.node_id): + if (self.cluster and + (str(self.cluster) != str(node.cluster)) and + node.cluster != 0): + print("#"+str(node)) + else: + print(str(node)) + + +def main(argv=None): + if argv is None: + argv = sys.argv + + parser = argparse.ArgumentParser(description='need to add description') + parser.add_argument('-a', '--dest-dir', default='/tmp/', + help='directory with output archive') + parser.add_argument('-f', '--nodes', + help='nodes file', default='nodes.json') + parser.add_argument('-t', '--timeout', + help='timeout for command', type=int, default=15) + parser.add_argument('-l', '--log-dir', + help='log directory', default='./logs/') + parser.add_argument('-o', '--ssh-vars', + help='ssh variables', + default=("OPENRC=/root/openrc " + "IPTABLES_STR=\"iptables -nvL\"")) + parser.add_argument('-p', '--ssh-opts', + help='ssh options', + default=("-oConnectTimeout=2 " + "-oStrictHostKeyChecking=no " + "-oUserKnownHostsFile=/dev/null " + "-oLogLevel=error " + "-lroot -oBatchMode=yes")) + parser.add_argument('-r', '--rq-dir', + help='rq directrory', default='./rq') + parser.add_argument('-e', '--extended', default="0", + help='exec once by role cmdfiles') + parser.add_argument('-c', '--cluster', help='cluster id') + parser.add_argument('-i', '--fuel-ip', + help='Fuel admin ip address', default="localhost") + parser.add_argument('-s', '--out-dir', default='info', + help='output directory') + parser.add_argument('-d', '--debug', + help="Print lots of debugging statements", + action="store_const", dest="loglevel", + const=logging.DEBUG, + default=logging.WARNING,) + parser.add_argument('-v', '--verbose', + help="Be verbose", + action="store_const", dest="loglevel", + const=logging.INFO,) + + args = parser.parse_args(argv[1:]) + logging.basicConfig(level=args.loglevel) + args.extended = args.extended == "1" + nodes = Nodes(filesd=args.rq_dir, + logdir=args.log_dir, + extended=args.extended, + fuelip=args.fuel_ip, + cluster=args.cluster, + sshopts=args.ssh_opts, + sshvars=args.ssh_vars, + timeout=args.timeout, + destdir=args.dest_dir) + # nodes.print_nodes() + nodes.get_node_file_list() + nodes.calculate_log_size(conf['find']['template']) + if nodes.is_enough_space(): + nodes.get_log_files(args.out_dir) + nodes.launch_ssh(args.out_dir) + nodes.get_conf_files(args.out_dir) + + nodes.print_nodes() + return 0 + +if __name__ == '__main__': + exit(main(sys.argv)) diff --git a/rq/cmds/by-os/centos/.keep b/rq/cmds/by-os/centos/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/cmds/by-os/ubuntu/.keep b/rq/cmds/by-os/ubuntu/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/cmds/by-role/cinder/cinder-manage b/rq/cmds/by-role/cinder/cinder-manage new file mode 120000 index 0000000..9da9b64 --- /dev/null +++ b/rq/cmds/by-role/cinder/cinder-manage @@ -0,0 +1 @@ +../../cmds/cinder-manage \ No newline at end of file diff --git a/rq/cmds/by-role/cinder/ovs-vsctl-show b/rq/cmds/by-role/cinder/ovs-vsctl-show new file mode 120000 index 0000000..5ddbfc0 --- /dev/null +++ b/rq/cmds/by-role/cinder/ovs-vsctl-show @@ -0,0 +1 @@ +../../cmds/ovs-vsctl-show \ No newline at end of file diff --git a/rq/cmds/by-role/compute/compute-iptables b/rq/cmds/by-role/compute/compute-iptables new file mode 120000 index 0000000..053bba4 --- /dev/null +++ b/rq/cmds/by-role/compute/compute-iptables @@ -0,0 +1 @@ +../../cmds/compute-iptables \ No newline at end of file diff --git a/rq/cmds/by-role/compute/compute-iptables-nat b/rq/cmds/by-role/compute/compute-iptables-nat new file mode 120000 index 0000000..a629483 --- /dev/null +++ b/rq/cmds/by-role/compute/compute-iptables-nat @@ -0,0 +1 @@ +../../cmds/compute-iptables-nat \ No newline at end of file diff --git a/rq/cmds/by-role/compute/ovs-dump-flows b/rq/cmds/by-role/compute/ovs-dump-flows new file mode 120000 index 0000000..f1a49fd --- /dev/null +++ b/rq/cmds/by-role/compute/ovs-dump-flows @@ -0,0 +1 @@ +../../cmds/ovs-dump-flows \ No newline at end of file diff --git a/rq/cmds/by-role/compute/ovs-ofctl-show-bridges b/rq/cmds/by-role/compute/ovs-ofctl-show-bridges new file mode 120000 index 0000000..3f6830e --- /dev/null +++ b/rq/cmds/by-role/compute/ovs-ofctl-show-bridges @@ -0,0 +1 @@ +../../cmds/ovs-ofctl-show-bridges \ No newline at end of file diff --git a/rq/cmds/by-role/compute/ovs-vsctl-show b/rq/cmds/by-role/compute/ovs-vsctl-show new file mode 120000 index 0000000..5ddbfc0 --- /dev/null +++ b/rq/cmds/by-role/compute/ovs-vsctl-show @@ -0,0 +1 @@ +../../cmds/ovs-vsctl-show \ No newline at end of file diff --git a/rq/cmds/by-role/controller/ceph_mon_status b/rq/cmds/by-role/controller/ceph_mon_status new file mode 120000 index 0000000..58a0b0a --- /dev/null +++ b/rq/cmds/by-role/controller/ceph_mon_status @@ -0,0 +1 @@ +../../cmds/ceph_mon_status \ No newline at end of file diff --git a/rq/cmds/by-role/controller/cinder-manage b/rq/cmds/by-role/controller/cinder-manage new file mode 120000 index 0000000..9da9b64 --- /dev/null +++ b/rq/cmds/by-role/controller/cinder-manage @@ -0,0 +1 @@ +../../cmds/cinder-manage \ No newline at end of file diff --git a/rq/cmds/by-role/controller/crm-resource-list b/rq/cmds/by-role/controller/crm-resource-list new file mode 120000 index 0000000..dbd987a --- /dev/null +++ b/rq/cmds/by-role/controller/crm-resource-list @@ -0,0 +1 @@ +../../cmds/crm-resource-list \ No newline at end of file diff --git a/rq/cmds/by-role/controller/crm-resource-status b/rq/cmds/by-role/controller/crm-resource-status new file mode 120000 index 0000000..404b7ca --- /dev/null +++ b/rq/cmds/by-role/controller/crm-resource-status @@ -0,0 +1 @@ +../../cmds/crm-resource-status \ No newline at end of file diff --git a/rq/cmds/by-role/controller/iptables-namespaces b/rq/cmds/by-role/controller/iptables-namespaces new file mode 120000 index 0000000..34c2751 --- /dev/null +++ b/rq/cmds/by-role/controller/iptables-namespaces @@ -0,0 +1 @@ +../../cmds/iptables-namespaces \ No newline at end of file diff --git a/rq/cmds/by-role/controller/mysql-size b/rq/cmds/by-role/controller/mysql-size new file mode 120000 index 0000000..dbcae1e --- /dev/null +++ b/rq/cmds/by-role/controller/mysql-size @@ -0,0 +1 @@ +../../cmds/mysql-size \ No newline at end of file diff --git a/rq/cmds/by-role/controller/mysql-status b/rq/cmds/by-role/controller/mysql-status new file mode 120000 index 0000000..f8e6800 --- /dev/null +++ b/rq/cmds/by-role/controller/mysql-status @@ -0,0 +1 @@ +../../cmds/mysql-status \ No newline at end of file diff --git a/rq/cmds/by-role/controller/neutron-agent-list b/rq/cmds/by-role/controller/neutron-agent-list new file mode 120000 index 0000000..d8f4f95 --- /dev/null +++ b/rq/cmds/by-role/controller/neutron-agent-list @@ -0,0 +1 @@ +../../cmds/neutron-agent-list \ No newline at end of file diff --git a/rq/cmds/by-role/controller/nova-manage-service-list b/rq/cmds/by-role/controller/nova-manage-service-list new file mode 120000 index 0000000..56e5a6c --- /dev/null +++ b/rq/cmds/by-role/controller/nova-manage-service-list @@ -0,0 +1 @@ +../../cmds/nova-manage-service-list \ No newline at end of file diff --git a/rq/cmds/by-role/controller/ovs-dump-flows b/rq/cmds/by-role/controller/ovs-dump-flows new file mode 120000 index 0000000..f1a49fd --- /dev/null +++ b/rq/cmds/by-role/controller/ovs-dump-flows @@ -0,0 +1 @@ +../../cmds/ovs-dump-flows \ No newline at end of file diff --git a/rq/cmds/by-role/controller/ovs-ofctl-show-bridges b/rq/cmds/by-role/controller/ovs-ofctl-show-bridges new file mode 120000 index 0000000..3f6830e --- /dev/null +++ b/rq/cmds/by-role/controller/ovs-ofctl-show-bridges @@ -0,0 +1 @@ +../../cmds/ovs-ofctl-show-bridges \ No newline at end of file diff --git a/rq/cmds/by-role/controller/ovs-vsctl-show b/rq/cmds/by-role/controller/ovs-vsctl-show new file mode 120000 index 0000000..5ddbfc0 --- /dev/null +++ b/rq/cmds/by-role/controller/ovs-vsctl-show @@ -0,0 +1 @@ +../../cmds/ovs-vsctl-show \ No newline at end of file diff --git a/rq/cmds/by-role/controller/rabbitmqctl-cluster-status b/rq/cmds/by-role/controller/rabbitmqctl-cluster-status new file mode 120000 index 0000000..edbb811 --- /dev/null +++ b/rq/cmds/by-role/controller/rabbitmqctl-cluster-status @@ -0,0 +1 @@ +../../cmds/rabbitmqctl-cluster-status \ No newline at end of file diff --git a/rq/cmds/by-role/controller/rabbitmqctl-list-queues b/rq/cmds/by-role/controller/rabbitmqctl-list-queues new file mode 120000 index 0000000..1f5bcf3 --- /dev/null +++ b/rq/cmds/by-role/controller/rabbitmqctl-list-queues @@ -0,0 +1 @@ +../../cmds/rabbitmqctl-list-queues \ No newline at end of file diff --git a/rq/cmds/by-role/controller/rabbitmqctl-report b/rq/cmds/by-role/controller/rabbitmqctl-report new file mode 120000 index 0000000..cae51f1 --- /dev/null +++ b/rq/cmds/by-role/controller/rabbitmqctl-report @@ -0,0 +1 @@ +../../cmds/rabbitmqctl-report \ No newline at end of file diff --git a/rq/cmds/by-role/controller/rabbitmqctl-status b/rq/cmds/by-role/controller/rabbitmqctl-status new file mode 120000 index 0000000..541b462 --- /dev/null +++ b/rq/cmds/by-role/controller/rabbitmqctl-status @@ -0,0 +1 @@ +../../cmds/rabbitmqctl-status \ No newline at end of file diff --git a/rq/cmds/by-role/controller/rabbitmqctl_list_connections b/rq/cmds/by-role/controller/rabbitmqctl_list_connections new file mode 120000 index 0000000..c439f8b --- /dev/null +++ b/rq/cmds/by-role/controller/rabbitmqctl_list_connections @@ -0,0 +1 @@ +../../cmds/rabbitmqctl_list_connections \ No newline at end of file diff --git a/rq/cmds/by-role/fuel/fuel-release b/rq/cmds/by-role/fuel/fuel-release new file mode 120000 index 0000000..77340c1 --- /dev/null +++ b/rq/cmds/by-role/fuel/fuel-release @@ -0,0 +1 @@ +../../cmds/fuel-release \ No newline at end of file diff --git a/rq/cmds/by-role/mongo/ipa b/rq/cmds/by-role/mongo/ipa new file mode 120000 index 0000000..caadc30 --- /dev/null +++ b/rq/cmds/by-role/mongo/ipa @@ -0,0 +1 @@ +../../cmds/ipa \ No newline at end of file diff --git a/rq/cmds/by-role/mongo/mongo-replica-conf b/rq/cmds/by-role/mongo/mongo-replica-conf new file mode 120000 index 0000000..c0d5601 --- /dev/null +++ b/rq/cmds/by-role/mongo/mongo-replica-conf @@ -0,0 +1 @@ +../../cmds/mongo-replica-conf \ No newline at end of file diff --git a/rq/cmds/by-role/mongo/mongo-replication-status b/rq/cmds/by-role/mongo/mongo-replication-status new file mode 120000 index 0000000..f765221 --- /dev/null +++ b/rq/cmds/by-role/mongo/mongo-replication-status @@ -0,0 +1 @@ +../../cmds/mongo-replication-status \ No newline at end of file diff --git a/rq/cmds/by-role/mongo/mongo-status b/rq/cmds/by-role/mongo/mongo-status new file mode 120000 index 0000000..81b9371 --- /dev/null +++ b/rq/cmds/by-role/mongo/mongo-status @@ -0,0 +1 @@ +../../cmds/mongo-status \ No newline at end of file diff --git a/rq/cmds/by-role/mongo/ovs-vsctl-show b/rq/cmds/by-role/mongo/ovs-vsctl-show new file mode 120000 index 0000000..5ddbfc0 --- /dev/null +++ b/rq/cmds/by-role/mongo/ovs-vsctl-show @@ -0,0 +1 @@ +../../cmds/ovs-vsctl-show \ No newline at end of file diff --git a/rq/cmds/cmds/.packages-centos b/rq/cmds/cmds/.packages-centos new file mode 100644 index 0000000..8254f9d --- /dev/null +++ b/rq/cmds/cmds/.packages-centos @@ -0,0 +1 @@ +time yum list installed diff --git a/rq/cmds/cmds/.packages-ubuntu b/rq/cmds/cmds/.packages-ubuntu new file mode 100644 index 0000000..6f42c97 --- /dev/null +++ b/rq/cmds/cmds/.packages-ubuntu @@ -0,0 +1 @@ +time dpkg -l diff --git a/rq/cmds/cmds/.readme b/rq/cmds/cmds/.readme new file mode 100644 index 0000000..75c6d5f --- /dev/null +++ b/rq/cmds/cmds/.readme @@ -0,0 +1,9 @@ +Please, don't include commands which requests lists of vms, images, endpoints, +tenants, etc. to decrease a high load on the cluster. +Add these command to 'extended' role, which can be configured for some nodes. + +The following commands can be executed in extended mode: +cinder-list +nova-list +nova-usage-list +nova-manage-vm-list diff --git a/rq/cmds/cmds/brctl-show b/rq/cmds/cmds/brctl-show new file mode 100644 index 0000000..7ffe5b3 --- /dev/null +++ b/rq/cmds/cmds/brctl-show @@ -0,0 +1 @@ +brctl show diff --git a/rq/cmds/cmds/ceph-df b/rq/cmds/cmds/ceph-df new file mode 100644 index 0000000..ea57d2d --- /dev/null +++ b/rq/cmds/cmds/ceph-df @@ -0,0 +1 @@ +ceph df diff --git a/rq/cmds/cmds/ceph-health-detail b/rq/cmds/cmds/ceph-health-detail new file mode 100644 index 0000000..1bdb7a8 --- /dev/null +++ b/rq/cmds/cmds/ceph-health-detail @@ -0,0 +1 @@ +ceph health detail diff --git a/rq/cmds/cmds/ceph-osd-status b/rq/cmds/cmds/ceph-osd-status new file mode 100644 index 0000000..7c78c05 --- /dev/null +++ b/rq/cmds/cmds/ceph-osd-status @@ -0,0 +1 @@ +ceph -s \ No newline at end of file diff --git a/rq/cmds/cmds/ceph-osd-tree b/rq/cmds/cmds/ceph-osd-tree new file mode 100644 index 0000000..eb256ec --- /dev/null +++ b/rq/cmds/cmds/ceph-osd-tree @@ -0,0 +1 @@ +ceph osd tree \ No newline at end of file diff --git a/rq/cmds/cmds/ceph-pg-dump b/rq/cmds/cmds/ceph-pg-dump new file mode 100644 index 0000000..aedae31 --- /dev/null +++ b/rq/cmds/cmds/ceph-pg-dump @@ -0,0 +1 @@ +ceph pg dump diff --git a/rq/cmds/cmds/ceph_mon_status b/rq/cmds/cmds/ceph_mon_status new file mode 100644 index 0000000..5c03762 --- /dev/null +++ b/rq/cmds/cmds/ceph_mon_status @@ -0,0 +1,2 @@ +ceph mon_status + diff --git a/rq/cmds/cmds/cinder-list b/rq/cmds/cmds/cinder-list new file mode 100644 index 0000000..a166d6e --- /dev/null +++ b/rq/cmds/cmds/cinder-list @@ -0,0 +1,2 @@ +source "$OPENRC" +cinder list --all-tenants diff --git a/rq/cmds/cmds/cinder-manage b/rq/cmds/cmds/cinder-manage new file mode 100644 index 0000000..2c9087a --- /dev/null +++ b/rq/cmds/cmds/cinder-manage @@ -0,0 +1 @@ +cinder-manage service list diff --git a/rq/cmds/cmds/compute-iptables b/rq/cmds/cmds/compute-iptables new file mode 100644 index 0000000..f967561 --- /dev/null +++ b/rq/cmds/cmds/compute-iptables @@ -0,0 +1 @@ +iptables -nvL \ No newline at end of file diff --git a/rq/cmds/cmds/compute-iptables-nat b/rq/cmds/cmds/compute-iptables-nat new file mode 100644 index 0000000..568b3d9 --- /dev/null +++ b/rq/cmds/cmds/compute-iptables-nat @@ -0,0 +1 @@ +iptables -nvL -t nat \ No newline at end of file diff --git a/rq/cmds/cmds/cpuinfo b/rq/cmds/cmds/cpuinfo new file mode 100644 index 0000000..6c4928b --- /dev/null +++ b/rq/cmds/cmds/cpuinfo @@ -0,0 +1 @@ +cat /proc/cpuinfo diff --git a/rq/cmds/cmds/crm-resource-list b/rq/cmds/cmds/crm-resource-list new file mode 100644 index 0000000..3f90fa6 --- /dev/null +++ b/rq/cmds/cmds/crm-resource-list @@ -0,0 +1 @@ +crm resource list diff --git a/rq/cmds/cmds/crm-resource-status b/rq/cmds/cmds/crm-resource-status new file mode 100644 index 0000000..0a35ea8 --- /dev/null +++ b/rq/cmds/cmds/crm-resource-status @@ -0,0 +1 @@ +crm resource status diff --git a/rq/cmds/cmds/df-i b/rq/cmds/cmds/df-i new file mode 100644 index 0000000..2a13544 --- /dev/null +++ b/rq/cmds/cmds/df-i @@ -0,0 +1 @@ +df -i diff --git a/rq/cmds/cmds/df-m b/rq/cmds/cmds/df-m new file mode 100644 index 0000000..9ba5dd2 --- /dev/null +++ b/rq/cmds/cmds/df-m @@ -0,0 +1 @@ +df -m diff --git a/rq/cmds/cmds/free b/rq/cmds/cmds/free new file mode 100644 index 0000000..b1fc7ce --- /dev/null +++ b/rq/cmds/cmds/free @@ -0,0 +1 @@ +free -m diff --git a/rq/cmds/cmds/fuel-docker-db-archive b/rq/cmds/cmds/fuel-docker-db-archive new file mode 100644 index 0000000..be8bb66 --- /dev/null +++ b/rq/cmds/cmds/fuel-docker-db-archive @@ -0,0 +1 @@ +dockerctl shell postgres su postgres -c 'pg_dumpall --clean' diff --git a/rq/cmds/cmds/fuel-docker-ps b/rq/cmds/cmds/fuel-docker-ps new file mode 100644 index 0000000..6aee590 --- /dev/null +++ b/rq/cmds/cmds/fuel-docker-ps @@ -0,0 +1 @@ +docker ps -a diff --git a/rq/cmds/cmds/fuel-dockerctl-check b/rq/cmds/cmds/fuel-dockerctl-check new file mode 100644 index 0000000..f77a6d3 --- /dev/null +++ b/rq/cmds/cmds/fuel-dockerctl-check @@ -0,0 +1 @@ +dockerctl check all \ No newline at end of file diff --git a/rq/cmds/cmds/fuel-dockerctl-list b/rq/cmds/cmds/fuel-dockerctl-list new file mode 100644 index 0000000..9e2a6f6 --- /dev/null +++ b/rq/cmds/cmds/fuel-dockerctl-list @@ -0,0 +1 @@ +dockerctl list -l diff --git a/rq/cmds/cmds/fuel-postgres-dump b/rq/cmds/cmds/fuel-postgres-dump new file mode 100644 index 0000000..2b587ee --- /dev/null +++ b/rq/cmds/cmds/fuel-postgres-dump @@ -0,0 +1 @@ +su postgres -c 'pg_dumpall --clean' diff --git a/rq/cmds/cmds/fuel-release b/rq/cmds/cmds/fuel-release new file mode 100644 index 0000000..abfbd04 --- /dev/null +++ b/rq/cmds/cmds/fuel-release @@ -0,0 +1 @@ +fuel release diff --git a/rq/cmds/cmds/fuel-task-list b/rq/cmds/cmds/fuel-task-list new file mode 100644 index 0000000..380b1d6 --- /dev/null +++ b/rq/cmds/cmds/fuel-task-list @@ -0,0 +1 @@ +fuel task list diff --git a/rq/cmds/cmds/ip-ne b/rq/cmds/cmds/ip-ne new file mode 100644 index 0000000..e09507a --- /dev/null +++ b/rq/cmds/cmds/ip-ne @@ -0,0 +1 @@ +ip ne diff --git a/rq/cmds/cmds/ipa b/rq/cmds/cmds/ipa new file mode 100644 index 0000000..cfa584f --- /dev/null +++ b/rq/cmds/cmds/ipa @@ -0,0 +1 @@ +ip a diff --git a/rq/cmds/cmds/ipnetns b/rq/cmds/cmds/ipnetns new file mode 100644 index 0000000..e31963f --- /dev/null +++ b/rq/cmds/cmds/ipnetns @@ -0,0 +1 @@ +ip netns list diff --git a/rq/cmds/cmds/ipro b/rq/cmds/cmds/ipro new file mode 100644 index 0000000..8fa088b --- /dev/null +++ b/rq/cmds/cmds/ipro @@ -0,0 +1 @@ +ip ro diff --git a/rq/cmds/cmds/ipset-list b/rq/cmds/cmds/ipset-list new file mode 100644 index 0000000..e81c412 --- /dev/null +++ b/rq/cmds/cmds/ipset-list @@ -0,0 +1 @@ +ipset list diff --git a/rq/cmds/cmds/ipset-save b/rq/cmds/cmds/ipset-save new file mode 100644 index 0000000..a9c9a63 --- /dev/null +++ b/rq/cmds/cmds/ipset-save @@ -0,0 +1 @@ +ipset save diff --git a/rq/cmds/cmds/iptables b/rq/cmds/cmds/iptables new file mode 100644 index 0000000..865da72 --- /dev/null +++ b/rq/cmds/cmds/iptables @@ -0,0 +1 @@ +${IPTABLES_STR} diff --git a/rq/cmds/cmds/iptables-namespaces b/rq/cmds/cmds/iptables-namespaces new file mode 100644 index 0000000..228bf90 --- /dev/null +++ b/rq/cmds/cmds/iptables-namespaces @@ -0,0 +1,6 @@ +for i in $(ip netns) +do + echo "namespace:$i" + ip netns exec "$i" ${IPTABLES_STR} + ip netns exec "$i" ${IPTABLES_STR} -t nat +done diff --git a/rq/cmds/cmds/iptables-nat b/rq/cmds/cmds/iptables-nat new file mode 100644 index 0000000..37df67c --- /dev/null +++ b/rq/cmds/cmds/iptables-nat @@ -0,0 +1 @@ +${IPTABLES_STR} -t nat diff --git a/rq/cmds/cmds/keystone-endpoint-list b/rq/cmds/cmds/keystone-endpoint-list new file mode 100644 index 0000000..9fd9fee --- /dev/null +++ b/rq/cmds/cmds/keystone-endpoint-list @@ -0,0 +1,2 @@ +source "$OPENRC" +keystone endpoint-list diff --git a/rq/cmds/cmds/keystone-tenant-list b/rq/cmds/cmds/keystone-tenant-list new file mode 100644 index 0000000..8ad5e03 --- /dev/null +++ b/rq/cmds/cmds/keystone-tenant-list @@ -0,0 +1,2 @@ +source "$OPENRC" +keystone tenant-list diff --git a/rq/cmds/cmds/mongo-replica-conf b/rq/cmds/cmds/mongo-replica-conf new file mode 100644 index 0000000..5b9e228 --- /dev/null +++ b/rq/cmds/cmds/mongo-replica-conf @@ -0,0 +1 @@ +mongo admin --eval "printjson(rs.conf())" diff --git a/rq/cmds/cmds/mongo-replication-status b/rq/cmds/cmds/mongo-replication-status new file mode 100644 index 0000000..e7bfd4e --- /dev/null +++ b/rq/cmds/cmds/mongo-replication-status @@ -0,0 +1 @@ +mongo admin --eval "printjson(rs.status())" diff --git a/rq/cmds/cmds/mongo-status b/rq/cmds/cmds/mongo-status new file mode 100644 index 0000000..b0bf78c --- /dev/null +++ b/rq/cmds/cmds/mongo-status @@ -0,0 +1 @@ +mongo admin --eval "printjson(db.serverStatus())" diff --git a/rq/cmds/cmds/mysql-size b/rq/cmds/cmds/mysql-size new file mode 100644 index 0000000..b619d84 --- /dev/null +++ b/rq/cmds/cmds/mysql-size @@ -0,0 +1 @@ +mysql -e "SELECT table_schema \"DB Name\", Round(Sum(data_length + index_length) / 1024 / 1024, 1) \"DB Size in MB\" FROM information_schema.tables GROUP BY table_schema;" diff --git a/rq/cmds/cmds/mysql-status b/rq/cmds/cmds/mysql-status new file mode 100644 index 0000000..907b46a --- /dev/null +++ b/rq/cmds/cmds/mysql-status @@ -0,0 +1 @@ +mysql -e 'SHOW STATUS LIKE "wsrep%"' diff --git a/rq/cmds/cmds/neutron-agent-list b/rq/cmds/cmds/neutron-agent-list new file mode 100644 index 0000000..6184cb0 --- /dev/null +++ b/rq/cmds/cmds/neutron-agent-list @@ -0,0 +1,2 @@ +source "$OPENRC" +neutron agent-list diff --git a/rq/cmds/cmds/neutron-net-list b/rq/cmds/cmds/neutron-net-list new file mode 100644 index 0000000..e412cc8 --- /dev/null +++ b/rq/cmds/cmds/neutron-net-list @@ -0,0 +1,2 @@ +source "$OPENRC" +neutron net-list diff --git a/rq/cmds/cmds/neutron-port-list b/rq/cmds/cmds/neutron-port-list new file mode 100644 index 0000000..9aea127 --- /dev/null +++ b/rq/cmds/cmds/neutron-port-list @@ -0,0 +1,2 @@ +source "$OPENRC" +neutron port-list diff --git a/rq/cmds/cmds/neutron-router-list b/rq/cmds/cmds/neutron-router-list new file mode 100644 index 0000000..e896470 --- /dev/null +++ b/rq/cmds/cmds/neutron-router-list @@ -0,0 +1,2 @@ +source "$OPENRC" +neutron router-list diff --git a/rq/cmds/cmds/neutron-subnet-list b/rq/cmds/cmds/neutron-subnet-list new file mode 100644 index 0000000..72048cd --- /dev/null +++ b/rq/cmds/cmds/neutron-subnet-list @@ -0,0 +1,2 @@ +source "$OPENRC" +neutron subnet-list diff --git a/rq/cmds/cmds/nova-list b/rq/cmds/cmds/nova-list new file mode 100644 index 0000000..4e6ddd0 --- /dev/null +++ b/rq/cmds/cmds/nova-list @@ -0,0 +1,2 @@ +source "$OPENRC" +nova list --all-tenant --fields host,name,status,networks,power_state diff --git a/rq/cmds/cmds/nova-manage-service-list b/rq/cmds/cmds/nova-manage-service-list new file mode 100644 index 0000000..a9f2423 --- /dev/null +++ b/rq/cmds/cmds/nova-manage-service-list @@ -0,0 +1 @@ +nova-manage service list \ No newline at end of file diff --git a/rq/cmds/cmds/nova-manage-vm-list b/rq/cmds/cmds/nova-manage-vm-list new file mode 100644 index 0000000..cd7d877 --- /dev/null +++ b/rq/cmds/cmds/nova-manage-vm-list @@ -0,0 +1 @@ +nova-manage vm list 2 > /dev/null | column -t diff --git a/rq/cmds/cmds/nova-usage-list b/rq/cmds/cmds/nova-usage-list new file mode 100644 index 0000000..67728cc --- /dev/null +++ b/rq/cmds/cmds/nova-usage-list @@ -0,0 +1,2 @@ +source "$OPENRC" +nova usage-list diff --git a/rq/cmds/cmds/ntpq b/rq/cmds/cmds/ntpq new file mode 100644 index 0000000..ba01154 --- /dev/null +++ b/rq/cmds/cmds/ntpq @@ -0,0 +1 @@ +nptq -p diff --git a/rq/cmds/cmds/ovs-dump-flows b/rq/cmds/cmds/ovs-dump-flows new file mode 100644 index 0000000..118dda0 --- /dev/null +++ b/rq/cmds/cmds/ovs-dump-flows @@ -0,0 +1,6 @@ +for i in $(ovs-vsctl list-br) +do + echo "bridge $i:" + ovs-ofctl dump-flows $i + echo -n +done diff --git a/rq/cmds/cmds/ovs-ofctl-show-bridges b/rq/cmds/cmds/ovs-ofctl-show-bridges new file mode 100644 index 0000000..defd8fe --- /dev/null +++ b/rq/cmds/cmds/ovs-ofctl-show-bridges @@ -0,0 +1,6 @@ +for i in $(ovs-vsctl list-br) +do + echo "ovs-ofctl show $i" + ovs-ofctl show $i + echo -n +done diff --git a/rq/cmds/cmds/ovs-vsctl-show b/rq/cmds/cmds/ovs-vsctl-show new file mode 100644 index 0000000..96f3b62 --- /dev/null +++ b/rq/cmds/cmds/ovs-vsctl-show @@ -0,0 +1 @@ +ovs-vsctl show \ No newline at end of file diff --git a/rq/cmds/cmds/parted-l b/rq/cmds/cmds/parted-l new file mode 100644 index 0000000..150f10e --- /dev/null +++ b/rq/cmds/cmds/parted-l @@ -0,0 +1 @@ +parted -l diff --git a/rq/cmds/cmds/rabbitmqctl-cluster-status b/rq/cmds/cmds/rabbitmqctl-cluster-status new file mode 100644 index 0000000..90293f1 --- /dev/null +++ b/rq/cmds/cmds/rabbitmqctl-cluster-status @@ -0,0 +1 @@ +rabbitmqctl cluster_status diff --git a/rq/cmds/cmds/rabbitmqctl-list-queues b/rq/cmds/cmds/rabbitmqctl-list-queues new file mode 100644 index 0000000..9e3c9c3 --- /dev/null +++ b/rq/cmds/cmds/rabbitmqctl-list-queues @@ -0,0 +1 @@ +rabbitmqctl list_queues \ No newline at end of file diff --git a/rq/cmds/cmds/rabbitmqctl-report b/rq/cmds/cmds/rabbitmqctl-report new file mode 100644 index 0000000..e315a62 --- /dev/null +++ b/rq/cmds/cmds/rabbitmqctl-report @@ -0,0 +1 @@ +rabbitmqctl report diff --git a/rq/cmds/cmds/rabbitmqctl-status b/rq/cmds/cmds/rabbitmqctl-status new file mode 100644 index 0000000..63f3675 --- /dev/null +++ b/rq/cmds/cmds/rabbitmqctl-status @@ -0,0 +1 @@ +rabbitmqctl status diff --git a/rq/cmds/cmds/rabbitmqctl_list_connections b/rq/cmds/cmds/rabbitmqctl_list_connections new file mode 100644 index 0000000..d0aaeac --- /dev/null +++ b/rq/cmds/cmds/rabbitmqctl_list_connections @@ -0,0 +1 @@ +rabbitmqctl list_connections diff --git a/rq/cmds/cmds/selinux b/rq/cmds/cmds/selinux new file mode 100644 index 0000000..fd25054 --- /dev/null +++ b/rq/cmds/cmds/selinux @@ -0,0 +1,3 @@ +cat /etc/sysconfig/selinux +sestatus +getenforce diff --git a/rq/cmds/cmds/services-status b/rq/cmds/cmds/services-status new file mode 100644 index 0000000..d96f97b --- /dev/null +++ b/rq/cmds/cmds/services-status @@ -0,0 +1 @@ +service --status-all 2>&1 diff --git a/rq/cmds/cmds/ss b/rq/cmds/cmds/ss new file mode 100644 index 0000000..6d2022e --- /dev/null +++ b/rq/cmds/cmds/ss @@ -0,0 +1 @@ +ss -antu \ No newline at end of file diff --git a/rq/cmds/default/.keep b/rq/cmds/default/.keep new file mode 100644 index 0000000..c076ba7 --- /dev/null +++ b/rq/cmds/default/.keep @@ -0,0 +1 @@ +keep this directory structure to compatible symlinks diff --git a/rq/cmds/default/default/.packages-centos b/rq/cmds/default/default/.packages-centos new file mode 120000 index 0000000..d8f22c8 --- /dev/null +++ b/rq/cmds/default/default/.packages-centos @@ -0,0 +1 @@ +../../cmds/.packages-centos \ No newline at end of file diff --git a/rq/cmds/default/default/.packages-ubuntu b/rq/cmds/default/default/.packages-ubuntu new file mode 120000 index 0000000..c4d7bab --- /dev/null +++ b/rq/cmds/default/default/.packages-ubuntu @@ -0,0 +1 @@ +../../cmds/.packages-ubuntu \ No newline at end of file diff --git a/rq/cmds/default/default/cpuinfo b/rq/cmds/default/default/cpuinfo new file mode 120000 index 0000000..2fff7c7 --- /dev/null +++ b/rq/cmds/default/default/cpuinfo @@ -0,0 +1 @@ +../../cmds/cpuinfo \ No newline at end of file diff --git a/rq/cmds/default/default/df-i b/rq/cmds/default/default/df-i new file mode 120000 index 0000000..d17bb2f --- /dev/null +++ b/rq/cmds/default/default/df-i @@ -0,0 +1 @@ +../../cmds/df-i \ No newline at end of file diff --git a/rq/cmds/default/default/df-m b/rq/cmds/default/default/df-m new file mode 120000 index 0000000..fb4ceec --- /dev/null +++ b/rq/cmds/default/default/df-m @@ -0,0 +1 @@ +../../cmds/df-m \ No newline at end of file diff --git a/rq/cmds/default/default/ip-ne b/rq/cmds/default/default/ip-ne new file mode 120000 index 0000000..3a3a07d --- /dev/null +++ b/rq/cmds/default/default/ip-ne @@ -0,0 +1 @@ +../../cmds/ip-ne \ No newline at end of file diff --git a/rq/cmds/default/default/ipa b/rq/cmds/default/default/ipa new file mode 120000 index 0000000..caadc30 --- /dev/null +++ b/rq/cmds/default/default/ipa @@ -0,0 +1 @@ +../../cmds/ipa \ No newline at end of file diff --git a/rq/cmds/default/default/ipnetns b/rq/cmds/default/default/ipnetns new file mode 120000 index 0000000..7d182b7 --- /dev/null +++ b/rq/cmds/default/default/ipnetns @@ -0,0 +1 @@ +../../cmds/ipnetns \ No newline at end of file diff --git a/rq/cmds/default/default/ipro b/rq/cmds/default/default/ipro new file mode 120000 index 0000000..edc6072 --- /dev/null +++ b/rq/cmds/default/default/ipro @@ -0,0 +1 @@ +../../cmds/ipro \ No newline at end of file diff --git a/rq/cmds/default/default/iptables b/rq/cmds/default/default/iptables new file mode 120000 index 0000000..1b1ab51 --- /dev/null +++ b/rq/cmds/default/default/iptables @@ -0,0 +1 @@ +../../cmds/iptables \ No newline at end of file diff --git a/rq/cmds/default/default/iptables-nat b/rq/cmds/default/default/iptables-nat new file mode 120000 index 0000000..a7867c4 --- /dev/null +++ b/rq/cmds/default/default/iptables-nat @@ -0,0 +1 @@ +../../cmds/iptables-nat \ No newline at end of file diff --git a/rq/cmds/default/default/services-status b/rq/cmds/default/default/services-status new file mode 120000 index 0000000..cdd110d --- /dev/null +++ b/rq/cmds/default/default/services-status @@ -0,0 +1 @@ +../../cmds/services-status \ No newline at end of file diff --git a/rq/cmds/default/default/ss b/rq/cmds/default/default/ss new file mode 120000 index 0000000..b135f87 --- /dev/null +++ b/rq/cmds/default/default/ss @@ -0,0 +1 @@ +../../cmds/ss \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ceph-df b/rq/cmds/once-by-role/ceph-osd/ceph-df new file mode 120000 index 0000000..f120c15 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ceph-df @@ -0,0 +1 @@ +../../cmds/ceph-df \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ceph-health-detail b/rq/cmds/once-by-role/ceph-osd/ceph-health-detail new file mode 120000 index 0000000..854efa9 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ceph-health-detail @@ -0,0 +1 @@ +../../cmds/ceph-health-detail \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ceph-osd-status b/rq/cmds/once-by-role/ceph-osd/ceph-osd-status new file mode 120000 index 0000000..c421eb5 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ceph-osd-status @@ -0,0 +1 @@ +../../cmds/ceph-osd-status \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ceph-osd-tree b/rq/cmds/once-by-role/ceph-osd/ceph-osd-tree new file mode 120000 index 0000000..44e3af1 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ceph-osd-tree @@ -0,0 +1 @@ +../../cmds/ceph-osd-tree \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ceph-pg-dump b/rq/cmds/once-by-role/ceph-osd/ceph-pg-dump new file mode 120000 index 0000000..95b04c6 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ceph-pg-dump @@ -0,0 +1 @@ +../../cmds/ceph-pg-dump \ No newline at end of file diff --git a/rq/cmds/once-by-role/ceph-osd/ovs-vsctl-show b/rq/cmds/once-by-role/ceph-osd/ovs-vsctl-show new file mode 120000 index 0000000..5ddbfc0 --- /dev/null +++ b/rq/cmds/once-by-role/ceph-osd/ovs-vsctl-show @@ -0,0 +1 @@ +../../cmds/ovs-vsctl-show \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/cinder-list b/rq/cmds/once-by-role/controller/cinder-list new file mode 120000 index 0000000..b3720c3 --- /dev/null +++ b/rq/cmds/once-by-role/controller/cinder-list @@ -0,0 +1 @@ +../../cmds/cinder-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/keystone-endpoint-list b/rq/cmds/once-by-role/controller/keystone-endpoint-list new file mode 120000 index 0000000..13188f6 --- /dev/null +++ b/rq/cmds/once-by-role/controller/keystone-endpoint-list @@ -0,0 +1 @@ +../../cmds/keystone-endpoint-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/keystone-tenant-list b/rq/cmds/once-by-role/controller/keystone-tenant-list new file mode 120000 index 0000000..2f378f2 --- /dev/null +++ b/rq/cmds/once-by-role/controller/keystone-tenant-list @@ -0,0 +1 @@ +../../cmds/keystone-tenant-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/neutron-net-list b/rq/cmds/once-by-role/controller/neutron-net-list new file mode 120000 index 0000000..49a7dbd --- /dev/null +++ b/rq/cmds/once-by-role/controller/neutron-net-list @@ -0,0 +1 @@ +../../cmds/neutron-net-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/neutron-port-list b/rq/cmds/once-by-role/controller/neutron-port-list new file mode 120000 index 0000000..709d866 --- /dev/null +++ b/rq/cmds/once-by-role/controller/neutron-port-list @@ -0,0 +1 @@ +../../cmds/neutron-port-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/neutron-router-list b/rq/cmds/once-by-role/controller/neutron-router-list new file mode 120000 index 0000000..b4ec55b --- /dev/null +++ b/rq/cmds/once-by-role/controller/neutron-router-list @@ -0,0 +1 @@ +../../cmds/neutron-router-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/neutron-subnet-list b/rq/cmds/once-by-role/controller/neutron-subnet-list new file mode 120000 index 0000000..2f52153 --- /dev/null +++ b/rq/cmds/once-by-role/controller/neutron-subnet-list @@ -0,0 +1 @@ +../../cmds/neutron-subnet-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/nova-list b/rq/cmds/once-by-role/controller/nova-list new file mode 120000 index 0000000..ee284ee --- /dev/null +++ b/rq/cmds/once-by-role/controller/nova-list @@ -0,0 +1 @@ +../../cmds/nova-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/nova-manage-vm-list b/rq/cmds/once-by-role/controller/nova-manage-vm-list new file mode 120000 index 0000000..6122aaf --- /dev/null +++ b/rq/cmds/once-by-role/controller/nova-manage-vm-list @@ -0,0 +1 @@ +../../cmds/nova-manage-vm-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/controller/nova-usage-list b/rq/cmds/once-by-role/controller/nova-usage-list new file mode 120000 index 0000000..c92d28a --- /dev/null +++ b/rq/cmds/once-by-role/controller/nova-usage-list @@ -0,0 +1 @@ +../../cmds/nova-usage-list \ No newline at end of file diff --git a/rq/cmds/once-by-role/readme b/rq/cmds/once-by-role/readme new file mode 100644 index 0000000..6d8b574 --- /dev/null +++ b/rq/cmds/once-by-role/readme @@ -0,0 +1 @@ +enabled by set extended=1 in env.sh diff --git a/rq/cmds/release-4.1.1/.keep b/rq/cmds/release-4.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/cmds/release-4.1.1/fuel/fuel-postgres-dump b/rq/cmds/release-4.1.1/fuel/fuel-postgres-dump new file mode 120000 index 0000000..418c7cc --- /dev/null +++ b/rq/cmds/release-4.1.1/fuel/fuel-postgres-dump @@ -0,0 +1 @@ +../../cmds/fuel-postgres-dump \ No newline at end of file diff --git a/rq/cmds/release-5.0.1/.keep b/rq/cmds/release-5.0.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/cmds/release-5.0.1/fuel/fuel-docker-db-archive b/rq/cmds/release-5.0.1/fuel/fuel-docker-db-archive new file mode 120000 index 0000000..35f1966 --- /dev/null +++ b/rq/cmds/release-5.0.1/fuel/fuel-docker-db-archive @@ -0,0 +1 @@ +../../cmds/fuel-docker-db-archive \ No newline at end of file diff --git a/rq/cmds/release-5.0.1/fuel/fuel-docker-ps b/rq/cmds/release-5.0.1/fuel/fuel-docker-ps new file mode 120000 index 0000000..4f1f43d --- /dev/null +++ b/rq/cmds/release-5.0.1/fuel/fuel-docker-ps @@ -0,0 +1 @@ +../../cmds/fuel-docker-ps \ No newline at end of file diff --git a/rq/cmds/release-5.0.1/fuel/fuel-dockerctl-check b/rq/cmds/release-5.0.1/fuel/fuel-dockerctl-check new file mode 120000 index 0000000..ecf7b95 --- /dev/null +++ b/rq/cmds/release-5.0.1/fuel/fuel-dockerctl-check @@ -0,0 +1 @@ +../../cmds/fuel-dockerctl-check \ No newline at end of file diff --git a/rq/cmds/release-5.1.1/.keep b/rq/cmds/release-5.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/cmds/release-5.1.1/fuel/fuel-docker-db-archive b/rq/cmds/release-5.1.1/fuel/fuel-docker-db-archive new file mode 120000 index 0000000..35f1966 --- /dev/null +++ b/rq/cmds/release-5.1.1/fuel/fuel-docker-db-archive @@ -0,0 +1 @@ +../../cmds/fuel-docker-db-archive \ No newline at end of file diff --git a/rq/cmds/release-5.1.1/fuel/fuel-docker-ps b/rq/cmds/release-5.1.1/fuel/fuel-docker-ps new file mode 120000 index 0000000..4f1f43d --- /dev/null +++ b/rq/cmds/release-5.1.1/fuel/fuel-docker-ps @@ -0,0 +1 @@ +../../cmds/fuel-docker-ps \ No newline at end of file diff --git a/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-check b/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-check new file mode 120000 index 0000000..ecf7b95 --- /dev/null +++ b/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-check @@ -0,0 +1 @@ +../../cmds/fuel-dockerctl-check \ No newline at end of file diff --git a/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-list b/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-list new file mode 120000 index 0000000..ce8cd22 --- /dev/null +++ b/rq/cmds/release-5.1.1/fuel/fuel-dockerctl-list @@ -0,0 +1 @@ +../../cmds/fuel-dockerctl-list \ No newline at end of file diff --git a/rq/cmds/release-6.0/compute/ipset-list b/rq/cmds/release-6.0/compute/ipset-list new file mode 120000 index 0000000..2dd604c --- /dev/null +++ b/rq/cmds/release-6.0/compute/ipset-list @@ -0,0 +1 @@ +../../cmds/ipset-list \ No newline at end of file diff --git a/rq/cmds/release-6.0/compute/ipset-save b/rq/cmds/release-6.0/compute/ipset-save new file mode 120000 index 0000000..58fb308 --- /dev/null +++ b/rq/cmds/release-6.0/compute/ipset-save @@ -0,0 +1 @@ +../../cmds/ipset-save \ No newline at end of file diff --git a/rq/cmds/release-6.0/controller/ipset-list b/rq/cmds/release-6.0/controller/ipset-list new file mode 120000 index 0000000..2dd604c --- /dev/null +++ b/rq/cmds/release-6.0/controller/ipset-list @@ -0,0 +1 @@ +../../cmds/ipset-list \ No newline at end of file diff --git a/rq/cmds/release-6.0/controller/ipset-save b/rq/cmds/release-6.0/controller/ipset-save new file mode 120000 index 0000000..58fb308 --- /dev/null +++ b/rq/cmds/release-6.0/controller/ipset-save @@ -0,0 +1 @@ +../../cmds/ipset-save \ No newline at end of file diff --git a/rq/files/by-os/centos/.keep b/rq/files/by-os/centos/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/files/by-os/centos/yum b/rq/files/by-os/centos/yum new file mode 100644 index 0000000..6a3f70d --- /dev/null +++ b/rq/files/by-os/centos/yum @@ -0,0 +1,3 @@ +/etc/yum.d/ +/etc/yum +/etc/yum.conf diff --git a/rq/files/by-os/ubuntu/.keep b/rq/files/by-os/ubuntu/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/files/by-os/ubuntu/etc-apt b/rq/files/by-os/ubuntu/etc-apt new file mode 100644 index 0000000..bc8b814 --- /dev/null +++ b/rq/files/by-os/ubuntu/etc-apt @@ -0,0 +1 @@ +/etc/apt diff --git a/rq/files/by-role/ceph-osd/etc-ceph b/rq/files/by-role/ceph-osd/etc-ceph new file mode 120000 index 0000000..509200a --- /dev/null +++ b/rq/files/by-role/ceph-osd/etc-ceph @@ -0,0 +1 @@ +../../../files/files/etc-ceph \ No newline at end of file diff --git a/rq/files/by-role/cinder/etc-cinder b/rq/files/by-role/cinder/etc-cinder new file mode 120000 index 0000000..c230a21 --- /dev/null +++ b/rq/files/by-role/cinder/etc-cinder @@ -0,0 +1 @@ +../../../files/files/etc-cinder \ No newline at end of file diff --git a/rq/files/by-role/compute/etc-libvirt b/rq/files/by-role/compute/etc-libvirt new file mode 120000 index 0000000..4081c2a --- /dev/null +++ b/rq/files/by-role/compute/etc-libvirt @@ -0,0 +1 @@ +../../../files/files/etc-libvirt \ No newline at end of file diff --git a/rq/files/by-role/compute/etc-nova b/rq/files/by-role/compute/etc-nova new file mode 120000 index 0000000..5546153 --- /dev/null +++ b/rq/files/by-role/compute/etc-nova @@ -0,0 +1 @@ +../../../files/files/etc-nova \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-ceph-controller b/rq/files/by-role/controller/etc-ceph-controller new file mode 120000 index 0000000..be97650 --- /dev/null +++ b/rq/files/by-role/controller/etc-ceph-controller @@ -0,0 +1 @@ +../../../files/files/etc-ceph-controller \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-glance b/rq/files/by-role/controller/etc-glance new file mode 120000 index 0000000..8974ba7 --- /dev/null +++ b/rq/files/by-role/controller/etc-glance @@ -0,0 +1 @@ +../../../files/files/etc-glance \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-haproxy b/rq/files/by-role/controller/etc-haproxy new file mode 120000 index 0000000..7920876 --- /dev/null +++ b/rq/files/by-role/controller/etc-haproxy @@ -0,0 +1 @@ +../../../files/files/etc-haproxy \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-heat b/rq/files/by-role/controller/etc-heat new file mode 120000 index 0000000..854950d --- /dev/null +++ b/rq/files/by-role/controller/etc-heat @@ -0,0 +1 @@ +../../../files/files/etc-heat \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-keystone b/rq/files/by-role/controller/etc-keystone new file mode 120000 index 0000000..df2847c --- /dev/null +++ b/rq/files/by-role/controller/etc-keystone @@ -0,0 +1 @@ +../../../files/files/etc-keystone \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-mysql b/rq/files/by-role/controller/etc-mysql new file mode 120000 index 0000000..dc49b3e --- /dev/null +++ b/rq/files/by-role/controller/etc-mysql @@ -0,0 +1 @@ +../../../files/files/etc-mysql \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-neutron b/rq/files/by-role/controller/etc-neutron new file mode 120000 index 0000000..0a77056 --- /dev/null +++ b/rq/files/by-role/controller/etc-neutron @@ -0,0 +1 @@ +../../../files/files/etc-neutron \ No newline at end of file diff --git a/rq/files/by-role/controller/etc-nova b/rq/files/by-role/controller/etc-nova new file mode 120000 index 0000000..5546153 --- /dev/null +++ b/rq/files/by-role/controller/etc-nova @@ -0,0 +1 @@ +../../../files/files/etc-nova \ No newline at end of file diff --git a/rq/files/by-role/fuel/etc-fuel b/rq/files/by-role/fuel/etc-fuel new file mode 120000 index 0000000..97afaf8 --- /dev/null +++ b/rq/files/by-role/fuel/etc-fuel @@ -0,0 +1 @@ +../../files/etc-fuel \ No newline at end of file diff --git a/rq/files/by-role/fuel/etc-nailgun b/rq/files/by-role/fuel/etc-nailgun new file mode 120000 index 0000000..cb2f530 --- /dev/null +++ b/rq/files/by-role/fuel/etc-nailgun @@ -0,0 +1 @@ +../../files/etc-nailgun \ No newline at end of file diff --git a/rq/files/default/.keep b/rq/files/default/.keep new file mode 100644 index 0000000..c076ba7 --- /dev/null +++ b/rq/files/default/.keep @@ -0,0 +1 @@ +keep this directory structure to compatible symlinks diff --git a/rq/files/default/default/.keep b/rq/files/default/default/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/files/files/etc-ceph b/rq/files/files/etc-ceph new file mode 100644 index 0000000..f0669fe --- /dev/null +++ b/rq/files/files/etc-ceph @@ -0,0 +1,3 @@ +#ceph configs +/etc/ceph/ceph.client.admin.keyring +/etc/ceph/ceph.conf diff --git a/rq/files/files/etc-ceph-controller b/rq/files/files/etc-ceph-controller new file mode 100644 index 0000000..db90000 --- /dev/null +++ b/rq/files/files/etc-ceph-controller @@ -0,0 +1 @@ +/etc/ceph/ceph.conf diff --git a/rq/files/files/etc-cinder b/rq/files/files/etc-cinder new file mode 100644 index 0000000..6640e2e --- /dev/null +++ b/rq/files/files/etc-cinder @@ -0,0 +1,2 @@ +/etc/cinder/api-paste.ini +/etc/cinder/cinder.conf diff --git a/rq/files/files/etc-fuel b/rq/files/files/etc-fuel new file mode 100644 index 0000000..b9127f2 --- /dev/null +++ b/rq/files/files/etc-fuel @@ -0,0 +1 @@ +/etc/fuel/ diff --git a/rq/files/files/etc-glance b/rq/files/files/etc-glance new file mode 100644 index 0000000..c85a174 --- /dev/null +++ b/rq/files/files/etc-glance @@ -0,0 +1,5 @@ +/etc/glance/glance-api.conf +/etc/glance/glance-api-paste.ini +/etc/glance/glance-cache.conf +/etc/glance/glance-registry.conf +/etc/glance/glance-registry-paste.ini diff --git a/rq/files/files/etc-haproxy b/rq/files/files/etc-haproxy new file mode 100644 index 0000000..28a6ea4 --- /dev/null +++ b/rq/files/files/etc-haproxy @@ -0,0 +1 @@ +/etc/haproxy/conf.d/ diff --git a/rq/files/files/etc-heat b/rq/files/files/etc-heat new file mode 100644 index 0000000..d711888 --- /dev/null +++ b/rq/files/files/etc-heat @@ -0,0 +1,2 @@ +/etc/heat/heat.conf +/etc/heat/heat-engine.conf diff --git a/rq/files/files/etc-keystone b/rq/files/files/etc-keystone new file mode 100644 index 0000000..6d24ddc --- /dev/null +++ b/rq/files/files/etc-keystone @@ -0,0 +1 @@ +/etc/keystone/keystone.conf diff --git a/rq/files/files/etc-libvirt b/rq/files/files/etc-libvirt new file mode 100644 index 0000000..1063a6b --- /dev/null +++ b/rq/files/files/etc-libvirt @@ -0,0 +1 @@ +/etc/libvirt/libvirtd.conf diff --git a/rq/files/files/etc-mysql b/rq/files/files/etc-mysql new file mode 100644 index 0000000..5007c5a --- /dev/null +++ b/rq/files/files/etc-mysql @@ -0,0 +1 @@ +/etc/mysql/ diff --git a/rq/files/files/etc-nailgun b/rq/files/files/etc-nailgun new file mode 100644 index 0000000..d0415f6 --- /dev/null +++ b/rq/files/files/etc-nailgun @@ -0,0 +1 @@ +/etc/nailgun/version.yaml diff --git a/rq/files/files/etc-neutron b/rq/files/files/etc-neutron new file mode 100644 index 0000000..80c7a75 --- /dev/null +++ b/rq/files/files/etc-neutron @@ -0,0 +1 @@ +/etc/neutron/ diff --git a/rq/files/files/etc-nova b/rq/files/files/etc-nova new file mode 100644 index 0000000..f30d922 --- /dev/null +++ b/rq/files/files/etc-nova @@ -0,0 +1 @@ +/etc/nova/ diff --git a/rq/files/release-4.1.1/.keep b/rq/files/release-4.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/files/release-5.1.1/.keep b/rq/files/release-5.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/files/release-6.0/.keep b/rq/files/release-6.0/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-os/centos/.keep b/rq/logs/by-os/centos/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-os/centos/var-log-messages b/rq/logs/by-os/centos/var-log-messages new file mode 120000 index 0000000..06f4fb6 --- /dev/null +++ b/rq/logs/by-os/centos/var-log-messages @@ -0,0 +1 @@ +../../files/var-log-messages \ No newline at end of file diff --git a/rq/logs/by-os/ubuntu/.keep b/rq/logs/by-os/ubuntu/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-os/ubuntu/var-log-syslog b/rq/logs/by-os/ubuntu/var-log-syslog new file mode 120000 index 0000000..d3c3d1f --- /dev/null +++ b/rq/logs/by-os/ubuntu/var-log-syslog @@ -0,0 +1 @@ +../../files/var-log-syslog \ No newline at end of file diff --git a/rq/logs/by-role/ceph-osd/.keep b/rq/logs/by-role/ceph-osd/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-role/cinder/.keep b/rq/logs/by-role/cinder/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-role/compute/.keep b/rq/logs/by-role/compute/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-role/controller/.keep b/rq/logs/by-role/controller/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/by-role/fuel/.keep b/rq/logs/by-role/fuel/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/default/.keep b/rq/logs/default/.keep new file mode 100644 index 0000000..c076ba7 --- /dev/null +++ b/rq/logs/default/.keep @@ -0,0 +1 @@ +keep this directory structure to compatible symlinks diff --git a/rq/logs/default/default/.keep b/rq/logs/default/default/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/files/var-log-messages b/rq/logs/files/var-log-messages new file mode 100644 index 0000000..33eec39 --- /dev/null +++ b/rq/logs/files/var-log-messages @@ -0,0 +1 @@ +/var/log/messages diff --git a/rq/logs/files/var-log-syslog b/rq/logs/files/var-log-syslog new file mode 100644 index 0000000..f60d752 --- /dev/null +++ b/rq/logs/files/var-log-syslog @@ -0,0 +1 @@ +/var/log/syslog diff --git a/rq/logs/release-4.1.1/.keep b/rq/logs/release-4.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/release-5.1.1/.keep b/rq/logs/release-5.1.1/.keep new file mode 100644 index 0000000..e69de29 diff --git a/rq/logs/release-6.0/.keep b/rq/logs/release-6.0/.keep new file mode 100644 index 0000000..e69de29 diff --git a/tools.py b/tools.py new file mode 100644 index 0000000..fe8aae0 --- /dev/null +++ b/tools.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# Copyright 2015 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +tools module +""" + +import os +import logging +import subprocess +import sys + + +def get_dir_structure(rootdir): + """ + Creates a nested dictionary that represents the folder structure of rootdir + """ + dir = {} + try: + rootdir = rootdir.rstrip(os.sep) + start = rootdir.rfind(os.sep) + 1 + for path, dirs, files in os.walk(rootdir): + folders = path[start:].split(os.sep) + subdir = dict.fromkeys(files) + parent = reduce(dict.get, folders[:-1], dir) + parent[folders[-1]] = subdir + except: + logging.error('failed to create list of the directory: %s' % rootdir) + sys.exit(1) + return dir + + +def mdir(directory): + if not os.path.exists(directory): + logging.debug('creating directory %s' % directory) + try: + os.makedirs(directory) + except: + logging.error("Can't create a directory: %s" % directory) + sys.exit(3) + + +def launch_cmd(command, timeout): + logging.info('launch_cmd: command %s' % command) + p = subprocess.Popen(command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + try: + outs, errs = p.communicate(timeout=timeout+1) + except subprocess.TimeoutExpired: + p.kill() + outs, errs = p.communicate() + logging.error("command: %s err: %s, returned: %s" % + (command, errs, p.returncode)) + logging.debug("ssh return: err:%s\nouts:%s\ncode:%s" % + (errs, outs, p.returncode)) + logging.info("ssh return: err:%s\ncode:%s" % + (errs, p.returncode)) + return outs, errs, p.returncode + + +def ssh_node(ip, command, sshopts='', sshvars='', timeout=15, filename=None, + outputfile=None): + if (ip in ['localhost', '127.0.0.1']) or ip.startswith('127.'): + logging.info("skip ssh") + bstr = "%s timeout '%s' bash -c " % ( + sshvars, timeout) + else: + logging.info("exec ssh") + # base cmd str + bstr = "timeout '%s' ssh -t -T %s '%s' '%s' " % ( + timeout, sshopts, ip, sshvars) + if filename is None: + cmd = bstr + '"' + command + '"' + else: + cmd = bstr + " 'bash -s' < '%s'" % (filename) + # logging.info(cmd) + if outputfile is not None: + cmd += ' > "' + outputfile + '"' + outs, errs, code = launch_cmd(cmd, timeout) + return outs, errs, code + + +def get_files_rsync(ip, data, sshopts, dpath, timeout=15): + if (ip in ['localhost', '127.0.0.1']) or ip.startswith('127.'): + logging.info("skip ssh rsync") + cmd = ("timeout '%s' rsync -avzr --files-from=- / '%s'" + " --progress --partial --delete-before" % + (timeout, dpath)) + else: + cmd = ("timeout '%s' rsync -avzr -e 'ssh %s" + " -oCompression=no' --files-from=- '%s':/ '%s'" + " --progress --partial --delete-before" + ) % (timeout, sshopts, ip, dpath) + logging.debug("command:%s\ndata:\n%s" % (cmd, data)) + if data == '': + return cmd, '', 127 + p = subprocess.Popen(cmd, + shell=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + try: + outs, errs = p.communicate(input=data, timeout=timeout+1) + except subprocess.TimeoutExpired: + p.kill() + outs, errs = p.communicate() + logging.error("ip: %s, command: %s err: %s, returned: %s" % + (ip, cmd, errs, p.returncode)) + logging.debug("ip: %s, ssh return: err:%s\nouts:%s\ncode:%s" % + (ip, errs, outs, p.returncode)) + logging.info("ip: %s, ssh return: err:%s\ncode:%s" % + (ip, errs, p.returncode)) + return outs, errs, p.returncode + + +def free_space(destdir, timeout): + cmd = ("df %s --block-size K 2> /dev/null" + " | tail -n 1 | awk '{print $2}' | sed 's/K//g'") % (destdir) + outs, errs, code = launch_cmd(cmd, timeout) + return outs, errs, code + + +if __name__ == '__main__': + exit(0)