• 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
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