Skip to content

Commit

Permalink
Add instance command with config subcommand
Browse files Browse the repository at this point in the history
  • Loading branch information
ColdHeat committed Aug 23, 2024
1 parent 704a864 commit 2d70436
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 0 deletions.
5 changes: 5 additions & 0 deletions ctfcli/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from ctfcli.cli.challenges import ChallengeCommand
from ctfcli.cli.config import ConfigCommand
from ctfcli.cli.instance import InstanceCommand
from ctfcli.cli.pages import PagesCommand
from ctfcli.cli.plugins import PluginsCommand
from ctfcli.cli.templates import TemplatesCommand
Expand Down Expand Up @@ -101,6 +102,9 @@ def init(
def config(self):
return COMMANDS.get("config")

def instance(self):
return COMMANDS.get("instance")

def challenge(self):
return COMMANDS.get("challenge")

Expand All @@ -120,6 +124,7 @@ def templates(self):
"pages": PagesCommand(),
"plugins": PluginsCommand(),
"templates": TemplatesCommand(),
"instance": InstanceCommand(),
"cli": CTFCLI(),
}

Expand Down
65 changes: 65 additions & 0 deletions ctfcli/cli/instance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import logging

import click

from ctfcli.core.config import Config
from ctfcli.core.instance.config import ServerConfig

log = logging.getLogger("ctfcli.cli.instance")


class ConfigCommand:
def get(self, key):
"""Get the value of a specific remote instance config key"""
return ServerConfig.get(key=key)

def set(self, key, value):
"""Set the value of a specific remote instance config key"""
ServerConfig.set(key=key, value=value)
click.secho(f"Successfully set '{key}' to '{value}'", fg="green")

def pull(self):
"""Copy remote instance configuration values to local config"""
server_configs = ServerConfig.getall()

config = Config()
if config.config.has_section("instance") is False:
config.config.add_section("instance")

for k, v in server_configs.items():
# We always store as a string because the CTFd Configs model is a string
if v == "None":
v = "null"
config.config.set("instance", k, str(v))

with open(config.config_path, "w+") as f:
config.write(f)

click.secho("Successfully pulled configuration", fg="green")

def push(self):
"""Save local instance configuration values to remote CTFd instance"""
config = Config()
if config.config.has_section("instance") is False:
config.config.add_section("instance")

configs = {}
for k in config["instance"]:
v = config["instance"][k]
if v == "null":
v = None
configs[k] = v

failed_configs = ServerConfig.setall(configs=configs)
for f in failed_configs:
click.secho(f"Failed to push config {f}", fg="red")

if not failed_configs:
click.secho("Successfully pushed config", fg="green")
else:
return 1


class InstanceCommand:
def config(self):
return ConfigCommand
4 changes: 4 additions & 0 deletions ctfcli/core/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,7 @@ class InvalidPageConfiguration(PageException):

class IllegalPageOperation(PageException):
pass


class InstanceConfigException(Exception):
pass

0 comments on commit 2d70436

Please sign in to comment.