Skip to content

Commit 32144cc

Browse files
authored
Merge pull request #38 from smarbal/main
Updated requirements.txt and f-strings
2 parents 97df993 + 2326b63 commit 32144cc

14 files changed

+59
-59
lines changed

requirements.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
peewee
2-
prompt_toolkit>=3.0.32
1+
peewee>=3.17.6
2+
prompt_toolkit>=3.0.47
33
requests
4-
tinyscript>=1.28.6
4+
tinyscript>=1.30.15

src/sploitkit/base/commands/general.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def run(self, text):
5555
t = BorderlessTable(data, "Matching modules")
5656
print_formatted_text(t.table)
5757
n = len(data) - 2
58-
self.logger.info("{} match{} found".format(n, ["", "es"][n > 0]))
58+
self.logger.info(f"{n} match{['', 'es'][n > 0]} found")
5959

6060

6161
class Show(Command):

src/sploitkit/base/commands/project.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,22 @@ class Archive(ProjectRootCommand):
4545
def run(self, project):
4646
projpath = Path(self.workspace).joinpath(project)
4747
folder = ProjectPath(projpath)
48-
self.logger.debug("Archiving project '{}'...".format(project))
48+
self.logger.debug(f"Archiving project '{project}'...")
4949
ask = self.console.config.option("ENCRYPT_PROJECT").value
5050
try:
5151
folder.archive(ask=ask)
52-
self.logger.success("'{}' archived".format(project))
52+
self.logger.success(f"'{project}' archived")
5353
except OSError as e:
54-
logger.error(str(e))
55-
self.logger.failure("'{}' not archived".format(project))
54+
self.logger.error(str(e))
55+
self.logger.failure(f"'{project}' not archived")
5656

5757

5858
class Delete(ProjectRootCommand):
5959
""" Delete a project """
6060
def run(self, project):
61-
self.logger.debug("Deleting project '{}'...".format(project))
61+
self.logger.debug(f"Deleting project '{project}'...")
6262
self.workspace.joinpath(project).remove()
63-
self.logger.success("'{}' deleted".format(project))
63+
self.logger.success(f"'{project}' deleted")
6464

6565

6666
class Load(ProjectRootCommand):
@@ -70,16 +70,16 @@ def complete_values(self):
7070
return [x.stem for x in self.workspace.iterfiles(".zip")]
7171

7272
def run(self, project):
73-
self.logger.debug("Loading archive '{}'...".format(project + ".zip"))
73+
self.logger.debug(f"Loading archive '{project}.zip'...")
7474
projpath = Path(self.workspace).joinpath(project)
7575
archive = ProjectPath(projpath.with_suffix(".zip"))
7676
ask = self.console.config.option("ENCRYPT_PROJECT").value
7777
try:
7878
archive.load(ask=ask)
79-
self.logger.success("'{}' loaded".format(project))
79+
self.logger.success(f"'{project}' loaded")
8080
except Exception as e:
81-
logger.error("Bad password" if "error -3" in str(e) else str(e))
82-
self.logger.failure("'{}' not loaded".format(project))
81+
self.logger.error("Bad password" if "error -3" in str(e) else str(e))
82+
self.logger.failure(f"'{project}' not loaded")
8383

8484
def validate(self, project):
8585
if project not in self.complete_values():
@@ -100,9 +100,9 @@ def run(self, project):
100100
"do you want to load the archive instead ?"):
101101
loader.run(project)
102102
if not p.exists():
103-
self.logger.debug("Creating project '{}'...".format(project))
103+
self.logger.debug(f"Creating project '{project}'...")
104104
p.mkdir()
105-
self.logger.success("'{}' created".format(project))
105+
self.logger.success(f"'{project}' created")
106106
ProjectConsole(self.console, project).start()
107107
self.config['WORKSPACE'] = str(Path(self.config['WORKSPACE']).parent)
108108

src/sploitkit/base/commands/recording.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class RecordStatus(Command):
1414
values = ["status"]
1515

1616
def run(self, status):
17-
self.logger.info("Recording is {}".format(["disabled", "enabled"][self.recorder.enabled]))
17+
self.logger.info(f"Recording is {['disabled', 'enabled'][self.recorder.enabled]}")
1818

1919

2020
# ------------------------------ ROOT-LEVEL COMMANDS ---------------------------
@@ -38,7 +38,7 @@ def run(self, key, rcfile=None):
3838
elif key == "stop":
3939
self.recorder.stop()
4040
elif key == "status":
41-
self.logger.info("Recording is {}".format(["disabled", "enabled"][self.recorder.enabled]))
41+
self.logger.info(f"Recording is {['disabled', 'enabled'][self.recorder.enabled]}")
4242

4343
def validate(self, key, rcfile=None):
4444
if key == "start":
@@ -57,6 +57,6 @@ def complete_values(self, key=None):
5757
return [x.name for x in Path(self.workspace).iterfiles(".rc")]
5858

5959
def run(self, rcfile):
60-
self.logger.debug("Replaying commands from file '{}'...".format(rcfile))
60+
self.logger.debug(f"Replaying commands from file '{rcfile}'...")
6161
self.console.replay(rcfile)
6262

src/sploitkit/base/commands/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ class State(DebugCommand):
121121
""" Display console's shared state """
122122
def run(self):
123123
for k, v in self.console.state.items():
124-
print_formatted_text("\n{}:".format(k))
124+
print_formatted_text(f"\n{k}:")
125125
v = v or ""
126126
if len(v) == 0:
127127
continue

src/sploitkit/base/models/organization.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Meta:
2323

2424
@property
2525
def fullname(self):
26-
return "{} {} ({})".format(self.firstname, self.lastname, self.role)
26+
return f"{self.firstname} {self.lastname} ({self.role})"
2727

2828

2929
class EmployeeUnit(BaseModel):

src/sploitkit/core/command.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def __init__(self, *args):
5151
s += " ["
5252
i = []
5353
for a, d in zip(args[len(args)-len(defs):], defs):
54-
i.append("{}={}".format(a, d) if d is not None else a)
54+
i.append(f"{a}={d}" if d is not None else a)
5555
s += " ".join(i) + "]"
5656
self.signature = s
5757
self.args, self.defaults = args, defs
@@ -182,7 +182,7 @@ def get_help(cls, *levels, **kwargs):
182182
continue
183183
d.append([n, getattr(c, "description", "")])
184184
if len(d) > 1:
185-
t = BorderlessTable(d, "{} commands".format(l.capitalize()))
185+
t = BorderlessTable(d, f"{l.capitalize()} commands")
186186
s += t.table + "\n"
187187
i += 1
188188
return "\n" + s.strip() + "\n" if i > 0 else ""
@@ -200,13 +200,13 @@ def register_command(cls, subcls):
200200
Command.commands[l][subcls.name] = subcls
201201
for alias in subcls.aliases:
202202
Command.commands[l][alias] = subcls
203-
logger.detail("Registered command alias '{}'".format(alias))
203+
logger.detail(f"Registered command alias '{alias}'")
204204

205205
@classmethod
206206
def set_style(cls, style):
207207
""" Set the style of command name. """
208208
if style not in COMMAND_STYLES:
209-
raise ValueError("Command style must be one of the followings: [{}]".format("|".join(COMMAND_STYLES)))
209+
raise ValueError(f"Command style must be one of the followings: [{'|'.join(COMMAND_STYLES)}]")
210210
MetaCommand.style = style
211211

212212
@classmethod
@@ -234,7 +234,7 @@ def unregister_command(cls, subcls):
234234
for l in levels:
235235
if len(Command.commands[l]) == 0:
236236
del Command.commands[l]
237-
logger.detail("Unregistered command '{}/{}'".format(l, n))
237+
logger.detail(f"Unregistered command '{l}/{n}'")
238238

239239
@classmethod
240240
def unregister_commands(cls, *identifiers):
@@ -248,7 +248,7 @@ def unregister_commands(cls, *identifiers):
248248
# apply deletions
249249
if n is None:
250250
if f not in cls._functionalities:
251-
raise ValueError("Unknown functionality {}".format(f))
251+
raise ValueError(f"Unknown functionality {f}")
252252
p = Path(__file__).parent.joinpath("../base/commands/" + f + ".py").resolve()
253253
for c in PythonPath(str(p)).get_classes(Command):
254254
Command.unregister_command(c)

src/sploitkit/core/components/files.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def get(self, locator, *args, **kwargs):
7272
with open(path, 'rb') as f:
7373
self[locator] = f.read()
7474
else:
75-
raise ValueError("Unsupported scheme '{}'".format(scheme))
75+
raise ValueError(f"Unsupported scheme '{scheme}'")
7676

7777
def page(self, *filenames):
7878
""" Page a list of files using Less. """

src/sploitkit/core/components/store.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def snapshot(self, save=True):
118118
self.close()
119119
if save:
120120
self._last_snapshot += 1
121-
s = "{}.snapshot{}".format(self.path, self._last_snapshot)
121+
s = f"{self.path}.snapshot{self._last_snapshot}"
122122
from shutil import copy
123123
copy(self.path, s) if save else copy(s, self.path)
124124
if not save:

src/sploitkit/core/components/validator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def validate(self, document):
3030
try:
3131
c._validate(*tokens[1:])
3232
except Exception as e:
33-
m = "Command syntax: %s{}" % c.signature.format(cmd)
33+
m = f"Command syntax: {c.signature.format(cmd)}"
3434
e = str(e)
3535
if not e.startswith("validate() "):
3636
m = m.format([" (" + e + ")", ""][len(e) == 0])

src/sploitkit/core/console.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def __init(self, **kwargs):
184184

185185
def _close(self):
186186
""" Gracefully close the console. """
187-
self.logger.debug("Exiting {}[{}]".format(self.__class__.__name__, id(self)))
187+
self.logger.debug(f"Exiting {self.__class__.__name__}[{id(self)}]")
188188
if hasattr(self, "close") and isfunction(self.close):
189189
self.close()
190190
# cleanup references for this console
@@ -230,15 +230,15 @@ def _get_tokens(self, text, suffix=("", "\"", "'")):
230230
def _reset_logname(self):
231231
""" Reset logger's name according to console's attributes. """
232232
try:
233-
self.logger.name = "{}:{}".format(self.level, self.logname)
233+
self.logger.name = f"{self.level}:{self.logname}"
234234
except AttributeError:
235235
self.logger.name = self.__class__.name
236236

237237
def _run_if_defined(self, func):
238238
""" Run the given function if it is defined at the module level. """
239239
if hasattr(self, "module") and hasattr(self.module, func) and \
240240
not (getattr(self.module._instance, func)() is None):
241-
self.logger.debug("{} failed".format(func))
241+
self.logger.debug(f"{func} failed")
242242
return False
243243
return True
244244

@@ -388,7 +388,7 @@ def start(self):
388388
""" Start looping with console's session prompt. """
389389
reexec = None
390390
self._reset_logname()
391-
self.logger.debug("Starting {}[{}]".format(self.__class__.__name__, id(self)))
391+
self.logger.debug(f"Starting {self.__class__.__name__}[{id(self)}]")
392392
# execute attached module's pre-load function if relevant
393393
self._run_if_defined("preload")
394394
# now start the console loop
@@ -474,7 +474,7 @@ def uptime(self):
474474
s = t.total_seconds()
475475
h, _ = divmod(s, 3600)
476476
m, s = divmod(_, 60)
477-
return "{:02}:{:02}:{:02}".format(int(h), int(m), int(s))
477+
return f"{h:02}:{m:02}:{s:02}"
478478

479479

480480
class ConsoleDuplicate(Exception):
@@ -592,7 +592,7 @@ def _set_logging(self, debug=False, to_file=True, **kwargs):
592592
# setup internal (dev) loggers with the default logging.configLogger (enhancement to logging from Tinyscript)
593593
set_logging_level(l, "core", config_func=lambda lgr, lvl: get_logger(lgr.name, p2, lvl, True, dev))
594594
if l != "INFO" and not kwargs.get('silent', False):
595-
self.logger.debug("Set logging to {}".format(l))
595+
self.logger.debug(f"Set logging to {l}")
596596

597597
def _set_workspace(self):
598598
""" Set a new APP_FOLDER, moving an old to the new one if necessary. """

src/sploitkit/core/entity.py

+19-19
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def load_entities(entities, *sources, **kwargs):
3838
for n in ENTITIES:
3939
n = n.lower()
4040
for m in kwargs.get("select", {}).get(n, [""]):
41-
m = "../base/{}s/".format(n) + m + [".py", ""][m == ""]
41+
m = f"../base/{n}s/" + m + [".py", ""][m == ""]
4242
p = Path(__file__).parent.joinpath(m).resolve()
4343
if p.exists():
4444
sources.insert(0, p)
@@ -292,7 +292,7 @@ def _execv(value):
292292
if check_key:
293293
for ssk, ssv in sv.items():
294294
if ssk not in cs.keys() or cs[ssk] != ssv:
295-
_tmp.append("{}={}".format(sk, sv))
295+
_tmp.append(f"{sk}={sv}")
296296
break
297297
# case 2: {None: ...}
298298
else:
@@ -307,7 +307,7 @@ def _execv(value):
307307
if ref is not None and ref in values[1:]:
308308
found = True
309309
if not found:
310-
_tmp.append("{}?{}".format(sk, ref))
310+
_tmp.append(f"{sk}?{ref}")
311311
elif is_dict(ssv):
312312
# e.g. {monitor:True}
313313
found = False
@@ -321,15 +321,15 @@ def _execv(value):
321321
found = True
322322
break
323323
if not found:
324-
v = ["{}:{}".format(sssk, sssv), sssv][sssv is None]
325-
_tmp.append("{}?{}".format(sk, v))
324+
v = [f"{sssk}:{sssv}", sssv][sssv is None]
325+
_tmp.append(f"{sk}?{v}")
326326
elif ssv not in cs.values():
327-
_tmp.append("{}?{}".format(sk, ssv))
327+
_tmp.append(f"{sk}?{ssv}")
328328
break
329329
# exact match between any other type than dict
330330
else:
331331
if sv != Console._state[sk]:
332-
_tmp.append("{}={}".format(sk, sv))
332+
_tmp.append(f"{sk}={sv}")
333333
if len(_tmp) > 0:
334334
errors.setdefault("state", [])
335335
errors['state'].extend(_tmp)
@@ -356,7 +356,7 @@ def _execv(value):
356356
errors["packages"].append((package, not_))
357357
cls._enabled = False
358358
else:
359-
raise ValueError("Unknown requirements type '{}'".format(k))
359+
raise ValueError(f"Unknown requirements type '{k}'")
360360
cls._errors = errors
361361
# check for applicability
362362
cls._applicable = True
@@ -442,21 +442,21 @@ def msg(scname, key, item):
442442
if m is not None:
443443
return m.format(item)
444444
if key == "file":
445-
return "'{}' {}found".format(item, not_s)
445+
return f"'{item}' {not_s}found"
446446
elif key == "packages":
447-
return "'{}' system package is {}installed".format(item, not_s)
447+
return f"'{item}' system package is {not_s}installed"
448448
elif key == "python":
449-
return "'{}' Python package is {}installed".format(item, not_s)
449+
return f"'{item}' Python package is {not_s}installed"
450450
elif key == "tools":
451-
return "'{}' tool is {}installed".format(item, not_s)
451+
return f"'{item}' tool is {not_s}installed"
452452
elif key == "state":
453453
item = re.split(r"(\=|\?)", item, 1)
454454
if len(item) == 1:
455-
return "'{}' state key is not defined".format(item[0])
455+
return f"'{item[0]}' state key is not defined"
456456
elif item[1] == "=":
457-
return "'{}' state key does not match the expected value '{}'".format(item[0], item[2])
457+
return f"'{item[0]}' state key does not match the expected value '{item[2]}'"
458458
elif item[1] == "?":
459-
return "'{}' state key is expected to have value '{}' at least once".format(item[0], item[2])
459+
return f"'{item[0]}' state key is expected to have value '{item[2]}' at least once"
460460
# list issues using the related class method
461461
t = "\n"
462462
d = OrderedDict()
@@ -473,7 +473,7 @@ def msg(scname, key, item):
473473
for cname, scnames in names.items():
474474
scnames = list(set(scnames))
475475
cname += ["", "s"][len(scnames) > 1]
476-
t += "{}: {}\n".format(cname, ", ".join(sorted(scnames)))
476+
t += f"{cname}: {', '.join(sorted(scnames))}\n"
477477
# exception to issue messages: 'config' requirement
478478
t += "- " + "\n- ".join(msg(scname, k, e) for k, err in errors.items() for e in err if k != "config") + "\n"
479479
return "" if t.strip() == "" else t
@@ -540,7 +540,7 @@ def register_subclass(cls, subcls):
540540
# manually get subclass' name because of MetaModel not having the "name" property (would be considered a
541541
# Peewee database field)
542542
n = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', re.sub(r'(.)([A-Z][a-z]+)', r'\1_\2', subcls.__name__)).lower()
543-
logger.detail("Registered {} '{}'".format(subcls.entity, n))
543+
logger.detail(f"Registered {subcls.entity} '{n}'")
544544

545545
@classmethod
546546
def unregister_subclass(cls, subcls):
@@ -551,7 +551,7 @@ def unregister_subclass(cls, subcls):
551551
if cls in Entity._subclasses.keys():
552552
try:
553553
Entity._subclasses[cls].remove(subcls)
554-
logger.detail("Unregistered {} '{}'".format(subcls.entity, n))
554+
logger.detail(f"Unregistered {subcls.entity} '{n}'")
555555
except ValueError:
556556
pass
557557

@@ -563,7 +563,7 @@ def unregister_subclasses(cls, *subclss):
563563

564564
def run(self, *args, **kwargs):
565565
""" Generic method for running Entity's logic. """
566-
raise NotImplementedError("{}'s run() method is not implemented".format(self.__class__.__name__))
566+
raise NotImplementedError(f"{self.__class__.__name__}'s run() method is not implemented")
567567

568568

569569
class MetaEntityBase(type):

src/sploitkit/core/model.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __new__(meta, name, bases, clsdict):
2323
pass
2424
# add triggers here
2525
#try:
26-
# trigger = "{}_updated".format(subcls._meta.table_name)
26+
# trigger = f"{subcls._meta.table_name}_updated"
2727
# subcls.add_trigger(trigger, "AFTER", "UPDATE", "UPDATE", "SET updated=CURRENT_TIMESTAMP")
2828
#except AttributeError:
2929
# pass

0 commit comments

Comments
 (0)