1#!/usr/bin/env python 2# -*- coding:utf-8 -*- 3# 4# Copyright (c) 2021 Huawei Device Co., Ltd. 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17import sys 18import os 19import time 20 21 22class Colored(object): 23 RED = '\033[1;31m' 24 GREEN = '\033[1;32m' 25 YELLOW = '\033[1;33m' 26 BLUE = '\033[1;34m' 27 FUCHSIA = '\033[1;35m' 28 CYAN = '\033[1;36m' 29 WHITE = '\033[1;37m' 30 RESET = '\033[0m' 31 32 DEBUG = True 33 34 LOG_TO_FILE = False 35 LOG_DIR = "fuzzlog" 36 LOG_PROJECT = None 37 LOG_DATE = None 38 39 PROJECT_LOGGER_MAP = {} 40 41 @staticmethod 42 def get_project_logger(log_project="default"): 43 if log_project in Colored.PROJECT_LOGGER_MAP: 44 return Colored.PROJECT_LOGGER_MAP[log_project] 45 logger = Colored(log_project) 46 Colored.PROJECT_LOGGER_MAP[log_project] = logger 47 return logger 48 49 def __init__(self, log_project="default"): 50 self.is_debug = True 51 self.is_log_file = False 52 self.log_project = log_project 53 self.log_date = time.strftime("%Y%m%d%H%M%S", time.localtime()) 54 55 56 def start_log_file(self): 57 self.is_log_file = True 58 if not os.path.exists(Colored.LOG_DIR): 59 os.mkdir(Colored.LOG_DIR) 60 61 project_log_dir = self.get_fuzz_project_log_dir() 62 if not os.path.exists(project_log_dir): 63 os.mkdir(project_log_dir) 64 65 current_project_log_dir = self.get_fuzz_current_project_log_dir() 66 if not os.path.exists(current_project_log_dir): 67 os.mkdir(current_project_log_dir) 68 69 70 def get_fuzz_project_log_dir(self): 71 return os.path.join(Colored.LOG_DIR, self.log_project) 72 73 def get_fuzz_current_project_log_dir(self): 74 return os.path.join(Colored.LOG_DIR, self.log_project, self.log_date) 75 76 def get_fuzz_current_project_log_path(self): 77 return os.path.join(self.get_fuzz_current_project_log_dir(), "run.log") 78 79 def loghook(self, msg): 80 if self.is_log_file: 81 run_log = os.path.join( 82 self.get_fuzz_current_project_log_dir(), 83 "run.log" 84 ) 85 with open(run_log, 'ab') as f: 86 f.write(msg + "\n") 87 88 89 def color_str(self, color, s, tag=None): 90 msg = "" 91 if tag: 92 msg = '{}{}{}{}'.format( 93 getattr(Colored, color), 94 tag, 95 s, 96 Colored.RESET 97 ) 98 else: 99 msg = '{}{}{}'.format( 100 getattr(Colored, color), 101 s, 102 Colored.RESET 103 ) 104 self.loghook(msg) 105 return msg 106 107 def red(self, s): 108 print(self.color_str('RED', s, "[ERROR] ")) 109 110 111 def green(self, s): 112 if self.is_debug: 113 print(self.color_str('GREEN', s, "[INFO] ")) 114 115 116 def yellow(self, s): 117 print(self.color_str('YELLOW', s, "[WARNING] ")) 118 119 120 def blue(self, s): 121 return self.color_str('BLUE', s) 122 123 def fuchsia(self, s): 124 return self.color_str('FUCHSIA', s) 125 126 def cyan(s): 127 return self.color_str('CYAN', s) 128 129 def white(self, s): 130 print(self.color_str('WHITE', s)) 131 132 133 def simple_print(self, s): 134 self.loghook(s) 135 print(s) 136 137 138 @staticmethod 139 def get_fuzz_log_dir(): 140 return Colored.LOG_DIR 141 142 @staticmethod 143 def log_task_init(project): 144 Colored.LOG_TO_FILE = True 145 Colored.LOG_PROJECT = project 146 Colored.LOG_DATE = time.strftime("%Y%m%d%H%M%S", time.localtime()) 147 148 if not os.path.exists(Colored.LOG_DIR): 149 os.mkdir(Colored.LOG_DIR) 150 151 project_log_dir = Colored.get_fuzz_project_log_dir() 152 if not os.path.exists(project_log_dir): 153 os.mkdir(project_log_dir) 154 155 current_project_log_dir = Colored.get_fuzz_current_project_log_dir() 156 if not os.path.exists(current_project_log_dir): 157 os.mkdir(current_project_log_dir) 158