fix(chalice): check SMTP host:port (#1344)
fix(chalice): validate SMTP configuration refactor(chalice): include Pipfile for similar dev-env
This commit is contained in:
parent
837d5ebeb3
commit
de3976a27d
9 changed files with 126 additions and 5 deletions
3
api/.gitignore
vendored
3
api/.gitignore
vendored
|
|
@ -83,7 +83,6 @@ wheels/
|
||||||
.installed.cfg
|
.installed.cfg
|
||||||
*.egg
|
*.egg
|
||||||
MANIFEST
|
MANIFEST
|
||||||
Pipfile
|
|
||||||
Pipfile.lock
|
Pipfile.lock
|
||||||
|
|
||||||
# PyInstaller
|
# PyInstaller
|
||||||
|
|
@ -144,7 +143,7 @@ celerybeat-schedule
|
||||||
|
|
||||||
# Environments
|
# Environments
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv/*
|
||||||
env/
|
env/
|
||||||
venv/
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
|
|
|
||||||
1
api/.gitkeep
Normal file
1
api/.gitkeep
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.venv
|
||||||
24
api/Pipfile
Normal file
24
api/Pipfile
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
requests = "==2.31.0"
|
||||||
|
urllib3 = "==1.26.16"
|
||||||
|
boto3 = "==1.26.148"
|
||||||
|
pyjwt = "==2.7.0"
|
||||||
|
psycopg2-binary = "==2.9.6"
|
||||||
|
elasticsearch = "==8.8.0"
|
||||||
|
jira = "==3.5.1"
|
||||||
|
fastapi = "==0.96.0"
|
||||||
|
uvicorn = {version = "==0.22.0", extras = ["standard"]}
|
||||||
|
python-decouple = "==3.8"
|
||||||
|
pydantic = {version = "==1.10.8", extras = ["email"]}
|
||||||
|
apscheduler = "==3.10.1"
|
||||||
|
redis = "==4.5.5"
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.11"
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
from . import helper
|
||||||
|
import logging
|
||||||
|
from decouple import config
|
||||||
|
|
||||||
|
logging.basicConfig(level=config("LOGLEVEL", default=logging.INFO))
|
||||||
|
|
||||||
|
if helper.has_smtp():
|
||||||
|
logging.info("valid SMTP configuration found")
|
||||||
|
else:
|
||||||
|
logging.info("no SMTP configuration found or SMTP validation failed")
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import logging
|
||||||
import math
|
import math
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
|
|
@ -8,6 +9,7 @@ from urllib.parse import urlparse
|
||||||
from decouple import config
|
from decouple import config
|
||||||
|
|
||||||
import schemas
|
import schemas
|
||||||
|
from chalicelib.utils import smtp
|
||||||
from chalicelib.utils.TimeUTC import TimeUTC
|
from chalicelib.utils.TimeUTC import TimeUTC
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -264,8 +266,25 @@ def __decimal_limit(value, limit):
|
||||||
return value / factor
|
return value / factor
|
||||||
|
|
||||||
|
|
||||||
|
VALID_SMTP = None
|
||||||
|
SMTP_ERROR = None
|
||||||
|
|
||||||
|
|
||||||
def has_smtp():
|
def has_smtp():
|
||||||
return config("EMAIL_HOST") is not None and len(config("EMAIL_HOST")) > 0
|
global VALID_SMTP, SMTP_ERROR
|
||||||
|
if SMTP_ERROR is not None:
|
||||||
|
logging.error("!!! SMTP error found, disabling SMTP configuration:")
|
||||||
|
logging.error(SMTP_ERROR)
|
||||||
|
|
||||||
|
if VALID_SMTP is not None:
|
||||||
|
return VALID_SMTP
|
||||||
|
|
||||||
|
if config("EMAIL_HOST") is not None and len(config("EMAIL_HOST")) > 0:
|
||||||
|
VALID_SMTP, SMTP_ERROR = smtp.check_connexion()
|
||||||
|
return VALID_SMTP
|
||||||
|
else:
|
||||||
|
logging.info("no SMTP configuration found")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def old_search_payload_to_flat(values):
|
def old_search_payload_to_flat(values):
|
||||||
|
|
|
||||||
|
|
@ -45,3 +45,43 @@ class SMTPClient:
|
||||||
if self.server is None:
|
if self.server is None:
|
||||||
return
|
return
|
||||||
self.server.quit()
|
self.server.quit()
|
||||||
|
|
||||||
|
def test_configuration(self):
|
||||||
|
# check server connexion
|
||||||
|
try:
|
||||||
|
status = self.server.noop()[0]
|
||||||
|
if not (status == 250):
|
||||||
|
raise Exception(f"SMTP connexion error, status:{status}")
|
||||||
|
except Exception as e: # smtplib.SMTPServerDisconnected
|
||||||
|
logging.error(
|
||||||
|
f'!! SMTP connexion error to {config("EMAIL_HOST")}:{config("EMAIL_PORT", cast=int)}')
|
||||||
|
logging.error(e)
|
||||||
|
return False, e
|
||||||
|
|
||||||
|
# check authentication
|
||||||
|
try:
|
||||||
|
self.__enter__()
|
||||||
|
self.__exit__()
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'!! SMTP authentication error to {config("EMAIL_HOST")}:{config("EMAIL_PORT", cast=int)}')
|
||||||
|
logging.error(e)
|
||||||
|
return False, e
|
||||||
|
|
||||||
|
return True, None
|
||||||
|
|
||||||
|
|
||||||
|
def check_connexion():
|
||||||
|
# check SMTP host&port
|
||||||
|
import socket
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
sock.settimeout(config("EMAIL_CHECK_TIMEOUT", cast=int, default=5))
|
||||||
|
result = sock.connect_ex((config("EMAIL_HOST"), config("EMAIL_PORT", cast=int)))
|
||||||
|
sock.close()
|
||||||
|
if not (result == 0):
|
||||||
|
error = f"""!! SMTP {config("EMAIL_HOST")}:{config("EMAIL_PORT", cast=int)} is unreachable
|
||||||
|
f'please make sure the host&port are correct, and the SMTP protocol is authorized on your server."""
|
||||||
|
logging.error(error)
|
||||||
|
sock.close()
|
||||||
|
return False, error
|
||||||
|
|
||||||
|
return SMTPClient().test_configuration()
|
||||||
|
|
|
||||||
3
ee/api/.gitignore
vendored
3
ee/api/.gitignore
vendored
|
|
@ -142,7 +142,7 @@ celerybeat-schedule
|
||||||
|
|
||||||
# Environments
|
# Environments
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv/*
|
||||||
env/
|
env/
|
||||||
venv/
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
|
|
@ -175,7 +175,6 @@ SUBNETS.json
|
||||||
chalicelib/.config
|
chalicelib/.config
|
||||||
chalicelib/saas
|
chalicelib/saas
|
||||||
README/*
|
README/*
|
||||||
Pipfile
|
|
||||||
Pipfile.lock
|
Pipfile.lock
|
||||||
|
|
||||||
.local/*
|
.local/*
|
||||||
|
|
|
||||||
1
ee/api/.gitkeep
Normal file
1
ee/api/.gitkeep
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.venv
|
||||||
28
ee/api/Pipfile
Normal file
28
ee/api/Pipfile
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
requests = "==2.31.0"
|
||||||
|
urllib3 = "==1.26.16"
|
||||||
|
boto3 = "==1.26.148"
|
||||||
|
pyjwt = "==2.7.0"
|
||||||
|
psycopg2-binary = "==2.9.6"
|
||||||
|
elasticsearch = "==8.8.0"
|
||||||
|
jira = "==3.5.1"
|
||||||
|
fastapi = "==0.96.0"
|
||||||
|
python-decouple = "==3.8"
|
||||||
|
apscheduler = "==3.10.1"
|
||||||
|
python3-saml = "==1.15.0"
|
||||||
|
python-multipart = "==0.0.6"
|
||||||
|
redis = "==4.5.5"
|
||||||
|
azure-storage-blob = "==12.16.0"
|
||||||
|
uvicorn = {version = "==0.22.0", extras = ["standard"]}
|
||||||
|
pydantic = {version = "==1.10.8", extras = ["email"]}
|
||||||
|
clickhouse-driver = {version = "==0.2.5", extras = ["lz4"]}
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.11"
|
||||||
Loading…
Add table
Reference in a new issue