blob: 07f286003c7c79b2f95ff5768263d17444bd73aa [file] [log] [blame]
#!/usr/bin/env python
# -----------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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 datetime
import os
import socket
import subprocess
import sys
from optparse import OptionParser
from ducc_util import DuccUtil
from ducc_logger import DuccLogger
logger = DuccLogger()
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +
# + gather_logs
# +
# + purpose: create gz of DUCC log files and other debug information
# +
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# -----------------------------------------------------------------------
# Extend OptionParser class
class ExtendedOptionParser(OptionParser):
# override epilog formatter so
# that newlines are not deleted!
def format_epilog(self, formatter):
return self.epilog
# -----------------------------------------------------------------------
# epilog for --help
def get_epilog():
epilog = ''
epilog = epilog+'\n'
epilog = epilog+'Purpose: gather problem determination information comprising DUCC logs and configuration data into a gz file.'
epilog = epilog+'\n'
epilog = epilog+'\n'
return epilog
class GatherLogs(DuccUtil):
# output directory
directory = '/tmp'
# output base filename
filename = 'ducc-problem-determination-info'
filetype = 'tar'
def get_timestamp(self):
dt = datetime.datetime.now()
year = dt.strftime("%Y")
month = dt.strftime("%b")
day = dt.strftime("%d")
date = year+month+day
hour = dt.strftime("%H")
minute = dt.strftime("%M")
second = dt.strftime("%S")
time = hour+minute+second
timestamp = date+'.'+time
return timestamp
# resolve output file path
def resolve_target(self):
if(self.directory == None):
self.directory = '/tmp'
self.directory = self.directory.strip()
if(self.directory == ''):
self.directory = '/tmp'
self.filename = self.filename+'.'+socket.gethostname()+'.'+self.get_timestamp()
self.target = self.directory+'/'+self.filename
self.target = self.target.replace('//','/')
self.target = self.target+'.'+self.filetype
if(not os.path.isdir(self.directory)):
os.makedirs(self.directory)
# parse command line
def parse_cmdline(self):
parser = ExtendedOptionParser(epilog=get_epilog())
width = 45
parser.formatter.help_position = width
parser.formatter.max_help_position = width
parser.add_option('-d','--directory', action='store', dest='directory', default=self.directory,
help='path to directory for gz file, default='+self.directory)
(options, args) = parser.parse_args()
self.directory = options.directory
# create tar file
def create_targz(self):
cmd = []
cmd.append('tar')
cmd.append('--directory')
cmd.append(self.DUCC_HOME)
cmd.append('--exclude')
cmd.append('state/database')
cmd.append('--create')
cmd.append('--file')
cmd.append(self.target)
cmd.append('apache-uima/apache-activemq/data')
cmd.append('logs')
cmd.append('cassandra-server/logs')
cmd.append('resources')
cmd.append('state')
cmd.append('README')
cmdline = ''
for item in cmd:
cmdline = cmdline+' '+item
#print cmdline
message = 'creating'+' '+self.target+'.gz'
logger.info(message)
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
cmd = []
cmd.append('gzip')
cmd.append(self.target)
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
sizeMB = os.path.getsize(self.target+'.gz')/(1.0*1024*1024)
fmtSizeMB = "%.2f" % sizeMB
message = 'size'+' '+str(fmtSizeMB)+' '+'MB'
logger.info(message)
def main(self, argv):
self.parse_cmdline()
self.resolve_target()
self.create_targz()
if __name__ == '__main__':
instance = GatherLogs()
instance.main(sys.argv[1:])