mirror of
https://github.com/chatmail/relay.git
synced 2026-05-14 01:44:38 +00:00
making it work
This commit is contained in:
132
deploy-chatmail/src/deploy_chatmail/cmdeploy.py
Normal file
132
deploy-chatmail/src/deploy_chatmail/cmdeploy.py
Normal file
@@ -0,0 +1,132 @@
|
||||
"""
|
||||
Provides the `cmdeploy` entry point function,
|
||||
along with command line option and subcommand parsing.
|
||||
"""
|
||||
import importlib.resources
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
|
||||
import iniconfig
|
||||
|
||||
from termcolor import colored
|
||||
from chatmaild.config import read_config
|
||||
|
||||
|
||||
class Out:
|
||||
"""Convenience print output printer providing coloring."""
|
||||
|
||||
def red(self, msg):
|
||||
print(colored(msg, "red"))
|
||||
|
||||
def green(self, msg):
|
||||
print(colored(msg, "green"))
|
||||
|
||||
def __call__(self, msg, red=False, green=False):
|
||||
color = "red" if red else ("green" if green else None)
|
||||
print(colored(msg, color))
|
||||
|
||||
|
||||
description = """\
|
||||
Setup your chatmail server configuration and
|
||||
deploy it via SSH to your remote location.
|
||||
"""
|
||||
|
||||
|
||||
def add_config_option(parser):
|
||||
parser.add_argument(
|
||||
"--config",
|
||||
dest="chatmail_ini",
|
||||
action="store",
|
||||
default=Path("chatmail.ini"),
|
||||
type=Path,
|
||||
help="path to the chatmail.ini file",
|
||||
)
|
||||
|
||||
|
||||
def add_subcommand(subparsers, func):
|
||||
name = func.__name__
|
||||
assert name.endswith("_cmd")
|
||||
name = name[:-4]
|
||||
doc = func.__doc__.strip()
|
||||
p = subparsers.add_parser(name, description=doc, help=doc)
|
||||
p.set_defaults(func=func)
|
||||
return p
|
||||
|
||||
|
||||
def get_parser():
|
||||
"""Return an ArgumentParser for the 'cmdeploy' CLI."""
|
||||
parser = argparse.ArgumentParser(description=description)
|
||||
subparsers = parser.add_subparsers(
|
||||
title="subcommands",
|
||||
)
|
||||
|
||||
init_parser = add_subcommand(subparsers, init_cmd)
|
||||
add_config_option(init_parser)
|
||||
init_parser.add_argument(
|
||||
"chatmail_domain",
|
||||
action="store",
|
||||
help="fully qualified DNS domain name for your chatmail instance",
|
||||
)
|
||||
|
||||
install_parser = add_subcommand(subparsers, install_cmd)
|
||||
add_config_option(install_parser)
|
||||
return parser
|
||||
|
||||
def write_initial_config(inipath, mailname, out):
|
||||
inidir = importlib.resources.files(__package__).joinpath("ini")
|
||||
content = inidir.joinpath("chatmail.ini.f").read_text().format(mailname=mailname)
|
||||
if mailname.endswith(".testrun.org"):
|
||||
override_inipath = inidir.joinpath("override-testrun.ini")
|
||||
privacy = iniconfig.IniConfig(override_inipath)["privacy"]
|
||||
lines = []
|
||||
for line in content.split("\n"):
|
||||
for key, value in privacy.items():
|
||||
value_lines = value.strip().split("\n")
|
||||
if not line.startswith(f"{key} =") or not value_lines:
|
||||
continue
|
||||
if len(value_lines) == 1:
|
||||
lines.append(f"{key} = {value}")
|
||||
else:
|
||||
lines.append(f"{key} =")
|
||||
for vl in value_lines:
|
||||
lines.append(f" {vl}")
|
||||
break
|
||||
else:
|
||||
lines.append(line)
|
||||
content = "\n".join(lines)
|
||||
|
||||
inipath.write_text(content)
|
||||
out(f"written {inipath} for chatmail domain {mailname}")
|
||||
|
||||
|
||||
def init_cmd(args, out):
|
||||
"""Initialize chatmail config file."""
|
||||
if args.chatmail_ini.exists():
|
||||
out.red(f"Path exists, not modifying: {args.xdcget_ini}")
|
||||
raise SystemExit(1)
|
||||
write_initial_config(args.chatmail_ini, args.chatmail_domain, out)
|
||||
|
||||
|
||||
def install_cmd(args, out):
|
||||
"""Install or update chatmail services on the remote server. """
|
||||
try:
|
||||
config = read_config(args.chatmail_ini)
|
||||
except Exception as ex:
|
||||
out.red(ex)
|
||||
raise SystemExit(1)
|
||||
|
||||
XXX
|
||||
|
||||
|
||||
def main(args=None):
|
||||
"""Provide main entry point for 'xdcget' CLI invocation."""
|
||||
parser = get_parser()
|
||||
args = parser.parse_args(args=args)
|
||||
if not hasattr(args, "func"):
|
||||
return parser.parse_args(["-h"])
|
||||
out = Out()
|
||||
args.func(args, out)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
34
deploy-chatmail/src/deploy_chatmail/ini/chatmail.ini.f
Normal file
34
deploy-chatmail/src/deploy_chatmail/ini/chatmail.ini.f
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
[params]
|
||||
|
||||
# mail domain (MUST be set to fully qualified chat mail domain)
|
||||
mailname = {mailname}
|
||||
|
||||
#
|
||||
# If you only do private test deploys, you don't need to modify any settings below
|
||||
#
|
||||
|
||||
# how many mails a user can send out per minute
|
||||
max_user_send_per_minute = 60
|
||||
|
||||
# list of e-mail recipients for which to accept outbound un-encrypted mails
|
||||
passthrough_recipients =
|
||||
|
||||
# where the filtermail SMTP service listens
|
||||
filtermail_smtp_port = 10080
|
||||
|
||||
# postfix accepts on the localhost reinject SMTP port
|
||||
postfix_reinject_port = 10025
|
||||
|
||||
# postal address of privacy contact
|
||||
privacy_postal =
|
||||
|
||||
# email address of privacy contact
|
||||
privacy_mail =
|
||||
|
||||
# postal address of the privacy data officer
|
||||
privacy_pdo =
|
||||
|
||||
# postal address of the privacy supervisor
|
||||
privacy_supervisor =
|
||||
|
||||
16
deploy-chatmail/src/deploy_chatmail/ini/override-testrun.ini
Normal file
16
deploy-chatmail/src/deploy_chatmail/ini/override-testrun.ini
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
[privacy]
|
||||
|
||||
passthrough_recipients = privacy@testrun.org
|
||||
|
||||
privacy_postal =
|
||||
Merlinux GmbH, Represented by the managing director H. Krekel,
|
||||
Reichgrafen Str. 20, 79102 Freiburg, Germany
|
||||
|
||||
privacy_mail = privacy@testrun.org
|
||||
privacy_pdo =
|
||||
Prof. Dr. Fabian Schmieder, lexICT UG (limited), Ostfeldstr. 49, 30559 Hannover.
|
||||
You can contact him at *delta-privacy@merlinux.eu* (Keyword: DPO)
|
||||
privacy_supervisor =
|
||||
State Commissioner for Data Protection and Freedom of Information of
|
||||
Baden-Württemberg in 70173 Stuttgart, Germany.
|
||||
Reference in New Issue
Block a user