FreedomBox/actions/email_server

69 lines
1.7 KiB
Python
Executable File

#!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later
import argparse
import logging
import os
import sys
logger = logging.getLogger(__name__)
EXIT_SYNTAX = 10
EXIT_PERM = 20
def reserved_for_root(fun):
def wrapped(*args, **kwargs):
if os.getuid() != 0:
logger.critical('This action is reserved for root')
sys.exit(EXIT_PERM)
return fun(*args, **kwargs)
return wrapped
def main():
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-i', nargs=2, dest='ipc')
group.add_argument('-t', nargs=1, dest='touch_file')
adict = vars(parser.parse_args())
generator = (kv for kv in adict.items() if kv[1] is not None)
subcommand, arguments = next(generator)
function = globals()['subcommand_' + subcommand]
function(*arguments)
@reserved_for_root
def subcommand_ipc(module_name, action_name):
import plinth.modules.email_server.audit as audit
# We only run actions defined in the audit module
if module_name not in audit.__all__:
logger.critical('Bad module name: %r', module_name)
sys.exit(EXIT_SYNTAX)
module = getattr(audit, module_name)
function = getattr(module, 'action_' + action_name, None)
if function is None:
logger.critical('Bad action: %s/%r', module_name, action_name)
sys.exit(EXIT_SYNTAX)
function()
def subcommand_touch_file(path):
import pathlib
if os.getuid == 0:
logger.critical('Do not run as root')
sys.exit(EXIT_PERM)
# mode is influenced by umask
pathlib.Path(path).touch(mode=0o660, exist_ok=True)
if __name__ == '__main__':
main()