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 20import stat 21 22FLAGS = os.O_WRONLY | os.O_APPEND | os.O_CREAT 23MODES = stat.S_IWUSR | stat.S_IRUSR 24 25 26class Colored(object): 27 RED = '\033[1;31m' 28 GREEN = '\033[1;32m' 29 YELLOW = '\033[1;33m' 30 BLUE = '\033[1;34m' 31 FUCHSIA = '\033[1;35m' 32 CYAN = '\033[1;36m' 33 WHITE = '\033[1;37m' 34 RESET = '\033[0m' 35 36 DEBUG = True 37 38 LOG_TO_FILE = False 39 LOG_DIR = "fuzzlog" 40 LOG_PROJECT = None 41 LOG_DATE = None 42 43 PROJECT_LOGGER_MAP = {} 44 45 @staticmethod 46 def get_project_logger(log_project="default"): 47 if log_project in Colored.PROJECT_LOGGER_MAP: 48 return Colored.PROJECT_LOGGER_MAP[log_project] 49 logger = Colored(log_project) 50 Colored.PROJECT_LOGGER_MAP[log_project] = logger 51 return logger 52 53 def __init__(self, log_project="default"): 54 self.is_debug = True 55 self.is_log_file = False 56 self.log_project = log_project 57 self.log_date = time.strftime("%Y%m%d%H%M%S", time.localtime()) 58 59 60 def start_log_file(self): 61 self.is_log_file = True 62 if not os.path.exists(Colored.LOG_DIR): 63 os.mkdir(Colored.LOG_DIR) 64 65 project_log_dir = self.get_fuzz_project_log_dir() 66 if not os.path.exists(project_log_dir): 67 os.mkdir(project_log_dir) 68 69 current_project_log_dir = self.get_fuzz_current_project_log_dir() 70 if not os.path.exists(current_project_log_dir): 71 os.mkdir(current_project_log_dir) 72 73 74 def get_fuzz_project_log_dir(self): 75 return os.path.join(Colored.LOG_DIR, self.log_project) 76 77 def get_fuzz_current_project_log_dir(self): 78 return os.path.join(Colored.LOG_DIR, self.log_project, self.log_date) 79 80 def get_fuzz_current_project_log_path(self): 81 return os.path.join(self.get_fuzz_current_project_log_dir(), "run.log") 82 83 def loghook(self, msg): 84 if self.is_log_file: 85 run_log = os.path.join( 86 self.get_fuzz_current_project_log_dir(), 87 "run.log" 88 ) 89 with os.fdopen(os.open(run_log, FLAGS, MODES), 'ab') as f: 90 f.write(msg + "\n") 91 92 93 def color_str(self, color, s, tag=None): 94 msg = "" 95 if tag: 96 msg = '{}{}{}{}'.format( 97 getattr(Colored, color), 98 tag, 99 s, 100 Colored.RESET 101 ) 102 else: 103 msg = '{}{}{}'.format( 104 getattr(Colored, color), 105 s, 106 Colored.RESET 107 ) 108 self.loghook(msg) 109 return msg 110 111 def red(self, s): 112 print(self.color_str('RED', s, "[ERROR] ")) 113 114 115 def green(self, s): 116 if self.is_debug: 117 print(self.color_str('GREEN', s, "[INFO] ")) 118 119 120 def yellow(self, s): 121 print(self.color_str('YELLOW', s, "[WARNING] ")) 122 123 124 def blue(self, s): 125 return self.color_str('BLUE', s) 126 127 def fuchsia(self, s): 128 return self.color_str('FUCHSIA', s) 129 130 def cyan(s): 131 return self.color_str('CYAN', s) 132 133 def white(self, s): 134 print(self.color_str('WHITE', s)) 135 136 137 def simple_print(self, s): 138 self.loghook(s) 139 print(s) 140 141 142 @staticmethod 143 def get_fuzz_log_dir(): 144 return Colored.LOG_DIR 145 146 @staticmethod 147 def log_task_init(project): 148 Colored.LOG_TO_FILE = True 149 Colored.LOG_PROJECT = project 150 Colored.LOG_DATE = time.strftime("%Y%m%d%H%M%S", time.localtime()) 151 152 if not os.path.exists(Colored.LOG_DIR): 153 os.mkdir(Colored.LOG_DIR) 154 155 project_log_dir = Colored.get_fuzz_project_log_dir() 156 if not os.path.exists(project_log_dir): 157 os.mkdir(project_log_dir) 158 159 current_project_log_dir = Colored.get_fuzz_current_project_log_dir() 160 if not os.path.exists(current_project_log_dir): 161 os.mkdir(current_project_log_dir) 162