dockerfile and env var
Add Dockerfile, requirement.txt, and new BUMPER_CERTS env var.
This commit is contained in:
parent
3f44b33a0a
commit
d5db3b696c
3 changed files with 86 additions and 31 deletions
19
Dockerfile
Normal file
19
Dockerfile
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
FROM python:3.7-alpine as base
|
||||||
|
|
||||||
|
FROM base as builder
|
||||||
|
|
||||||
|
RUN mkdir /install
|
||||||
|
WORKDIR /install
|
||||||
|
|
||||||
|
COPY requirements.txt /requirements.txt
|
||||||
|
|
||||||
|
RUN pip install --install-option="--prefix=/install" -r /requirements.txt
|
||||||
|
|
||||||
|
FROM base
|
||||||
|
|
||||||
|
COPY --from=builder /install /usr/local
|
||||||
|
COPY . /bumper
|
||||||
|
|
||||||
|
WORKDIR /bumper
|
||||||
|
|
||||||
|
ENTRYPOINT ["python3", "-m", "bumper"]
|
||||||
|
|
@ -15,7 +15,6 @@ import socket
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def strtobool(strbool):
|
def strtobool(strbool):
|
||||||
if str(strbool).lower() in ["true", "1", "t", "y", "on", "yes"]:
|
if str(strbool).lower() in ["true", "1", "t", "y", "on", "yes"]:
|
||||||
return True
|
return True
|
||||||
|
|
@ -24,23 +23,29 @@ def strtobool(strbool):
|
||||||
|
|
||||||
|
|
||||||
# os.environ['PYTHONASYNCIODEBUG'] = '1' # Uncomment to enable ASYNCIODEBUG
|
# os.environ['PYTHONASYNCIODEBUG'] = '1' # Uncomment to enable ASYNCIODEBUG
|
||||||
|
|
||||||
bumper_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
|
bumper_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
|
||||||
# Set defaults from environment variables first
|
|
||||||
# Certs
|
|
||||||
ca_cert = os.environ.get("BUMPER_CA") or os.path.join(bumper_dir, "certs", "ca.crt")
|
|
||||||
server_cert = os.environ.get("BUMPER_CERT") or os.path.join(
|
|
||||||
bumper_dir, "certs", "bumper.crt"
|
|
||||||
)
|
|
||||||
server_key = os.environ.get("BUMPER_KEY") or os.path.join(
|
|
||||||
bumper_dir, "certs", "bumper.key"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
# Set defaults from environment variables first
|
||||||
|
print(bumper_dir)
|
||||||
# Folders
|
# Folders
|
||||||
logs_dir = os.environ.get("BUMPER_LOGS") or os.path.join(bumper_dir, "logs")
|
logs_dir = os.environ.get("BUMPER_LOGS") or os.path.join(bumper_dir, "logs")
|
||||||
os.makedirs(logs_dir, exist_ok=True) # Ensure logs directory exists or create
|
os.makedirs(logs_dir, exist_ok=True) # Ensure logs directory exists or create
|
||||||
|
print(logs_dir)
|
||||||
data_dir = os.environ.get("BUMPER_DATA") or os.path.join(bumper_dir, "data")
|
data_dir = os.environ.get("BUMPER_DATA") or os.path.join(bumper_dir, "data")
|
||||||
os.makedirs(data_dir, exist_ok=True) # Ensure data directory exists or create
|
os.makedirs(data_dir, exist_ok=True) # Ensure data directory exists or create
|
||||||
|
print(data_dir)
|
||||||
|
certs_dir = os.environ.get("BUMPER_CERTS") or os.path.join(bumper_dir, "certs")
|
||||||
|
os.makedirs(certs_dir, exist_ok=True) # Ensure data directory exists or create
|
||||||
|
print(certs_dir)
|
||||||
|
|
||||||
|
|
||||||
|
# Certs
|
||||||
|
ca_cert = os.environ.get("BUMPER_CA") or os.path.join(certs_dir, "ca.crt")
|
||||||
|
print(ca_cert)
|
||||||
|
server_cert = os.environ.get("BUMPER_CERT") or os.path.join(certs_dir, "bumper.crt")
|
||||||
|
print(server_cert)
|
||||||
|
server_key = os.environ.get("BUMPER_KEY") or os.path.join(certs_dir, "bumper.key")
|
||||||
|
print(server_key)
|
||||||
|
|
||||||
# Listeners
|
# Listeners
|
||||||
bumper_listen = os.environ.get("BUMPER_LISTEN") or socket.gethostbyname(
|
bumper_listen = os.environ.get("BUMPER_LISTEN") or socket.gethostbyname(
|
||||||
|
|
@ -115,16 +120,17 @@ xmppserverlog.addHandler(xmpp_rotate)
|
||||||
logging.getLogger("asyncio").setLevel(logging.CRITICAL + 1) # Ignore this logger
|
logging.getLogger("asyncio").setLevel(logging.CRITICAL + 1) # Ignore this logger
|
||||||
|
|
||||||
mqtt_listen_address = bumper_listen
|
mqtt_listen_address = bumper_listen
|
||||||
mqtt_listen_port = 8883
|
mqtt_listen_port = 8883
|
||||||
conf1_listen_address = bumper_listen
|
conf1_listen_address = bumper_listen
|
||||||
conf1_listen_port = 443
|
conf1_listen_port = 443
|
||||||
conf2_listen_address = bumper_listen
|
conf2_listen_address = bumper_listen
|
||||||
conf2_listen_port = 8007
|
conf2_listen_port = 8007
|
||||||
xmpp_listen_address = bumper_listen
|
xmpp_listen_address = bumper_listen
|
||||||
xmpp_listen_port = 5223
|
xmpp_listen_port = 5223
|
||||||
|
|
||||||
|
|
||||||
async def start():
|
async def start():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
except:
|
except:
|
||||||
|
|
@ -142,10 +148,10 @@ async def start():
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
format="[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s",
|
format="[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s",
|
||||||
)
|
)
|
||||||
|
|
||||||
if not bumper_listen:
|
if not bumper_listen:
|
||||||
logging.log(logging.FATAL, "No listen address configured")
|
logging.log(logging.FATAL, "No listen address configured")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not (
|
if not (
|
||||||
os.path.exists(ca_cert)
|
os.path.exists(ca_cert)
|
||||||
|
|
@ -154,7 +160,7 @@ async def start():
|
||||||
):
|
):
|
||||||
logging.log(logging.FATAL, "Certificate(s) don't exist at paths specified")
|
logging.log(logging.FATAL, "Certificate(s) don't exist at paths specified")
|
||||||
return
|
return
|
||||||
|
|
||||||
bumperlog.info("Starting Bumper")
|
bumperlog.info("Starting Bumper")
|
||||||
global mqtt_server
|
global mqtt_server
|
||||||
mqtt_server = MQTTServer((mqtt_listen_address, mqtt_listen_port))
|
mqtt_server = MQTTServer((mqtt_listen_address, mqtt_listen_port))
|
||||||
|
|
@ -166,7 +172,9 @@ async def start():
|
||||||
)
|
)
|
||||||
global conf_server_2
|
global conf_server_2
|
||||||
conf_server_2 = ConfServer(
|
conf_server_2 = ConfServer(
|
||||||
(conf2_listen_address, conf2_listen_port), usessl=False, helperbot=mqtt_helperbot
|
(conf2_listen_address, conf2_listen_port),
|
||||||
|
usessl=False,
|
||||||
|
helperbot=mqtt_helperbot,
|
||||||
)
|
)
|
||||||
global xmpp_server
|
global xmpp_server
|
||||||
xmpp_server = XMPPServer((xmpp_listen_address, xmpp_listen_port))
|
xmpp_server = XMPPServer((xmpp_listen_address, xmpp_listen_port))
|
||||||
|
|
@ -438,6 +446,7 @@ class VacBotDevice(object):
|
||||||
"xmpp_connection": self.xmpp_connection,
|
"xmpp_connection": self.xmpp_connection,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class GlobalVacBotDevice(VacBotDevice): # EcoVacs Home
|
class GlobalVacBotDevice(VacBotDevice): # EcoVacs Home
|
||||||
UILogicId = ""
|
UILogicId = ""
|
||||||
ota = True
|
ota = True
|
||||||
|
|
@ -944,11 +953,13 @@ API_ERRORS = {
|
||||||
ERR_WRONG_PWD_FROMATE: "1009",
|
ERR_WRONG_PWD_FROMATE: "1009",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def create_certs():
|
def create_certs():
|
||||||
import platform
|
import platform
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
path = os.path.dirname(sys.modules[__name__].__file__)
|
path = os.path.dirname(sys.modules[__name__].__file__)
|
||||||
path = os.path.join(path, "..")
|
path = os.path.join(path, "..")
|
||||||
sys.path.insert(0, path)
|
sys.path.insert(0, path)
|
||||||
|
|
@ -958,9 +969,7 @@ def create_certs():
|
||||||
os.chdir("certs")
|
os.chdir("certs")
|
||||||
if str(platform.system()).lower() == "windows":
|
if str(platform.system()).lower() == "windows":
|
||||||
# run for win
|
# run for win
|
||||||
subprocess.run(
|
subprocess.run([os.path.join("..", "create_certs", "create_certs_windows.exe")])
|
||||||
[os.path.join("..", "create_certs", "create_certs_windows.exe")]
|
|
||||||
)
|
|
||||||
elif str(platform.system()).lower() == "darwin":
|
elif str(platform.system()).lower() == "darwin":
|
||||||
# run on mac
|
# run on mac
|
||||||
subprocess.run([os.path.join("..", "create_certs", "create_certs_osx")])
|
subprocess.run([os.path.join("..", "create_certs", "create_certs_osx")])
|
||||||
|
|
@ -970,15 +979,16 @@ def create_certs():
|
||||||
subprocess.run([os.path.join("..", "create_certs", "create_certs_rpi")])
|
subprocess.run([os.path.join("..", "create_certs", "create_certs_rpi")])
|
||||||
else:
|
else:
|
||||||
# run for linux
|
# run for linux
|
||||||
subprocess.run(
|
subprocess.run([os.path.join("..", "create_certs", "create_certs_linux")])
|
||||||
[os.path.join("..", "create_certs", "create_certs_linux")]
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logging.log(logging.FATAL, "Can't determine platform. Create certs manually and try again.")
|
logging.log(
|
||||||
|
logging.FATAL,
|
||||||
|
"Can't determine platform. Create certs manually and try again.",
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
print("Certificates created")
|
print("Certificates created")
|
||||||
os.chdir(odir)
|
os.chdir(odir)
|
||||||
print(os.path.realpath(os.curdir))
|
print(os.path.realpath(os.curdir))
|
||||||
if "__main__.py" in sys.argv[0]:
|
if "__main__.py" in sys.argv[0]:
|
||||||
|
|
@ -989,22 +999,29 @@ def create_certs():
|
||||||
else:
|
else:
|
||||||
os.execv(sys.executable, ["python"] + sys.argv) # Start again
|
os.execv(sys.executable, ["python"] + sys.argv) # Start again
|
||||||
|
|
||||||
def firstrun_input():
|
|
||||||
|
def firstrun_input():
|
||||||
return input(
|
return input(
|
||||||
"No certificates found, would you like to create them automatically? (y/n): "
|
"No certificates found, would you like to create them automatically? (y/n): "
|
||||||
).lower()
|
).lower()
|
||||||
|
|
||||||
|
|
||||||
def first_run():
|
def first_run():
|
||||||
yes = {"yes", "y", "ye", ""}
|
yes = {"yes", "y", "ye", ""}
|
||||||
print("")
|
print("")
|
||||||
if firstrun_input() in yes:
|
if firstrun_input() in yes:
|
||||||
create_certs()
|
create_certs()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logging.log(logging.FATAL, "Can't continue without certificates, please create some then try again.")
|
logging.log(
|
||||||
|
logging.FATAL,
|
||||||
|
"Can't continue without certificates, please create some then try again.",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def main(argv=None):
|
def main(argv=None):
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
global bumper_debug
|
global bumper_debug
|
||||||
global bumper_listen
|
global bumper_listen
|
||||||
global bumper_announce_ip
|
global bumper_announce_ip
|
||||||
|
|
@ -1024,7 +1041,10 @@ def main(argv=None):
|
||||||
"--listen", type=str, default=None, help="start serving on address"
|
"--listen", type=str, default=None, help="start serving on address"
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--announce", type=str, default=None, help="announce address to bots on checkin"
|
"--announce",
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help="announce address to bots on checkin",
|
||||||
)
|
)
|
||||||
parser.add_argument("--debug", action="store_true", help="enable debug logs")
|
parser.add_argument("--debug", action="store_true", help="enable debug logs")
|
||||||
args = parser.parse_args(args=argv)
|
args = parser.parse_args(args=argv)
|
||||||
|
|
|
||||||
16
requirements.txt
Normal file
16
requirements.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
-i https://pypi.python.org/simple
|
||||||
|
aiohttp==4.0.0a0
|
||||||
|
async-timeout==3.0.1
|
||||||
|
attrs==19.1.0
|
||||||
|
chardet==3.0.4
|
||||||
|
docopt==0.6.2
|
||||||
|
hbmqtt==0.9.5
|
||||||
|
idna==2.8
|
||||||
|
multidict==4.5.2
|
||||||
|
passlib==1.7.1
|
||||||
|
pyyaml==5.1.1
|
||||||
|
six==1.12.0
|
||||||
|
tinydb==3.13.0
|
||||||
|
transitions==0.6.9
|
||||||
|
websockets==7.0
|
||||||
|
yarl==1.3.0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue