| #!/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:]) |