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 @staticmethod 60 def get_fuzz_log_dir(): 61 return Colored.LOG_DIR 62 63 @staticmethod 64 def log_task_init(project): 65 Colored.LOG_TO_FILE = True 66 Colored.LOG_PROJECT = project 67 Colored.LOG_DATE = time.strftime("%Y%m%d%H%M%S", time.localtime()) 68 69 if not os.path.exists(Colored.LOG_DIR): 70 os.mkdir(Colored.LOG_DIR) 71 72 project_log_dir = Colored.get_fuzz_project_log_dir() 73 if not os.path.exists(project_log_dir): 74 os.mkdir(project_log_dir) 75 76 current_project_log_dir = Colored.get_fuzz_current_project_log_dir() 77 if not os.path.exists(current_project_log_dir): 78 os.mkdir(current_project_log_dir) 79 80 def start_log_file(self): 81 self.is_log_file = True 82 if not os.path.exists(Colored.LOG_DIR): 83 os.mkdir(Colored.LOG_DIR) 84 85 project_log_dir = self.get_fuzz_project_log_dir() 86 if not os.path.exists(project_log_dir): 87 os.mkdir(project_log_dir) 88 89 current_project_log_dir = self.get_fuzz_current_project_log_dir() 90 if not os.path.exists(current_project_log_dir): 91 os.mkdir(current_project_log_dir) 92 93 94 def get_fuzz_project_log_dir(self): 95 return os.path.join(Colored.LOG_DIR, self.log_project) 96 97 def get_fuzz_current_project_log_dir(self): 98 return os.path.join(Colored.LOG_DIR, self.log_project, self.log_date) 99 100 def get_fuzz_current_project_log_path(self): 101 return os.path.join(self.get_fuzz_current_project_log_dir(), "run.log") 102 103 def loghook(self, msg): 104 if self.is_log_file: 105 run_log = os.path.join( 106 self.get_fuzz_current_project_log_dir(), 107 "run.log" 108 ) 109 with os.fdopen(os.open(run_log, FLAGS, MODES), 'ab') as f: 110 f.write(msg + "\n") 111 112 113 def color_str(self, color, s, tag=None): 114 msg = "" 115 if tag: 116 msg = '{}{}{}{}'.format( 117 getattr(Colored, color), 118 tag, 119 s, 120 Colored.RESET 121 ) 122 else: 123 msg = '{}{}{}'.format( 124 getattr(Colored, color), 125 s, 126 Colored.RESET 127 ) 128 self.loghook(msg) 129 return msg 130 131 def red(self, s): 132 print(self.color_str('RED', s, "[ERROR] ")) 133 134 135 def green(self, s): 136 if self.is_debug: 137 print(self.color_str('GREEN', s, "[INFO] ")) 138 139 140 def yellow(self, s): 141 print(self.color_str('YELLOW', s, "[WARNING] ")) 142 143 144 def blue(self, s): 145 return self.color_str('BLUE', s) 146 147 def fuchsia(self, s): 148 return self.color_str('FUCHSIA', s) 149 150 def cyan(s): 151 return self.color_str('CYAN', s) 152 153 def white(self, s): 154 print(self.color_str('WHITE', s)) 155 156 157 def simple_print(self, s): 158 self.loghook(s) 159 print(s) 160