Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
9107474d31 | |||
2bf809c454 | |||
1e6655a715 |
3
Makefile
3
Makefile
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
shell:
|
shell:
|
||||||
MYPYPATH=`pipenv --venv`/lib/python3.11/site-packages pipenv shell
|
MYPYPATH=`pipenv --venv`/lib/python3.11/site-packages pipenv shell
|
||||||
|
|
||||||
@ -18,6 +16,7 @@ requirements.txt: Pipfile.lock
|
|||||||
build: clean requirements.txt
|
build: clean requirements.txt
|
||||||
python3 -m pip install -r requirements.txt --target build
|
python3 -m pip install -r requirements.txt --target build
|
||||||
cp -r mail4one/ build/
|
cp -r mail4one/ build/
|
||||||
|
sed -i "s/DEVELOMENT/$(shell scripts/get_version.sh)/" build/mail4one/version.py
|
||||||
python3 -m compileall build/mail4one -f
|
python3 -m compileall build/mail4one -f
|
||||||
rm -rf build/*.dist-info
|
rm -rf build/*.dist-info
|
||||||
python3 -m zipapp \
|
python3 -m zipapp \
|
||||||
|
@ -321,8 +321,8 @@ async def start_session() -> None:
|
|||||||
except ClientError as c:
|
except ClientError as c:
|
||||||
write(err("Something went wrong"))
|
write(err("Something went wrong"))
|
||||||
logger.error(f"Unexpected client error: {c}")
|
logger.error(f"Unexpected client error: {c}")
|
||||||
except Exception as e:
|
except:
|
||||||
logger.error(f"Serious client error: {e}")
|
logger.exception("Serious client error")
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
with contextlib.suppress(KeyError):
|
with contextlib.suppress(KeyError):
|
||||||
@ -350,11 +350,14 @@ def make_pop_server_callback(mails_path: Path, users: list[User],
|
|||||||
c_state.set(
|
c_state.set(
|
||||||
State(reader=reader, writer=writer, ip=ip, req_id=scfg.next_id()))
|
State(reader=reader, writer=writer, ip=ip, req_id=scfg.next_id()))
|
||||||
logger.info(f"Got pop server callback")
|
logger.info(f"Got pop server callback")
|
||||||
|
try:
|
||||||
try:
|
try:
|
||||||
return await asyncio.wait_for(start_session(), timeout_seconds)
|
return await asyncio.wait_for(start_session(), timeout_seconds)
|
||||||
finally:
|
finally:
|
||||||
writer.close()
|
writer.close()
|
||||||
await writer.wait_closed()
|
await writer.wait_closed()
|
||||||
|
except:
|
||||||
|
logger.exception("unexpected exception")
|
||||||
|
|
||||||
return session_cb
|
return session_cb
|
||||||
|
|
||||||
@ -368,7 +371,7 @@ async def create_pop_server(
|
|||||||
timeout_seconds: int = 60,
|
timeout_seconds: int = 60,
|
||||||
) -> asyncio.Server:
|
) -> asyncio.Server:
|
||||||
logging.info(
|
logging.info(
|
||||||
f"Starting POP3 server {host=}, {port=}, {mails_path=}, {len(users)=}, {ssl_context != None=}, {timeout_seconds=}"
|
f"Starting POP3 server {host=}, {port=}, {mails_path=!s}, {len(users)=}, {ssl_context != None=}, {timeout_seconds=}"
|
||||||
)
|
)
|
||||||
return await asyncio.start_server(
|
return await asyncio.start_server(
|
||||||
make_pop_server_callback(mails_path, users, timeout_seconds),
|
make_pop_server_callback(mails_path, users, timeout_seconds),
|
||||||
|
@ -9,6 +9,7 @@ from getpass import getpass
|
|||||||
|
|
||||||
from .smtp import create_smtp_server_starttls, create_smtp_server
|
from .smtp import create_smtp_server_starttls, create_smtp_server
|
||||||
from .pop3 import create_pop_server
|
from .pop3 import create_pop_server
|
||||||
|
from .version import VERSION
|
||||||
|
|
||||||
from . import config
|
from . import config
|
||||||
from . import pwhash
|
from . import pwhash
|
||||||
@ -25,15 +26,17 @@ def setup_logging(cfg: config.LogCfg):
|
|||||||
if cfg.logfile == "STDOUT":
|
if cfg.logfile == "STDOUT":
|
||||||
logging.basicConfig(level=cfg.level, format=logging_format)
|
logging.basicConfig(level=cfg.level, format=logging_format)
|
||||||
else:
|
else:
|
||||||
logging.basicConfig(filename=cfg.logfile, level=cfg.level, format=logging_format)
|
logging.basicConfig(filename=cfg.logfile,
|
||||||
|
level=cfg.level,
|
||||||
|
format=logging_format)
|
||||||
|
|
||||||
|
|
||||||
async def a_main(cfg: config.Config) -> None:
|
async def a_main(cfg: config.Config) -> None:
|
||||||
default_tls_context: ssl.SSLContext | None = None
|
default_tls_context: ssl.SSLContext | None = None
|
||||||
|
|
||||||
if tls := cfg.default_tls:
|
if tls := cfg.default_tls:
|
||||||
logging.info(f"Initializing default tls {tls.certfile=}, {tls.keyfile=}")
|
logging.info(
|
||||||
|
f"Initializing default tls {tls.certfile=}, {tls.keyfile=}")
|
||||||
default_tls_context = create_tls_context(tls.certfile, tls.keyfile)
|
default_tls_context = create_tls_context(tls.certfile, tls.keyfile)
|
||||||
|
|
||||||
def get_tls_context(tls: config.TLSCfg | str):
|
def get_tls_context(tls: config.TLSCfg | str):
|
||||||
@ -102,6 +105,7 @@ def main() -> None:
|
|||||||
description="Personal Mail Server",
|
description="Personal Mail Server",
|
||||||
epilog="See https://gitea.balki.me/balki/mail4one for more info",
|
epilog="See https://gitea.balki.me/balki/mail4one for more info",
|
||||||
)
|
)
|
||||||
|
parser.add_argument("-v", "--version", action="version", version=VERSION)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-e",
|
"-e",
|
||||||
"--echo_password",
|
"--echo_password",
|
||||||
@ -150,7 +154,7 @@ def main() -> None:
|
|||||||
else:
|
else:
|
||||||
cfg = config.Config(args.config.read_text())
|
cfg = config.Config(args.config.read_text())
|
||||||
setup_logging(config.LogCfg(cfg.logging))
|
setup_logging(config.LogCfg(cfg.logging))
|
||||||
logging.info(f"Starting mail4one {args.config=}")
|
logging.info(f"Starting mail4one {VERSION} {args.config=!s}")
|
||||||
asyncio.run(a_main(cfg))
|
asyncio.run(a_main(cfg))
|
||||||
|
|
||||||
|
|
||||||
|
@ -75,8 +75,8 @@ def protocol_factory_starttls(mails_path: Path,
|
|||||||
tls_context=context,
|
tls_context=context,
|
||||||
enable_SMTPUTF8=True,
|
enable_SMTPUTF8=True,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except:
|
||||||
logger.error("Something went wrong", e)
|
logger.exception("Something went wrong")
|
||||||
raise
|
raise
|
||||||
return smtp
|
return smtp
|
||||||
|
|
||||||
@ -87,8 +87,8 @@ def protocol_factory(mails_path: Path, mbox_finder: Callable[[str],
|
|||||||
try:
|
try:
|
||||||
handler = MyHandler(mails_path, mbox_finder)
|
handler = MyHandler(mails_path, mbox_finder)
|
||||||
smtp = SMTP(handler=handler, enable_SMTPUTF8=True)
|
smtp = SMTP(handler=handler, enable_SMTPUTF8=True)
|
||||||
except Exception as e:
|
except:
|
||||||
logger.error("Something went wrong", e)
|
logger.exception("Something went wrong")
|
||||||
raise
|
raise
|
||||||
return smtp
|
return smtp
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ async def create_smtp_server_starttls(
|
|||||||
ssl_context: ssl.SSLContext,
|
ssl_context: ssl.SSLContext,
|
||||||
) -> asyncio.Server:
|
) -> asyncio.Server:
|
||||||
logging.info(
|
logging.info(
|
||||||
f"Starting SMTP STARTTLS server {host=}, {port=}, {mails_path=}, {ssl_context != None=}"
|
f"Starting SMTP STARTTLS server {host=}, {port=}, {mails_path=!s}, {ssl_context != None=}"
|
||||||
)
|
)
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
return await loop.create_server(
|
return await loop.create_server(
|
||||||
@ -121,7 +121,7 @@ async def create_smtp_server(
|
|||||||
ssl_context: ssl.SSLContext | None = None,
|
ssl_context: ssl.SSLContext | None = None,
|
||||||
) -> asyncio.Server:
|
) -> asyncio.Server:
|
||||||
logging.info(
|
logging.info(
|
||||||
f"Starting SMTP server {host=}, {port=}, {mails_path=}, {ssl_context != None=}"
|
f"Starting SMTP server {host=}, {port=}, {mails_path=!s}, {ssl_context != None=}"
|
||||||
)
|
)
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
return await loop.create_server(
|
return await loop.create_server(
|
||||||
|
2
mail4one/version.py
Normal file
2
mail4one/version.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
VERSION = "DEVELOMENT"
|
30
scripts/get_version.sh
Executable file
30
scripts/get_version.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
commit=$(git rev-parse --short HEAD)
|
||||||
|
|
||||||
|
# This is true if there is a tag on current HEAD
|
||||||
|
if git describe --exact-match > /dev/null 2>&1
|
||||||
|
then
|
||||||
|
tag_val=$(git describe --dirty=DIRTY --exact-match)
|
||||||
|
case "$tag_val" in
|
||||||
|
*DIRTY)
|
||||||
|
echo "git=$commit-changes"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
v*) # Only consider tags starting with v
|
||||||
|
echo "$tag_val"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "git-$commit"
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
tag_val=$(git describe --dirty=DIRTY)
|
||||||
|
case "$tag_val" in
|
||||||
|
*DIRTY)
|
||||||
|
echo "git-$commit-changes"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "git-$commit"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
Reference in New Issue
Block a user