maqet 0.0.1.4__py3-none-any.whl → 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- maqet/__init__.py +50 -6
- maqet/__main__.py +96 -0
- maqet/__version__.py +3 -0
- maqet/api/__init__.py +35 -0
- maqet/api/decorators.py +184 -0
- maqet/api/metadata.py +147 -0
- maqet/api/registry.py +182 -0
- maqet/cli.py +71 -0
- maqet/config/__init__.py +26 -0
- maqet/config/merger.py +237 -0
- maqet/config/parser.py +198 -0
- maqet/config/validators.py +519 -0
- maqet/config_handlers.py +684 -0
- maqet/constants.py +200 -0
- maqet/exceptions.py +226 -0
- maqet/formatters.py +294 -0
- maqet/generators/__init__.py +12 -0
- maqet/generators/base_generator.py +101 -0
- maqet/generators/cli_generator.py +635 -0
- maqet/generators/python_generator.py +247 -0
- maqet/generators/rest_generator.py +58 -0
- maqet/handlers/__init__.py +12 -0
- maqet/handlers/base.py +108 -0
- maqet/handlers/init.py +147 -0
- maqet/handlers/stage.py +196 -0
- maqet/ipc/__init__.py +29 -0
- maqet/ipc/retry.py +265 -0
- maqet/ipc/runner_client.py +285 -0
- maqet/ipc/unix_socket_server.py +239 -0
- maqet/logger.py +160 -55
- maqet/machine.py +884 -0
- maqet/managers/__init__.py +7 -0
- maqet/managers/qmp_manager.py +333 -0
- maqet/managers/snapshot_coordinator.py +327 -0
- maqet/managers/vm_manager.py +683 -0
- maqet/maqet.py +1120 -0
- maqet/os_interactions.py +46 -0
- maqet/process_spawner.py +395 -0
- maqet/qemu_args.py +76 -0
- maqet/qmp/__init__.py +10 -0
- maqet/qmp/commands.py +92 -0
- maqet/qmp/keyboard.py +311 -0
- maqet/qmp/qmp.py +17 -0
- maqet/snapshot.py +473 -0
- maqet/state.py +958 -0
- maqet/storage.py +702 -162
- maqet/validation/__init__.py +9 -0
- maqet/validation/config_validator.py +170 -0
- maqet/vm_runner.py +523 -0
- maqet-0.0.5.dist-info/METADATA +237 -0
- maqet-0.0.5.dist-info/RECORD +55 -0
- {maqet-0.0.1.4.dist-info → maqet-0.0.5.dist-info}/WHEEL +1 -1
- maqet-0.0.5.dist-info/entry_points.txt +2 -0
- maqet-0.0.5.dist-info/licenses/LICENSE +21 -0
- {maqet-0.0.1.4.dist-info → maqet-0.0.5.dist-info}/top_level.txt +0 -1
- maqet/core.py +0 -411
- maqet/functions.py +0 -104
- maqet-0.0.1.4.dist-info/METADATA +0 -6
- maqet-0.0.1.4.dist-info/RECORD +0 -33
- qemu/machine/__init__.py +0 -36
- qemu/machine/console_socket.py +0 -142
- qemu/machine/machine.py +0 -954
- qemu/machine/py.typed +0 -0
- qemu/machine/qtest.py +0 -191
- qemu/qmp/__init__.py +0 -59
- qemu/qmp/error.py +0 -50
- qemu/qmp/events.py +0 -717
- qemu/qmp/legacy.py +0 -319
- qemu/qmp/message.py +0 -209
- qemu/qmp/models.py +0 -146
- qemu/qmp/protocol.py +0 -1057
- qemu/qmp/py.typed +0 -0
- qemu/qmp/qmp_client.py +0 -655
- qemu/qmp/qmp_shell.py +0 -618
- qemu/qmp/qmp_tui.py +0 -655
- qemu/qmp/util.py +0 -219
- qemu/utils/__init__.py +0 -162
- qemu/utils/accel.py +0 -84
- qemu/utils/py.typed +0 -0
- qemu/utils/qemu_ga_client.py +0 -323
- qemu/utils/qom.py +0 -273
- qemu/utils/qom_common.py +0 -175
- qemu/utils/qom_fuse.py +0 -207
maqet/logger.py
CHANGED
@@ -1,69 +1,174 @@
|
|
1
|
+
"""
|
2
|
+
Advanced logging setup for MAQET with configurable verbosity and file output.
|
3
|
+
|
4
|
+
Provides colored console output, file logging, and verbosity level control.
|
5
|
+
"""
|
6
|
+
|
1
7
|
import logging
|
2
|
-
|
3
|
-
from
|
4
|
-
from
|
8
|
+
import sys
|
9
|
+
from pathlib import Path
|
10
|
+
from typing import Optional
|
5
11
|
|
6
12
|
|
7
|
-
class
|
8
|
-
|
9
|
-
blue = "\x1b[34;1m"
|
10
|
-
yellow = "\x1b[33;1m"
|
11
|
-
red = "\x1b[31;1m"
|
12
|
-
blink_red = "\x1b[31;5m"
|
13
|
-
r = "\x1b[0m"
|
13
|
+
class ColoredFormatter(logging.Formatter):
|
14
|
+
"""Custom formatter with colored output for different log levels."""
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
# Bold colors for severe levels
|
17
|
+
RED_BOLD = "\x1b[31;1m"
|
18
|
+
YELLOW_BOLD = "\x1b[33;1m"
|
19
|
+
CYAN_BOLD = "\x1b[36;1m"
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
# Dim/regular colors for info levels
|
22
|
+
GREY_DIM = "\x1b[90m" # Dim grey for debug
|
23
|
+
WHITE = "\x1b[97m" # Bright white for info
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
# Reset
|
26
|
+
RESET = "\x1b[0m"
|
27
|
+
|
28
|
+
MESSAGE_FORMAT = " %(message)s "
|
26
29
|
|
27
30
|
FORMATS = {
|
28
|
-
logging.DEBUG:
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
logging.DEBUG: GREY_DIM
|
32
|
+
+ "D"
|
33
|
+
+ RESET
|
34
|
+
+ GREY_DIM
|
35
|
+
+ MESSAGE_FORMAT
|
36
|
+
+ RESET,
|
37
|
+
logging.INFO: WHITE + "I" + RESET + WHITE + MESSAGE_FORMAT + RESET,
|
38
|
+
logging.WARNING: CYAN_BOLD + "W" + RESET + MESSAGE_FORMAT,
|
39
|
+
logging.ERROR: YELLOW_BOLD + "E" + RESET + MESSAGE_FORMAT,
|
40
|
+
logging.CRITICAL: RED_BOLD + "C" + RESET + MESSAGE_FORMAT,
|
41
|
+
}
|
33
42
|
|
34
43
|
def format(self, record):
|
35
|
-
|
44
|
+
"""Format log record with appropriate color."""
|
45
|
+
log_fmt = self.FORMATS.get(record.levelno, self.MESSAGE_FORMAT)
|
36
46
|
formatter = logging.Formatter(log_fmt)
|
37
47
|
return formatter.format(record)
|
38
48
|
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
50
|
+
class MaqetLogger:
|
51
|
+
"""MAQET logging manager with configurable verbosity and file output.
|
52
|
+
|
53
|
+
Features:
|
54
|
+
- Colored console output for improved readability
|
55
|
+
- Rotating file logs (10MB max, 5 backups = 60MB total)
|
56
|
+
- Configurable verbosity levels (ERROR/WARNING/INFO/DEBUG)
|
57
|
+
"""
|
58
|
+
|
59
|
+
def __init__(self, name: str = "maqet"):
|
60
|
+
"""
|
61
|
+
Initialize the logger.
|
62
|
+
|
63
|
+
Args:
|
64
|
+
name: Logger name
|
65
|
+
"""
|
66
|
+
self.logger = logging.getLogger(name)
|
67
|
+
self.logger.setLevel(logging.DEBUG)
|
68
|
+
self.logger.propagate = False
|
69
|
+
|
70
|
+
# Clear any existing handlers
|
71
|
+
self.logger.handlers.clear()
|
72
|
+
|
73
|
+
# Setup console handler with colored formatting
|
74
|
+
self._setup_console_handler()
|
75
|
+
|
76
|
+
# File handler will be added when configure_file_logging is called
|
77
|
+
self._file_handler: Optional[logging.FileHandler] = None
|
78
|
+
|
79
|
+
def _setup_console_handler(self):
|
80
|
+
"""Setup colored console output handler."""
|
81
|
+
console_handler = logging.StreamHandler(sys.stdout)
|
82
|
+
console_handler.setFormatter(ColoredFormatter())
|
83
|
+
console_handler.setLevel(logging.INFO) # Default console level
|
84
|
+
self.logger.addHandler(console_handler)
|
85
|
+
|
86
|
+
def set_verbosity(self, verbosity_level: int):
|
87
|
+
"""
|
88
|
+
Set logging verbosity level.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
verbosity_level: 0=ERROR, 1=WARNING, 2=INFO, 3=DEBUG, 4+=DEBUG
|
92
|
+
"""
|
93
|
+
level_map = {
|
94
|
+
0: logging.ERROR,
|
95
|
+
1: logging.WARNING,
|
96
|
+
2: logging.INFO,
|
97
|
+
3: logging.DEBUG,
|
98
|
+
}
|
99
|
+
|
100
|
+
# Cap at DEBUG level for anything >= 3
|
101
|
+
level = level_map.get(verbosity_level, logging.DEBUG)
|
102
|
+
|
103
|
+
# Update console handler level
|
104
|
+
for handler in self.logger.handlers:
|
105
|
+
if (
|
106
|
+
isinstance(handler, logging.StreamHandler)
|
107
|
+
and handler.stream == sys.stdout
|
108
|
+
):
|
109
|
+
handler.setLevel(level)
|
110
|
+
break
|
111
|
+
|
112
|
+
def configure_file_logging(
|
113
|
+
self, log_file: Optional[Path] = None, mode: str = "w"
|
114
|
+
):
|
115
|
+
"""
|
116
|
+
Configure file logging output with rotation.
|
117
|
+
|
118
|
+
Uses RotatingFileHandler to prevent unbounded log growth:
|
119
|
+
- Maximum file size: 10MB
|
120
|
+
- Backup count: 5 files
|
121
|
+
- Total maximum size: 60MB (current + 5 backups)
|
122
|
+
|
123
|
+
Args:
|
124
|
+
log_file: Path to log file. If None, uses 'maqet.log' in current directory
|
125
|
+
mode: File open mode ('w' for overwrite, 'a' for append) - ignored for rotating handler
|
126
|
+
"""
|
127
|
+
from logging.handlers import RotatingFileHandler
|
128
|
+
|
129
|
+
if self._file_handler:
|
130
|
+
self.logger.removeHandler(self._file_handler)
|
131
|
+
self._file_handler = None
|
132
|
+
|
133
|
+
if log_file is None:
|
134
|
+
log_file = Path("maqet.log")
|
135
|
+
|
136
|
+
# Create log file parent directory if it doesn't exist
|
137
|
+
log_file.parent.mkdir(parents=True, exist_ok=True)
|
138
|
+
|
139
|
+
# Setup rotating file handler with 10MB max size and 5 backups
|
140
|
+
max_bytes = 10 * 1024 * 1024 # 10MB
|
141
|
+
backup_count = 5 # Keep 5 old log files
|
142
|
+
|
143
|
+
self._file_handler = RotatingFileHandler(
|
144
|
+
log_file, maxBytes=max_bytes, backupCount=backup_count
|
145
|
+
)
|
146
|
+
self._file_handler.setLevel(
|
147
|
+
logging.DEBUG
|
148
|
+
) # Always log everything to file
|
149
|
+
|
150
|
+
file_formatter = logging.Formatter(
|
151
|
+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
152
|
+
)
|
153
|
+
self._file_handler.setFormatter(file_formatter)
|
154
|
+
|
155
|
+
self.logger.addHandler(self._file_handler)
|
156
|
+
|
157
|
+
def get_logger(self) -> logging.Logger:
|
158
|
+
"""Get the underlying logger instance."""
|
159
|
+
return self.logger
|
160
|
+
|
161
|
+
|
162
|
+
# Global logger instance
|
163
|
+
_maqet_logger = MaqetLogger()
|
164
|
+
LOG = _maqet_logger.get_logger()
|
165
|
+
|
166
|
+
|
167
|
+
def set_verbosity(level: int):
|
168
|
+
"""Set global logging verbosity level."""
|
169
|
+
_maqet_logger.set_verbosity(level)
|
170
|
+
|
171
|
+
|
172
|
+
def configure_file_logging(log_file: Optional[Path] = None, mode: str = "w"):
|
173
|
+
"""Configure global file logging."""
|
174
|
+
_maqet_logger.configure_file_logging(log_file, mode)
|