2017-09-27 16:04:58 -07:00
import argparse
2021-05-06 16:47:08 +03:00
import os
2021-01-19 12:46:00 -05:00
import signal
2013-03-05 08:14:43 -05:00
import sys
2023-02-02 11:45:49 -01:00
import warnings
2023-04-26 22:20:28 +00:00
from typing import Any , List , Optional
2023-02-02 11:45:49 -01:00
2013-12-27 15:45:53 -03:00
from werkzeug . serving import run_simple
2013-03-05 08:14:43 -05:00
2022-03-03 19:54:10 -01:00
from moto . moto_server . werkzeug_app import (
DomainDispatcherApplication ,
create_backend_app ,
)
from moto . moto_server . threaded_moto_server import ( # noqa # pylint: disable=unused-import
ThreadedMotoServer ,
)
2013-03-05 08:14:43 -05:00
2013-07-26 14:42:32 -04:00
2023-04-26 22:20:28 +00:00
def signal_handler ( signum : Any , frame : Any ) - > None : # pylint: disable=unused-argument
2021-01-19 12:46:00 -05:00
sys . exit ( 0 )
2023-04-26 22:20:28 +00:00
def main ( argv : Optional [ List [ str ] ] = None ) - > None :
2022-01-14 18:51:49 -01:00
argv = argv or sys . argv [ 1 : ]
2013-07-26 14:42:32 -04:00
parser = argparse . ArgumentParser ( )
2013-12-28 20:15:37 -05:00
# Keep this for backwards compat
2013-12-30 13:29:57 -05:00
parser . add_argument (
" service " ,
type = str ,
2013-12-30 13:32:07 -05:00
nargs = " ? " , # http://stackoverflow.com/a/4480202/731592
2021-05-06 16:47:08 +03:00
default = os . environ . get ( " MOTO_SERVICE " ) ,
2013-12-30 13:29:57 -05:00
)
2013-07-26 14:42:32 -04:00
parser . add_argument (
" -H " , " --host " , type = str , help = " Which host to bind " , default = " 127.0.0.1 "
2016-09-01 12:14:38 +01:00
)
2013-07-26 14:42:32 -04:00
parser . add_argument (
2021-11-29 19:35:18 -01:00
" -p " ,
" --port " ,
type = int ,
help = " Port number to use for connection " ,
default = int ( os . environ . get ( " MOTO_PORT " , 5000 ) ) ,
2013-07-26 14:42:32 -04:00
)
2017-02-09 03:22:14 +01:00
parser . add_argument (
" -r " ,
" --reload " ,
action = " store_true " ,
help = " Reload server on a file change " ,
default = False ,
)
2017-06-27 17:18:21 +10:00
parser . add_argument (
" -s " ,
" --ssl " ,
action = " store_true " ,
2018-05-03 14:09:56 -05:00
help = " Enable SSL encrypted connection with auto-generated certificate (use https://... URL) " ,
2017-06-27 17:18:21 +10:00
default = False ,
)
2018-05-03 14:09:56 -05:00
parser . add_argument (
" -c " , " --ssl-cert " , type = str , help = " Path to SSL certificate " , default = None
)
parser . add_argument (
" -k " , " --ssl-key " , type = str , help = " Path to SSL private key " , default = None
)
2013-07-26 14:42:32 -04:00
args = parser . parse_args ( argv )
2021-11-29 19:35:18 -01:00
if " MOTO_PORT " not in os . environ :
os . environ [ " MOTO_PORT " ] = f " { args . port } "
2021-11-03 20:00:42 -01:00
2021-07-30 07:20:45 +02:00
try :
2022-01-27 11:04:03 -01:00
signal . signal ( signal . SIGINT , signal_handler )
signal . signal ( signal . SIGTERM , signal_handler )
2021-07-30 07:20:45 +02:00
except Exception :
pass # ignore "ValueError: signal only works in main thread"
2021-01-19 12:46:00 -05:00
2023-02-02 11:45:49 -01:00
if args . service :
warnings . warn (
f " The service-argument ( { args . service } ) is considered deprecated, and will be deprecated in a future release. Please let us know if you have any questions: https://github.com/getmoto/moto/issues "
)
2013-12-27 15:45:53 -03:00
# Wrap the main application
2017-02-23 21:37:43 -05:00
main_app = DomainDispatcherApplication ( create_backend_app , service = args . service )
2023-04-26 22:20:28 +00:00
main_app . debug = True # type: ignore
2013-03-05 08:14:43 -05:00
2023-04-26 22:20:28 +00:00
ssl_context : Any = None
2018-05-03 14:09:56 -05:00
if args . ssl_key and args . ssl_cert :
ssl_context = ( args . ssl_cert , args . ssl_key )
elif args . ssl :
ssl_context = " adhoc "
2019-10-31 08:44:26 -07:00
2017-02-23 21:37:43 -05:00
run_simple (
args . host ,
args . port ,
main_app ,
2017-06-27 17:18:21 +10:00
threaded = True ,
use_reloader = args . reload ,
2018-05-03 14:09:56 -05:00
ssl_context = ssl_context ,
)
2017-02-09 03:22:14 +01:00
2013-03-05 08:14:43 -05:00
if __name__ == " __main__ " :
main ( )