• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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