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