├── scheduler-lambda ├── app │ ├── certifi │ │ ├── py.typed │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── core.cpython-38.pyc │ │ │ ├── __init__.cpython-38.pyc │ │ │ └── __main__.cpython-38.pyc │ │ ├── __main__.py │ │ └── core.py │ ├── idna │ │ ├── py.typed │ │ ├── package_data.py │ │ ├── __pycache__ │ │ │ ├── core.cpython-38.pyc │ │ │ ├── codec.cpython-38.pyc │ │ │ ├── compat.cpython-38.pyc │ │ │ ├── __init__.cpython-38.pyc │ │ │ ├── idnadata.cpython-38.pyc │ │ │ ├── intranges.cpython-38.pyc │ │ │ ├── uts46data.cpython-38.pyc │ │ │ └── package_data.cpython-38.pyc │ │ ├── compat.py │ │ ├── __init__.py │ │ ├── intranges.py │ │ └── codec.py │ ├── charset_normalizer │ │ ├── py.typed │ │ ├── cli │ │ │ ├── __init__.py │ │ │ └── __pycache__ │ │ │ │ ├── __init__.cpython-38.pyc │ │ │ │ └── normalizer.cpython-38.pyc │ │ ├── version.py │ │ ├── __pycache__ │ │ │ ├── api.cpython-38.pyc │ │ │ ├── cd.cpython-38.pyc │ │ │ ├── md.cpython-38.pyc │ │ │ ├── utils.cpython-38.pyc │ │ │ ├── __init__.cpython-38.pyc │ │ │ ├── constant.cpython-38.pyc │ │ │ ├── legacy.cpython-38.pyc │ │ │ ├── models.cpython-38.pyc │ │ │ └── version.cpython-38.pyc │ │ ├── assets │ │ │ └── __pycache__ │ │ │ │ └── __init__.cpython-38.pyc │ │ ├── __init__.py │ │ └── legacy.py │ ├── urllib3 │ │ ├── contrib │ │ │ ├── __init__.py │ │ │ ├── _securetransport │ │ │ │ ├── __init__.py │ │ │ │ └── __pycache__ │ │ │ │ │ ├── __init__.cpython-38.pyc │ │ │ │ │ ├── bindings.cpython-38.pyc │ │ │ │ │ └── low_level.cpython-38.pyc │ │ │ ├── __pycache__ │ │ │ │ ├── socks.cpython-38.pyc │ │ │ │ ├── __init__.cpython-38.pyc │ │ │ │ ├── ntlmpool.cpython-38.pyc │ │ │ │ ├── appengine.cpython-38.pyc │ │ │ │ ├── pyopenssl.cpython-38.pyc │ │ │ │ ├── securetransport.cpython-38.pyc │ │ │ │ └── _appengine_environ.cpython-38.pyc │ │ │ ├── _appengine_environ.py │ │ │ └── ntlmpool.py │ │ ├── packages │ │ │ ├── __init__.py │ │ │ ├── backports │ │ │ │ ├── __init__.py │ │ │ │ ├── __pycache__ │ │ │ │ │ ├── __init__.cpython-38.pyc │ │ │ │ │ └── makefile.cpython-38.pyc │ │ │ │ └── makefile.py │ │ │ └── __pycache__ │ │ │ │ ├── six.cpython-38.pyc │ │ │ │ └── __init__.cpython-38.pyc │ │ ├── _version.py │ │ ├── __pycache__ │ │ │ ├── fields.cpython-38.pyc │ │ │ ├── __init__.cpython-38.pyc │ │ │ ├── _version.cpython-38.pyc │ │ │ ├── filepost.cpython-38.pyc │ │ │ ├── request.cpython-38.pyc │ │ │ ├── response.cpython-38.pyc │ │ │ ├── connection.cpython-38.pyc │ │ │ ├── exceptions.cpython-38.pyc │ │ │ ├── poolmanager.cpython-38.pyc │ │ │ ├── _collections.cpython-38.pyc │ │ │ └── connectionpool.cpython-38.pyc │ │ ├── util │ │ │ ├── __pycache__ │ │ │ │ ├── ssl_.cpython-38.pyc │ │ │ │ ├── url.cpython-38.pyc │ │ │ │ ├── wait.cpython-38.pyc │ │ │ │ ├── proxy.cpython-38.pyc │ │ │ │ ├── queue.cpython-38.pyc │ │ │ │ ├── retry.cpython-38.pyc │ │ │ │ ├── __init__.cpython-38.pyc │ │ │ │ ├── request.cpython-38.pyc │ │ │ │ ├── response.cpython-38.pyc │ │ │ │ ├── timeout.cpython-38.pyc │ │ │ │ ├── connection.cpython-38.pyc │ │ │ │ ├── ssltransport.cpython-38.pyc │ │ │ │ └── ssl_match_hostname.cpython-38.pyc │ │ │ ├── queue.py │ │ │ ├── __init__.py │ │ │ ├── proxy.py │ │ │ ├── response.py │ │ │ ├── request.py │ │ │ └── connection.py │ │ ├── filepost.py │ │ └── __init__.py │ ├── idna-3.3.dist-info │ │ ├── INSTALLER │ │ ├── top_level.txt │ │ ├── WHEEL │ │ ├── RECORD │ │ └── LICENSE.md │ ├── urllib3-1.26.9.dist-info │ │ ├── INSTALLER │ │ ├── top_level.txt │ │ ├── WHEEL │ │ └── LICENSE.txt │ ├── certifi-2022.5.18.1.dist-info │ │ ├── INSTALLER │ │ ├── top_level.txt │ │ ├── WHEEL │ │ ├── RECORD │ │ ├── LICENSE │ │ └── METADATA │ ├── requests-2.27.1.dist-info │ │ ├── INSTALLER │ │ ├── top_level.txt │ │ ├── WHEEL │ │ ├── RECORD │ │ └── METADATA │ ├── charset_normalizer-2.0.12.dist-info │ │ ├── INSTALLER │ │ ├── top_level.txt │ │ ├── entry_points.txt │ │ ├── WHEEL │ │ ├── LICENSE │ │ └── RECORD │ ├── requests │ │ ├── __pycache__ │ │ │ ├── api.cpython-38.pyc │ │ │ ├── auth.cpython-38.pyc │ │ │ ├── certs.cpython-38.pyc │ │ │ ├── help.cpython-38.pyc │ │ │ ├── hooks.cpython-38.pyc │ │ │ ├── utils.cpython-38.pyc │ │ │ ├── __init__.cpython-38.pyc │ │ │ ├── adapters.cpython-38.pyc │ │ │ ├── compat.cpython-38.pyc │ │ │ ├── cookies.cpython-38.pyc │ │ │ ├── models.cpython-38.pyc │ │ │ ├── packages.cpython-38.pyc │ │ │ ├── sessions.cpython-38.pyc │ │ │ ├── exceptions.cpython-38.pyc │ │ │ ├── structures.cpython-38.pyc │ │ │ ├── __version__.cpython-38.pyc │ │ │ ├── status_codes.cpython-38.pyc │ │ │ └── _internal_utils.cpython-38.pyc │ │ ├── __version__.py │ │ ├── certs.py │ │ ├── hooks.py │ │ ├── packages.py │ │ ├── _internal_utils.py │ │ ├── compat.py │ │ ├── structures.py │ │ ├── exceptions.py │ │ ├── help.py │ │ └── status_codes.py │ └── bin │ │ └── normalizer ├── kms.tf └── scheduler-lambda.tf ├── app ├── run.py ├── api │ ├── __init__.py │ ├── actions.py │ ├── notifications.py │ ├── auth.py │ └── models.py ├── requirements.txt ├── zappa_settings.json └── instance-scheduler-staging-policy.json ├── html ├── favicon.ico ├── img │ ├── logo.jpg │ ├── ahmed.jpg │ ├── askao.jpg │ ├── bassem.jpg │ ├── architecture.jpg │ ├── bg-masthead.jpg │ ├── bg-showcase-1.jpg │ ├── bg-showcase-2.jpg │ ├── bg-showcase-3.jpg │ └── instance-view.png ├── vendor │ ├── fontawesome-free │ │ ├── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-solid-900.woff2 │ │ │ └── fa-regular-400.woff2 │ │ └── css │ │ │ ├── solid.min.css │ │ │ ├── brands.min.css │ │ │ ├── regular.min.css │ │ │ ├── brands.css │ │ │ ├── solid.css │ │ │ └── regular.css │ ├── simple-line-icons │ │ └── fonts │ │ │ ├── Simple-Line-Icons.eot │ │ │ ├── Simple-Line-Icons.ttf │ │ │ ├── Simple-Line-Icons.woff │ │ │ └── Simple-Line-Icons.woff2 │ └── bootstrap │ │ └── css │ │ └── bootstrap-reboot.min.css ├── css │ ├── vendor │ │ ├── fontawesome-free │ │ │ ├── webfonts │ │ │ │ ├── fa-brands-400.eot │ │ │ │ ├── fa-brands-400.ttf │ │ │ │ ├── fa-brands-400.woff │ │ │ │ ├── fa-regular-400.eot │ │ │ │ ├── fa-regular-400.ttf │ │ │ │ ├── fa-solid-900.eot │ │ │ │ ├── fa-solid-900.ttf │ │ │ │ ├── fa-solid-900.woff │ │ │ │ ├── fa-solid-900.woff2 │ │ │ │ ├── fa-brands-400.woff2 │ │ │ │ ├── fa-regular-400.woff │ │ │ │ └── fa-regular-400.woff2 │ │ │ └── css │ │ │ │ ├── brands.min.css │ │ │ │ ├── solid.min.css │ │ │ │ ├── regular.min.css │ │ │ │ ├── brands.css │ │ │ │ ├── solid.css │ │ │ │ └── regular.css │ │ ├── simple-line-icons │ │ │ └── fonts │ │ │ │ ├── Simple-Line-Icons.eot │ │ │ │ ├── Simple-Line-Icons.ttf │ │ │ │ ├── Simple-Line-Icons.woff │ │ │ │ └── Simple-Line-Icons.woff2 │ │ └── bootstrap │ │ │ └── css │ │ │ └── bootstrap-reboot.min.css │ ├── my-login.css │ ├── landing-page.min.css │ ├── landing-page.css │ └── table.css ├── js │ ├── config.js │ └── my-login.js ├── architecture.html ├── signin.html ├── verify.html ├── reset.html ├── signup.html └── pass-verify.html ├── README.md └── cloudfront-s3-sync.sh /scheduler-lambda/app/certifi/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/cli/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna-3.3.dist-info/INSTALLER: -------------------------------------------------------------------------------- 1 | pip 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna-3.3.dist-info/top_level.txt: -------------------------------------------------------------------------------- 1 | idna 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3-1.26.9.dist-info/INSTALLER: -------------------------------------------------------------------------------- 1 | pip 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/backports/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/INSTALLER: -------------------------------------------------------------------------------- 1 | pip 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests-2.27.1.dist-info/INSTALLER: -------------------------------------------------------------------------------- 1 | pip 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/_securetransport/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/package_data.py: -------------------------------------------------------------------------------- 1 | __version__ = '3.3' 2 | 3 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests-2.27.1.dist-info/top_level.txt: -------------------------------------------------------------------------------- 1 | requests 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3-1.26.9.dist-info/top_level.txt: -------------------------------------------------------------------------------- 1 | urllib3 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/top_level.txt: -------------------------------------------------------------------------------- 1 | certifi 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer-2.0.12.dist-info/INSTALLER: -------------------------------------------------------------------------------- 1 | pip 2 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer-2.0.12.dist-info/top_level.txt: -------------------------------------------------------------------------------- 1 | charset_normalizer 2 | -------------------------------------------------------------------------------- /app/run.py: -------------------------------------------------------------------------------- 1 | from api import app 2 | 3 | if __name__ == '__main__': 4 | app.run(debug=True) 5 | -------------------------------------------------------------------------------- /html/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/favicon.ico -------------------------------------------------------------------------------- /html/img/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/logo.jpg -------------------------------------------------------------------------------- /html/img/ahmed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/ahmed.jpg -------------------------------------------------------------------------------- /html/img/askao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/askao.jpg -------------------------------------------------------------------------------- /html/img/bassem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/bassem.jpg -------------------------------------------------------------------------------- /html/img/architecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/architecture.jpg -------------------------------------------------------------------------------- /html/img/bg-masthead.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/bg-masthead.jpg -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/_version.py: -------------------------------------------------------------------------------- 1 | # This file is protected via CODEOWNERS 2 | __version__ = "1.26.9" 3 | -------------------------------------------------------------------------------- /html/img/bg-showcase-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/bg-showcase-1.jpg -------------------------------------------------------------------------------- /html/img/bg-showcase-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/bg-showcase-2.jpg -------------------------------------------------------------------------------- /html/img/bg-showcase-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/bg-showcase-3.jpg -------------------------------------------------------------------------------- /html/img/instance-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/img/instance-view.png -------------------------------------------------------------------------------- /app/api/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_cors import CORS 3 | 4 | app = Flask(__name__) 5 | CORS(app) 6 | 7 | from api import routes -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi/__init__.py: -------------------------------------------------------------------------------- 1 | from .core import contents, where 2 | 3 | __all__ = ["contents", "where"] 4 | __version__ = "2022.05.18.1" 5 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/version.py: -------------------------------------------------------------------------------- 1 | """ 2 | Expose version 3 | """ 4 | 5 | __version__ = "2.0.12" 6 | VERSION = __version__.split(".") 7 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna-3.3.dist-info/WHEEL: -------------------------------------------------------------------------------- 1 | Wheel-Version: 1.0 2 | Generator: bdist_wheel (0.37.0) 3 | Root-Is-Purelib: true 4 | Tag: py3-none-any 5 | 6 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer-2.0.12.dist-info/entry_points.txt: -------------------------------------------------------------------------------- 1 | [console_scripts] 2 | normalizer = charset_normalizer.cli.normalizer:cli_detect 3 | 4 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/WHEEL: -------------------------------------------------------------------------------- 1 | Wheel-Version: 1.0 2 | Generator: bdist_wheel (0.37.0) 3 | Root-Is-Purelib: true 4 | Tag: py3-none-any 5 | 6 | -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /html/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /html/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer-2.0.12.dist-info/WHEEL: -------------------------------------------------------------------------------- 1 | Wheel-Version: 1.0 2 | Generator: bdist_wheel (0.37.1) 3 | Root-Is-Purelib: true 4 | Tag: py3-none-any 5 | 6 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/core.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/core.cpython-38.pyc -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi/__pycache__/core.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/certifi/__pycache__/core.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/codec.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/codec.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/compat.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/compat.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/api.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/api.cpython-38.pyc -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/fontawesome-free/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/idnadata.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/idnadata.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/intranges.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/intranges.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/uts46data.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/uts46data.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests-2.27.1.dist-info/WHEEL: -------------------------------------------------------------------------------- 1 | Wheel-Version: 1.0 2 | Generator: bdist_wheel (0.37.1) 3 | Root-Is-Purelib: true 4 | Tag: py2-none-any 5 | Tag: py3-none-any 6 | 7 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/auth.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/auth.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/certs.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/certs.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/help.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/help.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/hooks.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/hooks.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/utils.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/utils.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3-1.26.9.dist-info/WHEEL: -------------------------------------------------------------------------------- 1 | Wheel-Version: 1.0 2 | Generator: bdist_wheel (0.37.1) 3 | Root-Is-Purelib: true 4 | Tag: py2-none-any 5 | Tag: py3-none-any 6 | 7 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/fields.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/fields.cpython-38.pyc -------------------------------------------------------------------------------- /app/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask-JWT-Extended==4.4.0 2 | PyJWT==1.7.1 3 | Flask==2.1.0 4 | boto3==1.23.0 5 | cryptography==37.0.2 6 | Flask-Cors==3.0.10 7 | simplejson==3.17.0 8 | zappa==0.54.1 9 | -------------------------------------------------------------------------------- /html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/html/css/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/certifi/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi/__pycache__/__main__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/certifi/__pycache__/__main__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__pycache__/package_data.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/idna/__pycache__/package_data.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/adapters.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/adapters.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/compat.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/compat.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/cookies.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/cookies.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/packages.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/packages.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/sessions.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/sessions.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/_version.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/_version.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/filepost.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/filepost.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/request.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/request.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/response.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/response.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/ssl_.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/ssl_.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/url.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/url.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/wait.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/wait.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/exceptions.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/exceptions.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/structures.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/structures.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/connection.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/connection.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/exceptions.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/exceptions.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/poolmanager.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/poolmanager.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/proxy.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/proxy.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/queue.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/queue.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/retry.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/retry.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/api.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/api.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/cd.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/cd.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/md.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/md.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/__version__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/__version__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/status_codes.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/status_codes.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/_collections.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/_collections.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__pycache__/connectionpool.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/__pycache__/connectionpool.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/socks.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/socks.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/__pycache__/six.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/packages/__pycache__/six.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/request.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/request.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/response.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/response.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/timeout.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/timeout.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/utils.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/utils.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__pycache__/_internal_utils.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/requests/__pycache__/_internal_utils.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/connection.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/connection.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/constant.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/constant.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/legacy.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/legacy.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__pycache__/version.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/__pycache__/version.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/appengine.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/appengine.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/packages/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/ssltransport.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/ssltransport.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__pycache__/ssl_match_hostname.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/util/__pycache__/ssl_match_hostname.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maradwan/instance-scheduler/HEAD/scheduler-lambda/app/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc -------------------------------------------------------------------------------- /html/js/config.js: -------------------------------------------------------------------------------- 1 | window._config = { 2 | cognito: { 3 | userPoolId: 'eu-west-1_aphRYjOaB', 4 | userPoolClientId: '5jgkf9l7p7on2uq4g1v7fffa55', 5 | region: 'eu-west-1' 6 | }, 7 | api: { 8 | invokeUrl: 'https://74628jl936.execute-api.eu-west-1.amazonaws.com/staging' 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi/__main__.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from certifi import contents, where 4 | 5 | parser = argparse.ArgumentParser() 6 | parser.add_argument("-c", "--contents", action="store_true") 7 | args = parser.parse_args() 8 | 9 | if args.contents: 10 | print(contents()) 11 | else: 12 | print(where()) 13 | -------------------------------------------------------------------------------- /scheduler-lambda/app/bin/normalizer: -------------------------------------------------------------------------------- 1 | #!/home/mohamedradwan/developemnt/instance-scheduler/env3-scheduler/bin/python 2 | # -*- coding: utf-8 -*- 3 | import re 4 | import sys 5 | from charset_normalizer.cli.normalizer import cli_detect 6 | if __name__ == '__main__': 7 | sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) 8 | sys.exit(cli_detect()) 9 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/compat.py: -------------------------------------------------------------------------------- 1 | from .core import * 2 | from .codec import * 3 | from typing import Any, Union 4 | 5 | def ToASCII(label: str) -> bytes: 6 | return encode(label) 7 | 8 | def ToUnicode(label: Union[bytes, bytearray]) -> str: 9 | return decode(label) 10 | 11 | def nameprep(s: Any) -> None: 12 | raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') 13 | 14 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/__version__.py: -------------------------------------------------------------------------------- 1 | # .-. .-. .-. . . .-. .-. .-. .-. 2 | # |( |- |.| | | |- `-. | `-. 3 | # ' ' `-' `-`.`-' `-' `-' ' `-' 4 | 5 | __title__ = 'requests' 6 | __description__ = 'Python HTTP for Humans.' 7 | __url__ = 'https://requests.readthedocs.io' 8 | __version__ = '2.27.1' 9 | __build__ = 0x022701 10 | __author__ = 'Kenneth Reitz' 11 | __author_email__ = 'me@kennethreitz.org' 12 | __license__ = 'Apache 2.0' 13 | __copyright__ = 'Copyright 2022 Kenneth Reitz' 14 | __cake__ = u'\u2728 \U0001f370 \u2728' 15 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/certs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | requests.certs 6 | ~~~~~~~~~~~~~~ 7 | 8 | This module returns the preferred default CA certificate bundle. There is 9 | only one — the one from the certifi package. 10 | 11 | If you are packaging Requests, e.g., for a Linux distribution or a managed 12 | environment, you can change the definition of where() to return a separately 13 | packaged CA bundle. 14 | """ 15 | from certifi import where 16 | 17 | if __name__ == '__main__': 18 | print(where()) 19 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/queue.py: -------------------------------------------------------------------------------- 1 | import collections 2 | 3 | from ..packages import six 4 | from ..packages.six.moves import queue 5 | 6 | if six.PY2: 7 | # Queue is imported for side effects on MS Windows. See issue #229. 8 | import Queue as _unused_module_Queue # noqa: F401 9 | 10 | 11 | class LifoQueue(queue.Queue): 12 | def _init(self, _): 13 | self.queue = collections.deque() 14 | 15 | def _qsize(self, len=len): 16 | return len(self.queue) 17 | 18 | def _put(self, item): 19 | self.queue.append(item) 20 | 21 | def _get(self): 22 | return self.queue.pop() 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Instance Scheduler 2 | 3 | More Information and how to deploy the app 4 | 5 | https://dev.to/aws-builders/create-instance-scheduler-on-serverless-by-using-lambda-dynamodb-api-gateway-cognitos3-and-cloudfront-1op8 6 | ## By using AWS Serverless: 7 | 8 | * [Lambda] 9 | * [DynamoDB] 10 | * [Cognito] 11 | * [APIGateway] 12 | * [S3] 13 | * [Cloudwatch] 14 | * [Cloudfront] 15 | * [SES] 16 | * [KMS] 17 | * [Zappa] 18 | * [Flask] 19 | 20 | 21 | ![Architecture](https://github.com/maradwan/instance-scheduler/blob/main/html/img/architecture.jpg?raw=true) 22 | 23 | ![Instance](https://github.com/maradwan/instance-scheduler/blob/main/html/img/instance-view.png?raw=true) -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400} -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | font-display: auto; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; } 15 | -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: auto; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: block; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: block; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /html/css/vendor/fontawesome-free/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: auto; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /html/vendor/fontawesome-free/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: block; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/hooks.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | requests.hooks 5 | ~~~~~~~~~~~~~~ 6 | 7 | This module provides the capabilities for the Requests hooks system. 8 | 9 | Available hooks: 10 | 11 | ``response``: 12 | The response generated from a Request. 13 | """ 14 | HOOKS = ['response'] 15 | 16 | 17 | def default_hooks(): 18 | return {event: [] for event in HOOKS} 19 | 20 | # TODO: response is the only one 21 | 22 | 23 | def dispatch_hook(key, hooks, hook_data, **kwargs): 24 | """Dispatches a hook dictionary on a given piece of data.""" 25 | hooks = hooks or {} 26 | hooks = hooks.get(key) 27 | if hooks: 28 | if hasattr(hooks, '__call__'): 29 | hooks = [hooks] 30 | for hook in hooks: 31 | _hook_data = hook(hook_data, **kwargs) 32 | if _hook_data is not None: 33 | hook_data = _hook_data 34 | return hook_data 35 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/__init__.py: -------------------------------------------------------------------------------- 1 | from .package_data import __version__ 2 | from .core import ( 3 | IDNABidiError, 4 | IDNAError, 5 | InvalidCodepoint, 6 | InvalidCodepointContext, 7 | alabel, 8 | check_bidi, 9 | check_hyphen_ok, 10 | check_initial_combiner, 11 | check_label, 12 | check_nfc, 13 | decode, 14 | encode, 15 | ulabel, 16 | uts46_remap, 17 | valid_contextj, 18 | valid_contexto, 19 | valid_label_length, 20 | valid_string_length, 21 | ) 22 | from .intranges import intranges_contain 23 | 24 | __all__ = [ 25 | "IDNABidiError", 26 | "IDNAError", 27 | "InvalidCodepoint", 28 | "InvalidCodepointContext", 29 | "alabel", 30 | "check_bidi", 31 | "check_hyphen_ok", 32 | "check_initial_combiner", 33 | "check_label", 34 | "check_nfc", 35 | "decode", 36 | "encode", 37 | "intranges_contain", 38 | "ulabel", 39 | "uts46_remap", 40 | "valid_contextj", 41 | "valid_contexto", 42 | "valid_label_length", 43 | "valid_string_length", 44 | ] 45 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/packages.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | try: 4 | import chardet 5 | except ImportError: 6 | import charset_normalizer as chardet 7 | import warnings 8 | 9 | warnings.filterwarnings('ignore', 'Trying to detect', module='charset_normalizer') 10 | 11 | # This code exists for backwards compatibility reasons. 12 | # I don't like it either. Just look the other way. :) 13 | 14 | for package in ('urllib3', 'idna'): 15 | locals()[package] = __import__(package) 16 | # This traversal is apparently necessary such that the identities are 17 | # preserved (requests.packages.urllib3.* is urllib3.*) 18 | for mod in list(sys.modules): 19 | if mod == package or mod.startswith(package + '.'): 20 | sys.modules['requests.packages.' + mod] = sys.modules[mod] 21 | 22 | target = chardet.__name__ 23 | for mod in list(sys.modules): 24 | if mod == target or mod.startswith(target + '.'): 25 | sys.modules['requests.packages.' + target.replace(target, 'chardet')] = sys.modules[mod] 26 | # Kinda cool, though, right? 27 | -------------------------------------------------------------------------------- /app/api/actions.py: -------------------------------------------------------------------------------- 1 | import boto3 2 | 3 | def action_start(region,access_key,secret_access,instanceID): 4 | ec2 = boto3.client('ec2', region_name=region, aws_access_key_id=access_key, aws_secret_access_key=secret_access, verify=True) 5 | return ec2.start_instances(InstanceIds=[instanceID]) 6 | 7 | def action_stop(region,access_key,secret_access,instanceID): 8 | ec2 = boto3.client('ec2', region_name=region, aws_access_key_id=access_key, aws_secret_access_key=secret_access, verify=True) 9 | return ec2.stop_instances(InstanceIds=[instanceID]) 10 | 11 | def rds_action_start(region,access_key,secret_access,instanceID): 12 | rds = boto3.client('rds', region_name=region, aws_access_key_id=access_key, aws_secret_access_key=secret_access, verify=True) 13 | return rds.start_db_instance(DBInstanceIdentifier=instanceID) 14 | 15 | def rds_action_stop(region,access_key,secret_access,instanceID): 16 | rds = boto3.client('rds', region_name=region, aws_access_key_id=access_key, aws_secret_access_key=secret_access, verify=True) 17 | return rds.stop_db_instance(DBInstanceIdentifier=instanceID) -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/RECORD: -------------------------------------------------------------------------------- 1 | certifi-2022.5.18.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 2 | certifi-2022.5.18.1.dist-info/LICENSE,sha256=vp2C82ES-Hp_HXTs1Ih-FGe7roh4qEAEoAEXseR1o-I,1049 3 | certifi-2022.5.18.1.dist-info/METADATA,sha256=r_3zYuY4HJG9is8TSpenpbCffFRRhJolBMu-ibB_5w0,2806 4 | certifi-2022.5.18.1.dist-info/RECORD,, 5 | certifi-2022.5.18.1.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 6 | certifi-2022.5.18.1.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 7 | certifi/__init__.py,sha256=PH4NzOTtnQk1zecWG6Rn5IIGJfDzI8P96yr3UaVoo8Q,96 8 | certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 9 | certifi/__pycache__/__init__.cpython-38.pyc,, 10 | certifi/__pycache__/__main__.cpython-38.pyc,, 11 | certifi/__pycache__/core.cpython-38.pyc,, 12 | certifi/cacert.pem,sha256=H2V4vitIbWnjEakGTmm9cDrmIjsn3I8XJZKvybOVzbg,276001 13 | certifi/core.py,sha256=G5LqCBr4o8bozzzlYBE8nsd_ziB6XcxJiuMV4llFeYY,2515 14 | certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 15 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/_appengine_environ.py: -------------------------------------------------------------------------------- 1 | """ 2 | This module provides means to detect the App Engine environment. 3 | """ 4 | 5 | import os 6 | 7 | 8 | def is_appengine(): 9 | return is_local_appengine() or is_prod_appengine() 10 | 11 | 12 | def is_appengine_sandbox(): 13 | """Reports if the app is running in the first generation sandbox. 14 | 15 | The second generation runtimes are technically still in a sandbox, but it 16 | is much less restrictive, so generally you shouldn't need to check for it. 17 | see https://cloud.google.com/appengine/docs/standard/runtimes 18 | """ 19 | return is_appengine() and os.environ["APPENGINE_RUNTIME"] == "python27" 20 | 21 | 22 | def is_local_appengine(): 23 | return "APPENGINE_RUNTIME" in os.environ and os.environ.get( 24 | "SERVER_SOFTWARE", "" 25 | ).startswith("Development/") 26 | 27 | 28 | def is_prod_appengine(): 29 | return "APPENGINE_RUNTIME" in os.environ and os.environ.get( 30 | "SERVER_SOFTWARE", "" 31 | ).startswith("Google App Engine/") 32 | 33 | 34 | def is_prod_appengine_mvms(): 35 | """Deprecated.""" 36 | return False 37 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/LICENSE: -------------------------------------------------------------------------------- 1 | This package contains a modified version of ca-bundle.crt: 2 | 3 | ca-bundle.crt -- Bundle of CA Root Certificates 4 | 5 | Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011# 6 | This is a bundle of X.509 certificates of public Certificate Authorities 7 | (CA). These were automatically extracted from Mozilla's root certificates 8 | file (certdata.txt). This file can be found in the mozilla source tree: 9 | http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1# 10 | It contains the certificates in PEM format and therefore 11 | can be directly used with curl / libcurl / php_curl, or with 12 | an Apache+mod_ssl webserver for SSL client authentication. 13 | Just configure this file as the SSLCACertificateFile.# 14 | 15 | ***** BEGIN LICENSE BLOCK ***** 16 | This Source Code Form is subject to the terms of the Mozilla Public License, 17 | v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain 18 | one at http://mozilla.org/MPL/2.0/. 19 | 20 | ***** END LICENSE BLOCK ***** 21 | @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ 22 | -------------------------------------------------------------------------------- /app/api/notifications.py: -------------------------------------------------------------------------------- 1 | import boto3 2 | from os import environ as env 3 | 4 | source_email = env.get("SOURCE_EMAIL") 5 | region_name = env.get("REGION_NAME") 6 | 7 | def message_body_deleted_account(email): 8 | return """Hello! 9 | 10 | We deleted your account {} as requested. 11 | 12 | Thank you. 13 | 14 | Best Regards, 15 | Instance Scheduler Service""".format(email) 16 | 17 | def notification(to_addresses, msg, subj,source_email=source_email): 18 | email_client = boto3.client('ses',region_name= region_name, verify=True) 19 | return email_client.send_email( 20 | Destination={ 21 | 'ToAddresses': [to_addresses], 22 | }, 23 | Message={ 24 | 'Body': { 25 | 'Text': { 26 | 'Charset': 'UTF-8', 27 | 'Data': msg, 28 | }, 29 | }, 30 | 'Subject': { 31 | 'Charset': 'UTF-8', 32 | 'Data': subj, 33 | }, 34 | }, 35 | Source=source_email, 36 | ) -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer-2.0.12.dist-info/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 TAHRI Ahmed R. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3-1.26.9.dist-info/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/_internal_utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | requests._internal_utils 5 | ~~~~~~~~~~~~~~ 6 | 7 | Provides utility functions that are consumed internally by Requests 8 | which depend on extremely few external helpers (such as compat) 9 | """ 10 | 11 | from .compat import is_py2, builtin_str, str 12 | 13 | 14 | def to_native_string(string, encoding='ascii'): 15 | """Given a string object, regardless of type, returns a representation of 16 | that string in the native string type, encoding and decoding where 17 | necessary. This assumes ASCII unless told otherwise. 18 | """ 19 | if isinstance(string, builtin_str): 20 | out = string 21 | else: 22 | if is_py2: 23 | out = string.encode(encoding) 24 | else: 25 | out = string.decode(encoding) 26 | 27 | return out 28 | 29 | 30 | def unicode_is_ascii(u_string): 31 | """Determine if unicode string only contains ASCII characters. 32 | 33 | :param str u_string: unicode string to check. Must be unicode 34 | and not Python 2 `str`. 35 | :rtype: bool 36 | """ 37 | assert isinstance(u_string, str) 38 | try: 39 | u_string.encode('ascii') 40 | return True 41 | except UnicodeEncodeError: 42 | return False 43 | -------------------------------------------------------------------------------- /app/zappa_settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "staging": { 3 | "app_function": "api.app", 4 | "aws_region": "eu-west-1", 5 | "profile_name": "default", 6 | "project_name": "instance-scheduler", 7 | "cors": true, 8 | "keep_warm": false, 9 | "authorizer": { 10 | "type": "COGNITO_USER_POOLS", 11 | "provider_arns": [ 12 | "arn:aws:cognito-idp:eu-west-1:117698054570:userpool/eu-west-1_aphRYjOaB" 13 | ] 14 | }, 15 | "s3_bucket": "zappa-instance-scheduler-staging-0gl0tnjcf", 16 | "runtime": "python3.8", 17 | "attach_policy":"instance-scheduler-staging-policy.json", 18 | "aws_environment_variables": {"TABLE_NAME": "instance-scheduler", 19 | "REGION_NAME": "eu-west-1", 20 | "KMS_KEY_ID": "cc6d14eb-1ca6-4b02-b862-7e30f48b4bbd", 21 | "EC2_LIMIT": "5", 22 | "KEYS_LIMIT": "5", 23 | "SOURCE_EMAIL": "noreply@gozeit.com", 24 | "USERPOOLID": "eu-west-1_aphRYjOaB", 25 | "COGNITOR_CLIENTID": "5jgkf9l7p7on2uq4g1v7fffa55" 26 | 27 | 28 | } 29 | 30 | } 31 | } -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | # For backwards compatibility, provide imports that used to be here. 4 | from .connection import is_connection_dropped 5 | from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers 6 | from .response import is_fp_closed 7 | from .retry import Retry 8 | from .ssl_ import ( 9 | ALPN_PROTOCOLS, 10 | HAS_SNI, 11 | IS_PYOPENSSL, 12 | IS_SECURETRANSPORT, 13 | PROTOCOL_TLS, 14 | SSLContext, 15 | assert_fingerprint, 16 | resolve_cert_reqs, 17 | resolve_ssl_version, 18 | ssl_wrap_socket, 19 | ) 20 | from .timeout import Timeout, current_time 21 | from .url import Url, get_host, parse_url, split_first 22 | from .wait import wait_for_read, wait_for_write 23 | 24 | __all__ = ( 25 | "HAS_SNI", 26 | "IS_PYOPENSSL", 27 | "IS_SECURETRANSPORT", 28 | "SSLContext", 29 | "PROTOCOL_TLS", 30 | "ALPN_PROTOCOLS", 31 | "Retry", 32 | "Timeout", 33 | "Url", 34 | "assert_fingerprint", 35 | "current_time", 36 | "is_connection_dropped", 37 | "is_fp_closed", 38 | "get_host", 39 | "parse_url", 40 | "make_headers", 41 | "resolve_cert_reqs", 42 | "resolve_ssl_version", 43 | "split_first", 44 | "ssl_wrap_socket", 45 | "wait_for_read", 46 | "wait_for_write", 47 | "SKIP_HEADER", 48 | "SKIPPABLE_HEADERS", 49 | ) 50 | -------------------------------------------------------------------------------- /html/css/my-login.css: -------------------------------------------------------------------------------- 1 | html,body { 2 | height: 100%; 3 | } 4 | 5 | body.my-login-page { 6 | background-color: #f7f9fb; 7 | font-size: 14px; 8 | } 9 | 10 | .my-login-page .brand { 11 | width: 90px; 12 | height: 90px; 13 | overflow: hidden; 14 | border-radius: 50%; 15 | margin: 40px auto; 16 | box-shadow: 0 4px 8px rgba(0,0,0,.05); 17 | position: relative; 18 | z-index: 1; 19 | } 20 | 21 | .my-login-page .brand img { 22 | width: 100%; 23 | } 24 | 25 | .my-login-page .card-wrapper { 26 | width: 400px; 27 | } 28 | 29 | .my-login-page .card { 30 | border-color: transparent; 31 | box-shadow: 0 4px 8px rgba(0,0,0,.05); 32 | } 33 | 34 | .my-login-page .card.fat { 35 | padding: 10px; 36 | } 37 | 38 | .my-login-page .card .card-title { 39 | margin-bottom: 30px; 40 | } 41 | 42 | .my-login-page .form-control { 43 | border-width: 2.3px; 44 | } 45 | 46 | .my-login-page .form-group label { 47 | width: 100%; 48 | } 49 | 50 | .my-login-page .btn.btn-block { 51 | padding: 12px 10px; 52 | } 53 | 54 | .my-login-page .footer { 55 | margin: 40px 0; 56 | color: #888; 57 | text-align: center; 58 | } 59 | 60 | @media screen and (max-width: 425px) { 61 | .my-login-page .card-wrapper { 62 | width: 90%; 63 | margin: 0 auto; 64 | } 65 | } 66 | 67 | @media screen and (max-width: 320px) { 68 | .my-login-page .card.fat { 69 | padding: 0; 70 | } 71 | 72 | .my-login-page .card.fat .card-body { 73 | padding: 15px; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna-3.3.dist-info/RECORD: -------------------------------------------------------------------------------- 1 | idna-3.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 2 | idna-3.3.dist-info/LICENSE.md,sha256=otbk2UC9JNvnuWRc3hmpeSzFHbeuDVrNMBrIYMqj6DY,1523 3 | idna-3.3.dist-info/METADATA,sha256=BdqiAf8ou4x1nzIHp2_sDfXWjl7BrSUGpOeVzbYHQuQ,9765 4 | idna-3.3.dist-info/RECORD,, 5 | idna-3.3.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 6 | idna-3.3.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5 7 | idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 8 | idna/__pycache__/__init__.cpython-38.pyc,, 9 | idna/__pycache__/codec.cpython-38.pyc,, 10 | idna/__pycache__/compat.cpython-38.pyc,, 11 | idna/__pycache__/core.cpython-38.pyc,, 12 | idna/__pycache__/idnadata.cpython-38.pyc,, 13 | idna/__pycache__/intranges.cpython-38.pyc,, 14 | idna/__pycache__/package_data.cpython-38.pyc,, 15 | idna/__pycache__/uts46data.cpython-38.pyc,, 16 | idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 17 | idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 18 | idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795 19 | idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025 20 | idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 21 | idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21 22 | idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 23 | idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400 24 | -------------------------------------------------------------------------------- /scheduler-lambda/app/idna-3.3.dist-info/LICENSE.md: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2013-2021, Kim Davies 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/packages/backports/makefile.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | backports.makefile 4 | ~~~~~~~~~~~~~~~~~~ 5 | 6 | Backports the Python 3 ``socket.makefile`` method for use with anything that 7 | wants to create a "fake" socket object. 8 | """ 9 | import io 10 | from socket import SocketIO 11 | 12 | 13 | def backport_makefile( 14 | self, mode="r", buffering=None, encoding=None, errors=None, newline=None 15 | ): 16 | """ 17 | Backport of ``socket.makefile`` from Python 3.5. 18 | """ 19 | if not set(mode) <= {"r", "w", "b"}: 20 | raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) 21 | writing = "w" in mode 22 | reading = "r" in mode or not writing 23 | assert reading or writing 24 | binary = "b" in mode 25 | rawmode = "" 26 | if reading: 27 | rawmode += "r" 28 | if writing: 29 | rawmode += "w" 30 | raw = SocketIO(self, rawmode) 31 | self._makefile_refs += 1 32 | if buffering is None: 33 | buffering = -1 34 | if buffering < 0: 35 | buffering = io.DEFAULT_BUFFER_SIZE 36 | if buffering == 0: 37 | if not binary: 38 | raise ValueError("unbuffered streams must be binary") 39 | return raw 40 | if reading and writing: 41 | buffer = io.BufferedRWPair(raw, raw, buffering) 42 | elif reading: 43 | buffer = io.BufferedReader(raw, buffering) 44 | else: 45 | assert writing 46 | buffer = io.BufferedWriter(raw, buffering) 47 | if binary: 48 | return buffer 49 | text = io.TextIOWrapper(buffer, encoding, errors, newline) 50 | text.mode = mode 51 | return text 52 | -------------------------------------------------------------------------------- /app/instance-scheduler-staging-policy.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": "2012-10-17", 3 | "Statement": [ 4 | { 5 | "Sid": "VisualEditor0", 6 | "Effect": "Allow", 7 | "Action": [ 8 | "dynamodb:PutItem", 9 | "dynamodb:DeleteItem", 10 | "dynamodb:Scan", 11 | "dynamodb:Query", 12 | "dynamodb:UpdateItem" 13 | ], 14 | "Resource": [ 15 | "arn:aws:dynamodb:*:*:table/instance-scheduler/index/*", 16 | "arn:aws:dynamodb:*:*:table/instance-scheduler" 17 | ] 18 | }, 19 | { 20 | "Sid": "VisualEditor1", 21 | "Effect": "Allow", 22 | "Action": [ 23 | "logs:CreateLogGroup", 24 | "logs:CreateLogStream", 25 | "logs:PutLogEvents" 26 | ], 27 | "Resource": "*" 28 | }, 29 | { 30 | "Sid": "VisualEditor2", 31 | "Effect": "Allow", 32 | "Action": [ 33 | "ses:SendEmail", 34 | "ses:SendRawEmail" 35 | ], 36 | "Resource": "*" 37 | }, 38 | { 39 | "Sid": "VisualEditor3", 40 | "Effect": "Allow", 41 | "Action": [ 42 | "lambda:InvokeFunction" 43 | ], 44 | "Resource": [ 45 | "*" 46 | ] 47 | }, 48 | { 49 | "Sid": "VisualEditor4", 50 | "Effect": "Allow", 51 | "Action": "cognito-idp:AdminDeleteUser", 52 | "Resource": "*" 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /html/js/my-login.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | $(function() { 4 | 5 | $("input[type='password'][data-eye]").each(function(i) { 6 | var $this = $(this), 7 | id = 'eye-password-' + i, 8 | el = $('#' + id); 9 | 10 | $this.wrap($("
", { 11 | style: 'position:relative', 12 | id: id 13 | })); 14 | 15 | $this.css({ 16 | paddingRight: 60 17 | }); 18 | $this.after($("
", { 19 | html: 'Show', 20 | class: 'btn btn-primary btn-sm', 21 | id: 'passeye-toggle-'+i, 22 | }).css({ 23 | position: 'absolute', 24 | right: 10, 25 | top: ($this.outerHeight() / 2) - 12, 26 | padding: '2px 7px', 27 | fontSize: 12, 28 | cursor: 'pointer', 29 | })); 30 | 31 | $this.after($("", { 32 | type: 'hidden', 33 | id: 'passeye-' + i 34 | })); 35 | 36 | var invalid_feedback = $this.parent().parent().find('.invalid-feedback'); 37 | 38 | if(invalid_feedback.length) { 39 | $this.after(invalid_feedback.clone()); 40 | } 41 | 42 | $this.on("keyup paste", function() { 43 | $("#passeye-"+i).val($(this).val()); 44 | }); 45 | $("#passeye-toggle-"+i).on("click", function() { 46 | if($this.hasClass("show")) { 47 | $this.attr('type', 'password'); 48 | $this.removeClass("show"); 49 | $(this).removeClass("btn-outline-primary"); 50 | }else{ 51 | $this.attr('type', 'text'); 52 | $this.val($("#passeye-"+i).val()); 53 | $this.addClass("show"); 54 | $(this).addClass("btn-outline-primary"); 55 | } 56 | }); 57 | }); 58 | 59 | $(".my-login-validation").submit(function() { 60 | var form = $(this); 61 | if (form[0].checkValidity() === false) { 62 | event.preventDefault(); 63 | event.stopPropagation(); 64 | } 65 | form.addClass('was-validated'); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /html/css/landing-page.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Landing Page v5.0.8 (https://startbootstrap.com/themes/landing-page) 3 | * Copyright 2013-2020 Start Bootstrap 4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-landing-page/blob/master/LICENSE) 5 | */body{font-family:Lato,'Helvetica Neue',Helvetica,Arial,sans-serif}h1,h2,h3,h4,h5,h6{font-family:Lato,'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:700}header.masthead{position:relative;background-color:#343a40;background:url(../img/bg-masthead.jpg) no-repeat center center;background-size:cover;padding-top:8rem;padding-bottom:8rem}header.masthead .overlay{position:absolute;background-color:#212529;height:100%;width:100%;top:0;left:0;opacity:.3}header.masthead h1{font-size:2rem}@media (min-width:768px){header.masthead{padding-top:12rem;padding-bottom:12rem}header.masthead h1{font-size:3rem}}.showcase .showcase-text{padding:3rem}.showcase .showcase-img{min-height:30rem;background-size:cover}@media (min-width:768px){.showcase .showcase-text{padding:7rem}}.features-icons{padding-top:7rem;padding-bottom:7rem}.features-icons .features-icons-item{max-width:20rem}.features-icons .features-icons-item .features-icons-icon{height:7rem}.features-icons .features-icons-item .features-icons-icon i{font-size:4.5rem}.features-icons .features-icons-item:hover .features-icons-icon i{font-size:5rem}.testimonials{padding-top:7rem;padding-bottom:7rem}.testimonials .testimonial-item{max-width:18rem}.testimonials .testimonial-item img{max-width:12rem;box-shadow:0 5px 5px 0 #adb5bd}.call-to-action{position:relative;background-color:#343a40;background:url(../img/bg-masthead.jpg) no-repeat center center;background-size:cover;padding-top:7rem;padding-bottom:7rem}.call-to-action .overlay{position:absolute;background-color:#212529;height:100%;width:100%;top:0;left:0;opacity:.3}footer.footer{padding-top:4rem;padding-bottom:4rem} -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/proxy.py: -------------------------------------------------------------------------------- 1 | from .ssl_ import create_urllib3_context, resolve_cert_reqs, resolve_ssl_version 2 | 3 | 4 | def connection_requires_http_tunnel( 5 | proxy_url=None, proxy_config=None, destination_scheme=None 6 | ): 7 | """ 8 | Returns True if the connection requires an HTTP CONNECT through the proxy. 9 | 10 | :param URL proxy_url: 11 | URL of the proxy. 12 | :param ProxyConfig proxy_config: 13 | Proxy configuration from poolmanager.py 14 | :param str destination_scheme: 15 | The scheme of the destination. (i.e https, http, etc) 16 | """ 17 | # If we're not using a proxy, no way to use a tunnel. 18 | if proxy_url is None: 19 | return False 20 | 21 | # HTTP destinations never require tunneling, we always forward. 22 | if destination_scheme == "http": 23 | return False 24 | 25 | # Support for forwarding with HTTPS proxies and HTTPS destinations. 26 | if ( 27 | proxy_url.scheme == "https" 28 | and proxy_config 29 | and proxy_config.use_forwarding_for_https 30 | ): 31 | return False 32 | 33 | # Otherwise always use a tunnel. 34 | return True 35 | 36 | 37 | def create_proxy_ssl_context( 38 | ssl_version, cert_reqs, ca_certs=None, ca_cert_dir=None, ca_cert_data=None 39 | ): 40 | """ 41 | Generates a default proxy ssl context if one hasn't been provided by the 42 | user. 43 | """ 44 | ssl_context = create_urllib3_context( 45 | ssl_version=resolve_ssl_version(ssl_version), 46 | cert_reqs=resolve_cert_reqs(cert_reqs), 47 | ) 48 | 49 | if ( 50 | not ca_certs 51 | and not ca_cert_dir 52 | and not ca_cert_data 53 | and hasattr(ssl_context, "load_default_certs") 54 | ): 55 | ssl_context.load_default_certs() 56 | 57 | return ssl_context 58 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf_8 -*- 2 | """ 3 | Charset-Normalizer 4 | ~~~~~~~~~~~~~~ 5 | The Real First Universal Charset Detector. 6 | A library that helps you read text from an unknown charset encoding. 7 | Motivated by chardet, This package is trying to resolve the issue by taking a new approach. 8 | All IANA character set names for which the Python core library provides codecs are supported. 9 | 10 | Basic usage: 11 | >>> from charset_normalizer import from_bytes 12 | >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) 13 | >>> best_guess = results.best() 14 | >>> str(best_guess) 15 | 'Bсеки човек има право на образование. Oбразованието!' 16 | 17 | Others methods and usages are available - see the full documentation 18 | at . 19 | :copyright: (c) 2021 by Ahmed TAHRI 20 | :license: MIT, see LICENSE for more details. 21 | """ 22 | import logging 23 | 24 | from .api import from_bytes, from_fp, from_path, normalize 25 | from .legacy import ( 26 | CharsetDetector, 27 | CharsetDoctor, 28 | CharsetNormalizerMatch, 29 | CharsetNormalizerMatches, 30 | detect, 31 | ) 32 | from .models import CharsetMatch, CharsetMatches 33 | from .utils import set_logging_handler 34 | from .version import VERSION, __version__ 35 | 36 | __all__ = ( 37 | "from_fp", 38 | "from_path", 39 | "from_bytes", 40 | "normalize", 41 | "detect", 42 | "CharsetMatch", 43 | "CharsetMatches", 44 | "CharsetNormalizerMatch", 45 | "CharsetNormalizerMatches", 46 | "CharsetDetector", 47 | "CharsetDoctor", 48 | "__version__", 49 | "VERSION", 50 | "set_logging_handler", 51 | ) 52 | 53 | # Attach a NullHandler to the top level logger by default 54 | # https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library 55 | 56 | logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) 57 | -------------------------------------------------------------------------------- /app/api/auth.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from flask import request, jsonify 3 | from os import environ as env 4 | import json 5 | import jwt 6 | import requests 7 | from jwt.algorithms import RSAAlgorithm 8 | 9 | cognito_app_client_id = env.get("COGNITOR_CLIENTID") 10 | cognito_region = env.get("REGION_NAME") 11 | cognito_user_pool_id = env.get("USERPOOLID") 12 | 13 | def validate_cognito_token(id_token, cognito_region, cognito_user_pool_id, cognito_app_client_id): 14 | jwks = requests.get('https://cognito-idp.{aws_region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json'.format(aws_region=cognito_region, user_pool_id=cognito_user_pool_id)).json() 15 | keys = {k['kid']: RSAAlgorithm.from_jwk(json.dumps(k)) for k in jwks['keys']} 16 | header = jwt.get_unverified_header(id_token) 17 | key_id = header['kid'] 18 | algorithm = header['alg'] 19 | pub_key = keys[key_id] 20 | # Next line raises errors if the audience isn't right or if the token is expired or has other errors. 21 | valid_token_data = jwt.decode(id_token, pub_key, audience=cognito_app_client_id, algorithms=algorithm,verify=True) 22 | return valid_token_data 23 | 24 | def token_email(): 25 | token = None 26 | try: 27 | if 'Authorization' in request.headers: 28 | token = request.headers['Authorization'] 29 | if token.split()[0] == "Bearer": 30 | user = validate_cognito_token(token.split()[1],cognito_region,cognito_user_pool_id,cognito_app_client_id) 31 | 32 | # It is important to split as the token has one space 33 | user = validate_cognito_token(token.split()[0],cognito_region,cognito_user_pool_id,cognito_app_client_id) 34 | 35 | return user['email'] 36 | except: 37 | return jsonify('Misunderstood Request'),401 38 | 39 | def gen_time(): 40 | timenow = datetime.now() 41 | return timenow.strftime("%d-%m-%Y_%H-%M-%S-%f") 42 | 43 | def check_email(email): 44 | if email == token_email(): 45 | return True 46 | return False -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/intranges.py: -------------------------------------------------------------------------------- 1 | """ 2 | Given a list of integers, made up of (hopefully) a small number of long runs 3 | of consecutive integers, compute a representation of the form 4 | ((start1, end1), (start2, end2) ...). Then answer the question "was x present 5 | in the original list?" in time O(log(# runs)). 6 | """ 7 | 8 | import bisect 9 | from typing import List, Tuple 10 | 11 | def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: 12 | """Represent a list of integers as a sequence of ranges: 13 | ((start_0, end_0), (start_1, end_1), ...), such that the original 14 | integers are exactly those x such that start_i <= x < end_i for some i. 15 | 16 | Ranges are encoded as single integers (start << 32 | end), not as tuples. 17 | """ 18 | 19 | sorted_list = sorted(list_) 20 | ranges = [] 21 | last_write = -1 22 | for i in range(len(sorted_list)): 23 | if i+1 < len(sorted_list): 24 | if sorted_list[i] == sorted_list[i+1]-1: 25 | continue 26 | current_range = sorted_list[last_write+1:i+1] 27 | ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) 28 | last_write = i 29 | 30 | return tuple(ranges) 31 | 32 | def _encode_range(start: int, end: int) -> int: 33 | return (start << 32) | end 34 | 35 | def _decode_range(r: int) -> Tuple[int, int]: 36 | return (r >> 32), (r & ((1 << 32) - 1)) 37 | 38 | 39 | def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: 40 | """Determine if `int_` falls into one of the ranges in `ranges`.""" 41 | tuple_ = _encode_range(int_, 0) 42 | pos = bisect.bisect_left(ranges, tuple_) 43 | # we could be immediately ahead of a tuple (start, end) 44 | # with start < int_ <= end 45 | if pos > 0: 46 | left, right = _decode_range(ranges[pos-1]) 47 | if left <= int_ < right: 48 | return True 49 | # or we could be immediately behind a tuple (int_, end) 50 | if pos < len(ranges): 51 | left, _ = _decode_range(ranges[pos]) 52 | if left == int_: 53 | return True 54 | return False 55 | -------------------------------------------------------------------------------- /scheduler-lambda/kms.tf: -------------------------------------------------------------------------------- 1 | locals { 2 | account_id = data.aws_caller_identity.current.account_id 3 | } 4 | 5 | data "aws_caller_identity" "current" {} 6 | 7 | 8 | # Creates/manages KMS CMK 9 | resource "aws_kms_key" "this" { 10 | description = "instance-scheduler" 11 | customer_master_key_spec = "SYMMETRIC_DEFAULT" 12 | is_enabled = true 13 | policy = < str: 18 | # This is slightly terrible, but we want to delay extracting the file 19 | # in cases where we're inside of a zipimport situation until someone 20 | # actually calls where(), but we don't want to re-extract the file 21 | # on every call of where(), so we'll do it once then store it in a 22 | # global variable. 23 | global _CACERT_CTX 24 | global _CACERT_PATH 25 | if _CACERT_PATH is None: 26 | # This is slightly janky, the importlib.resources API wants you to 27 | # manage the cleanup of this file, so it doesn't actually return a 28 | # path, it returns a context manager that will give you the path 29 | # when you enter it and will do any cleanup when you leave it. In 30 | # the common case of not needing a temporary file, it will just 31 | # return the file system location and the __exit__() is a no-op. 32 | # 33 | # We also have to hold onto the actual context manager, because 34 | # it will do the cleanup whenever it gets garbage collected, so 35 | # we will also store that at the global level as well. 36 | _CACERT_CTX = get_path("certifi", "cacert.pem") 37 | _CACERT_PATH = str(_CACERT_CTX.__enter__()) 38 | 39 | return _CACERT_PATH 40 | 41 | 42 | except ImportError: 43 | Package = Union[types.ModuleType, str] 44 | Resource = Union[str, "os.PathLike"] 45 | 46 | # This fallback will work for Python versions prior to 3.7 that lack the 47 | # importlib.resources module but relies on the existing `where` function 48 | # so won't address issues with environments like PyOxidizer that don't set 49 | # __file__ on modules. 50 | def read_text( 51 | package: Package, 52 | resource: Resource, 53 | encoding: str = 'utf-8', 54 | errors: str = 'strict' 55 | ) -> str: 56 | with open(where(), encoding=encoding) as data: 57 | return data.read() 58 | 59 | # If we don't have importlib.resources, then we will just do the old logic 60 | # of assuming we're on the filesystem and munge the path directly. 61 | def where() -> str: 62 | f = os.path.dirname(__file__) 63 | 64 | return os.path.join(f, "cacert.pem") 65 | 66 | 67 | def contents() -> str: 68 | return read_text("certifi", "cacert.pem", encoding="ascii") 69 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/filepost.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | import binascii 4 | import codecs 5 | import os 6 | from io import BytesIO 7 | 8 | from .fields import RequestField 9 | from .packages import six 10 | from .packages.six import b 11 | 12 | writer = codecs.lookup("utf-8")[3] 13 | 14 | 15 | def choose_boundary(): 16 | """ 17 | Our embarrassingly-simple replacement for mimetools.choose_boundary. 18 | """ 19 | boundary = binascii.hexlify(os.urandom(16)) 20 | if not six.PY2: 21 | boundary = boundary.decode("ascii") 22 | return boundary 23 | 24 | 25 | def iter_field_objects(fields): 26 | """ 27 | Iterate over fields. 28 | 29 | Supports list of (k, v) tuples and dicts, and lists of 30 | :class:`~urllib3.fields.RequestField`. 31 | 32 | """ 33 | if isinstance(fields, dict): 34 | i = six.iteritems(fields) 35 | else: 36 | i = iter(fields) 37 | 38 | for field in i: 39 | if isinstance(field, RequestField): 40 | yield field 41 | else: 42 | yield RequestField.from_tuples(*field) 43 | 44 | 45 | def iter_fields(fields): 46 | """ 47 | .. deprecated:: 1.6 48 | 49 | Iterate over fields. 50 | 51 | The addition of :class:`~urllib3.fields.RequestField` makes this function 52 | obsolete. Instead, use :func:`iter_field_objects`, which returns 53 | :class:`~urllib3.fields.RequestField` objects. 54 | 55 | Supports list of (k, v) tuples and dicts. 56 | """ 57 | if isinstance(fields, dict): 58 | return ((k, v) for k, v in six.iteritems(fields)) 59 | 60 | return ((k, v) for k, v in fields) 61 | 62 | 63 | def encode_multipart_formdata(fields, boundary=None): 64 | """ 65 | Encode a dictionary of ``fields`` using the multipart/form-data MIME format. 66 | 67 | :param fields: 68 | Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). 69 | 70 | :param boundary: 71 | If not specified, then a random boundary will be generated using 72 | :func:`urllib3.filepost.choose_boundary`. 73 | """ 74 | body = BytesIO() 75 | if boundary is None: 76 | boundary = choose_boundary() 77 | 78 | for field in iter_field_objects(fields): 79 | body.write(b("--%s\r\n" % (boundary))) 80 | 81 | writer(body).write(field.render_headers()) 82 | data = field.data 83 | 84 | if isinstance(data, int): 85 | data = str(data) # Backwards compatibility 86 | 87 | if isinstance(data, six.text_type): 88 | writer(body).write(data) 89 | else: 90 | body.write(data) 91 | 92 | body.write(b"\r\n") 93 | 94 | body.write(b("--%s--\r\n" % (boundary))) 95 | 96 | content_type = str("multipart/form-data; boundary=%s" % boundary) 97 | 98 | return body.getvalue(), content_type 99 | -------------------------------------------------------------------------------- /html/architecture.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | Instance Scheduler Architecture 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
47 | 48 |
49 |
50 |
51 | 52 |

The App Architecture

53 |
54 | 55 | 56 |
57 | 58 | 59 | 60 | 61 |
62 |
63 | 64 |
65 | 66 | 67 |
68 | My Contact on Linkedin 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests-2.27.1.dist-info/RECORD: -------------------------------------------------------------------------------- 1 | requests-2.27.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 2 | requests-2.27.1.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 3 | requests-2.27.1.dist-info/METADATA,sha256=fxIjGa_S2RlpD4oFJGdSuXQWFUGxjcgAhLYF9HwRp8Q,4984 4 | requests-2.27.1.dist-info/RECORD,, 5 | requests-2.27.1.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 6 | requests-2.27.1.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 7 | requests/__init__.py,sha256=BgNBrAYr3DdRWDtkc1IwoSraVBBz1712c_eX4G8h-ak,4924 8 | requests/__pycache__/__init__.cpython-38.pyc,, 9 | requests/__pycache__/__version__.cpython-38.pyc,, 10 | requests/__pycache__/_internal_utils.cpython-38.pyc,, 11 | requests/__pycache__/adapters.cpython-38.pyc,, 12 | requests/__pycache__/api.cpython-38.pyc,, 13 | requests/__pycache__/auth.cpython-38.pyc,, 14 | requests/__pycache__/certs.cpython-38.pyc,, 15 | requests/__pycache__/compat.cpython-38.pyc,, 16 | requests/__pycache__/cookies.cpython-38.pyc,, 17 | requests/__pycache__/exceptions.cpython-38.pyc,, 18 | requests/__pycache__/help.cpython-38.pyc,, 19 | requests/__pycache__/hooks.cpython-38.pyc,, 20 | requests/__pycache__/models.cpython-38.pyc,, 21 | requests/__pycache__/packages.cpython-38.pyc,, 22 | requests/__pycache__/sessions.cpython-38.pyc,, 23 | requests/__pycache__/status_codes.cpython-38.pyc,, 24 | requests/__pycache__/structures.cpython-38.pyc,, 25 | requests/__pycache__/utils.cpython-38.pyc,, 26 | requests/__version__.py,sha256=q8miOQaomOv3S74lK4eQs1zZ5jwcnOusyEU-M2idhts,441 27 | requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 28 | requests/adapters.py,sha256=YJf_0S2JL5fEs6yPKC3iQ-Iu0UZxDb9H6W5ipVBrIXE,21645 29 | requests/api.py,sha256=hjuoP79IAEmX6Dysrw8t032cLfwLHxbI_wM4gC5G9t0,6402 30 | requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,10207 31 | requests/certs.py,sha256=dOB5rV2DZ13dEhq9BUa_4hd5kAqg59e_zUZB00faYz8,453 32 | requests/compat.py,sha256=wy3bUOq8aKOE7mMZiLJJMXFCaXbhoS-baON60EDvAIg,2054 33 | requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 34 | requests/exceptions.py,sha256=VUKyfNZmXjsjkPgipZupHfkcE3OVdYKx8GqfvWckfwA,3434 35 | requests/help.py,sha256=ywPNssPohrch_Q_q4_JLJM1z2bP0TirHkA9QnoOF0sY,3968 36 | requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 37 | requests/models.py,sha256=RfXfgGUZ5X6CWUhUODku7-MOQNWVs7lDZPV6bDC53cY,35051 38 | requests/packages.py,sha256=kr9J9dYZr9Ef4JmwHbCEUgwViwcCyOUPgfXZvIL84Os,932 39 | requests/sessions.py,sha256=Zu-Y9YPlwTIsyFx1hvIrc3ziyeFpuFPqcOuSuz8BNWs,29835 40 | requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188 41 | requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005 42 | requests/utils.py,sha256=MKTK3du_WmmO2nv_SkeV880VwfIYhJbvd1Lz7uDioP8,33277 43 | -------------------------------------------------------------------------------- /html/css/landing-page.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Landing Page v5.0.8 (https://startbootstrap.com/themes/landing-page) 3 | * Copyright 2013-2020 Start Bootstrap 4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-landing-page/blob/master/LICENSE) 5 | */ 6 | 7 | body { 8 | font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 9 | } 10 | 11 | h1, 12 | h2, 13 | h3, 14 | h4, 15 | h5, 16 | h6 { 17 | font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 18 | font-weight: 700; 19 | } 20 | 21 | header.masthead { 22 | position: relative; 23 | background-color: #343a40; 24 | background: url("../img/bg-masthead.jpg") no-repeat center center; 25 | background-size: cover; 26 | padding-top: 8rem; 27 | padding-bottom: 8rem; 28 | } 29 | 30 | header.masthead .overlay { 31 | position: absolute; 32 | background-color: #212529; 33 | height: 100%; 34 | width: 100%; 35 | top: 0; 36 | left: 0; 37 | opacity: 0.3; 38 | } 39 | 40 | header.masthead h1 { 41 | font-size: 2rem; 42 | } 43 | 44 | @media (min-width: 768px) { 45 | header.masthead { 46 | padding-top: 12rem; 47 | padding-bottom: 12rem; 48 | } 49 | header.masthead h1 { 50 | font-size: 3rem; 51 | } 52 | } 53 | 54 | .showcase .showcase-text { 55 | padding: 3rem; 56 | } 57 | 58 | .showcase .showcase-img { 59 | min-height: 30rem; 60 | background-size: cover; 61 | } 62 | 63 | @media (min-width: 768px) { 64 | .showcase .showcase-text { 65 | padding: 7rem; 66 | } 67 | } 68 | 69 | .features-icons { 70 | padding-top: 7rem; 71 | padding-bottom: 7rem; 72 | } 73 | 74 | .features-icons .features-icons-item { 75 | max-width: 20rem; 76 | } 77 | 78 | .features-icons .features-icons-item .features-icons-icon { 79 | height: 7rem; 80 | } 81 | 82 | .features-icons .features-icons-item .features-icons-icon i { 83 | font-size: 4.5rem; 84 | } 85 | 86 | .features-icons .features-icons-item:hover .features-icons-icon i { 87 | font-size: 5rem; 88 | } 89 | 90 | .testimonials { 91 | padding-top: 7rem; 92 | padding-bottom: 7rem; 93 | } 94 | 95 | .testimonials .testimonial-item { 96 | max-width: 18rem; 97 | } 98 | 99 | .testimonials .testimonial-item img { 100 | max-width: 12rem; 101 | box-shadow: 0px 5px 5px 0px #adb5bd; 102 | } 103 | 104 | .call-to-action { 105 | position: relative; 106 | background-color: #343a40; 107 | background: url("../img/bg-masthead.jpg") no-repeat center center; 108 | background-size: cover; 109 | padding-top: 7rem; 110 | padding-bottom: 7rem; 111 | } 112 | 113 | .call-to-action .overlay { 114 | position: absolute; 115 | background-color: #212529; 116 | height: 100%; 117 | width: 100%; 118 | top: 0; 119 | left: 0; 120 | opacity: 0.3; 121 | } 122 | 123 | footer.footer { 124 | padding-top: 4rem; 125 | padding-bottom: 4rem; 126 | } 127 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more 3 | """ 4 | from __future__ import absolute_import 5 | 6 | # Set default logging handler to avoid "No handler found" warnings. 7 | import logging 8 | import warnings 9 | from logging import NullHandler 10 | 11 | from . import exceptions 12 | from ._version import __version__ 13 | from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url 14 | from .filepost import encode_multipart_formdata 15 | from .poolmanager import PoolManager, ProxyManager, proxy_from_url 16 | from .response import HTTPResponse 17 | from .util.request import make_headers 18 | from .util.retry import Retry 19 | from .util.timeout import Timeout 20 | from .util.url import get_host 21 | 22 | __author__ = "Andrey Petrov (andrey.petrov@shazow.net)" 23 | __license__ = "MIT" 24 | __version__ = __version__ 25 | 26 | __all__ = ( 27 | "HTTPConnectionPool", 28 | "HTTPSConnectionPool", 29 | "PoolManager", 30 | "ProxyManager", 31 | "HTTPResponse", 32 | "Retry", 33 | "Timeout", 34 | "add_stderr_logger", 35 | "connection_from_url", 36 | "disable_warnings", 37 | "encode_multipart_formdata", 38 | "get_host", 39 | "make_headers", 40 | "proxy_from_url", 41 | ) 42 | 43 | logging.getLogger(__name__).addHandler(NullHandler()) 44 | 45 | 46 | def add_stderr_logger(level=logging.DEBUG): 47 | """ 48 | Helper for quickly adding a StreamHandler to the logger. Useful for 49 | debugging. 50 | 51 | Returns the handler after adding it. 52 | """ 53 | # This method needs to be in this __init__.py to get the __name__ correct 54 | # even if urllib3 is vendored within another package. 55 | logger = logging.getLogger(__name__) 56 | handler = logging.StreamHandler() 57 | handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) 58 | logger.addHandler(handler) 59 | logger.setLevel(level) 60 | logger.debug("Added a stderr logging handler to logger: %s", __name__) 61 | return handler 62 | 63 | 64 | # ... Clean up. 65 | del NullHandler 66 | 67 | 68 | # All warning filters *must* be appended unless you're really certain that they 69 | # shouldn't be: otherwise, it's very hard for users to use most Python 70 | # mechanisms to silence them. 71 | # SecurityWarning's always go off by default. 72 | warnings.simplefilter("always", exceptions.SecurityWarning, append=True) 73 | # SubjectAltNameWarning's should go off once per host 74 | warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True) 75 | # InsecurePlatformWarning's don't vary between requests, so we keep it default. 76 | warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) 77 | # SNIMissingWarnings should go off only once. 78 | warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True) 79 | 80 | 81 | def disable_warnings(category=exceptions.HTTPWarning): 82 | """ 83 | Helper for quickly disabling all urllib3 warnings. 84 | """ 85 | warnings.simplefilter("ignore", category) 86 | -------------------------------------------------------------------------------- /scheduler-lambda/app/certifi-2022.5.18.1.dist-info/METADATA: -------------------------------------------------------------------------------- 1 | Metadata-Version: 2.1 2 | Name: certifi 3 | Version: 2022.5.18.1 4 | Summary: Python package for providing Mozilla's CA Bundle. 5 | Home-page: https://github.com/certifi/python-certifi 6 | Author: Kenneth Reitz 7 | Author-email: me@kennethreitz.com 8 | License: MPL-2.0 9 | Project-URL: Source, https://github.com/certifi/python-certifi 10 | Platform: UNKNOWN 11 | Classifier: Development Status :: 5 - Production/Stable 12 | Classifier: Intended Audience :: Developers 13 | Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) 14 | Classifier: Natural Language :: English 15 | Classifier: Programming Language :: Python 16 | Classifier: Programming Language :: Python :: 3 17 | Classifier: Programming Language :: Python :: 3.6 18 | Classifier: Programming Language :: Python :: 3.7 19 | Classifier: Programming Language :: Python :: 3.8 20 | Classifier: Programming Language :: Python :: 3.9 21 | Classifier: Programming Language :: Python :: 3.10 22 | Requires-Python: >=3.6 23 | License-File: LICENSE 24 | 25 | Certifi: Python SSL Certificates 26 | ================================ 27 | 28 | Certifi provides Mozilla's carefully curated collection of Root Certificates for 29 | validating the trustworthiness of SSL certificates while verifying the identity 30 | of TLS hosts. It has been extracted from the `Requests`_ project. 31 | 32 | Installation 33 | ------------ 34 | 35 | ``certifi`` is available on PyPI. Simply install it with ``pip``:: 36 | 37 | $ pip install certifi 38 | 39 | Usage 40 | ----- 41 | 42 | To reference the installed certificate authority (CA) bundle, you can use the 43 | built-in function:: 44 | 45 | >>> import certifi 46 | 47 | >>> certifi.where() 48 | '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' 49 | 50 | Or from the command line:: 51 | 52 | $ python -m certifi 53 | /usr/local/lib/python3.7/site-packages/certifi/cacert.pem 54 | 55 | Enjoy! 56 | 57 | 1024-bit Root Certificates 58 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 | 60 | Browsers and certificate authorities have concluded that 1024-bit keys are 61 | unacceptably weak for certificates, particularly root certificates. For this 62 | reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its 63 | bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) 64 | certificate from the same CA. Because Mozilla removed these certificates from 65 | its bundle, ``certifi`` removed them as well. 66 | 67 | In previous versions, ``certifi`` provided the ``certifi.old_where()`` function 68 | to intentionally re-add the 1024-bit roots back into your bundle. This was not 69 | recommended in production and therefore was removed at the end of 2018. 70 | 71 | .. _`Requests`: https://requests.readthedocs.io/en/master/ 72 | 73 | Addition/Removal of Certificates 74 | -------------------------------- 75 | 76 | Certifi does not support any addition/removal or other modification of the 77 | CA trust store content. This project is intended to provide a reliable and 78 | highly portable root of trust to python deployments. Look to upstream projects 79 | for methods to use alternate trust. 80 | 81 | 82 | -------------------------------------------------------------------------------- /html/signin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Sign in Page 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |
26 | bootstrap 4 login page 27 |
28 |
29 |
30 | 31 | 34 | 35 | 36 |

Sign In

37 |
38 |
39 | 40 | 41 |
42 | Your email is invalid 43 |
44 |
45 | 46 |
47 | 48 | 49 |
50 | Password is required 51 |
52 |
53 | 54 | 55 |
56 | 59 |
60 |
61 | Don't have an account? Register 62 | 63 |
64 |
65 | Forgot account? Reset Password 66 |
67 | 68 | 69 | 70 | 71 |
72 |
73 |
74 | 77 |
78 | This App Based on AWS Serverless Architecture 79 |
80 |
81 |
82 |
83 |
84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/structures.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | requests.structures 5 | ~~~~~~~~~~~~~~~~~~~ 6 | 7 | Data structures that power Requests. 8 | """ 9 | 10 | from collections import OrderedDict 11 | 12 | from .compat import Mapping, MutableMapping 13 | 14 | 15 | class CaseInsensitiveDict(MutableMapping): 16 | """A case-insensitive ``dict``-like object. 17 | 18 | Implements all methods and operations of 19 | ``MutableMapping`` as well as dict's ``copy``. Also 20 | provides ``lower_items``. 21 | 22 | All keys are expected to be strings. The structure remembers the 23 | case of the last key to be set, and ``iter(instance)``, 24 | ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` 25 | will contain case-sensitive keys. However, querying and contains 26 | testing is case insensitive:: 27 | 28 | cid = CaseInsensitiveDict() 29 | cid['Accept'] = 'application/json' 30 | cid['aCCEPT'] == 'application/json' # True 31 | list(cid) == ['Accept'] # True 32 | 33 | For example, ``headers['content-encoding']`` will return the 34 | value of a ``'Content-Encoding'`` response header, regardless 35 | of how the header name was originally stored. 36 | 37 | If the constructor, ``.update``, or equality comparison 38 | operations are given keys that have equal ``.lower()``s, the 39 | behavior is undefined. 40 | """ 41 | 42 | def __init__(self, data=None, **kwargs): 43 | self._store = OrderedDict() 44 | if data is None: 45 | data = {} 46 | self.update(data, **kwargs) 47 | 48 | def __setitem__(self, key, value): 49 | # Use the lowercased key for lookups, but store the actual 50 | # key alongside the value. 51 | self._store[key.lower()] = (key, value) 52 | 53 | def __getitem__(self, key): 54 | return self._store[key.lower()][1] 55 | 56 | def __delitem__(self, key): 57 | del self._store[key.lower()] 58 | 59 | def __iter__(self): 60 | return (casedkey for casedkey, mappedvalue in self._store.values()) 61 | 62 | def __len__(self): 63 | return len(self._store) 64 | 65 | def lower_items(self): 66 | """Like iteritems(), but with all lowercase keys.""" 67 | return ( 68 | (lowerkey, keyval[1]) 69 | for (lowerkey, keyval) 70 | in self._store.items() 71 | ) 72 | 73 | def __eq__(self, other): 74 | if isinstance(other, Mapping): 75 | other = CaseInsensitiveDict(other) 76 | else: 77 | return NotImplemented 78 | # Compare insensitively 79 | return dict(self.lower_items()) == dict(other.lower_items()) 80 | 81 | # Copy is required 82 | def copy(self): 83 | return CaseInsensitiveDict(self._store.values()) 84 | 85 | def __repr__(self): 86 | return str(dict(self.items())) 87 | 88 | 89 | class LookupDict(dict): 90 | """Dictionary lookup object.""" 91 | 92 | def __init__(self, name=None): 93 | self.name = name 94 | super(LookupDict, self).__init__() 95 | 96 | def __repr__(self): 97 | return '' % (self.name) 98 | 99 | def __getitem__(self, key): 100 | # We allow fall-through here, so values default to None 101 | 102 | return self.__dict__.get(key, None) 103 | 104 | def get(self, key, default=None): 105 | return self.__dict__.get(key, default) 106 | -------------------------------------------------------------------------------- /html/verify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Verify Page 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |
26 | bootstrap 4 login page 27 |
28 |
29 |
30 | 31 | 32 | 33 | 34 |

Verify

35 |
36 |
37 | 38 | 39 |
40 | Your email is invalid 41 |
42 |
43 | 44 |
45 | 46 | 47 |
48 | Verify Code is required 49 |
50 |
51 | 52 | 53 |
54 | 57 |
58 |
59 | Already have an account? Login 60 |
61 |
62 |
63 |
64 | 67 |
68 | This App Based on AWS Serverless Architecture 69 |
70 |
71 | 72 |
73 |
74 |
75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /scheduler-lambda/app/charset_normalizer/legacy.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | from typing import Dict, Optional, Union 3 | 4 | from .api import from_bytes, from_fp, from_path, normalize 5 | from .constant import CHARDET_CORRESPONDENCE 6 | from .models import CharsetMatch, CharsetMatches 7 | 8 | 9 | def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: 10 | """ 11 | chardet legacy method 12 | Detect the encoding of the given byte string. It should be mostly backward-compatible. 13 | Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) 14 | This function is deprecated and should be used to migrate your project easily, consult the documentation for 15 | further information. Not planned for removal. 16 | 17 | :param byte_str: The byte sequence to examine. 18 | """ 19 | if not isinstance(byte_str, (bytearray, bytes)): 20 | raise TypeError( # pragma: nocover 21 | "Expected object of type bytes or bytearray, got: " 22 | "{0}".format(type(byte_str)) 23 | ) 24 | 25 | if isinstance(byte_str, bytearray): 26 | byte_str = bytes(byte_str) 27 | 28 | r = from_bytes(byte_str).best() 29 | 30 | encoding = r.encoding if r is not None else None 31 | language = r.language if r is not None and r.language != "Unknown" else "" 32 | confidence = 1.0 - r.chaos if r is not None else None 33 | 34 | # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process 35 | # but chardet does return 'utf-8-sig' and it is a valid codec name. 36 | if r is not None and encoding == "utf_8" and r.bom: 37 | encoding += "_sig" 38 | 39 | return { 40 | "encoding": encoding 41 | if encoding not in CHARDET_CORRESPONDENCE 42 | else CHARDET_CORRESPONDENCE[encoding], 43 | "language": language, 44 | "confidence": confidence, 45 | } 46 | 47 | 48 | class CharsetNormalizerMatch(CharsetMatch): 49 | pass 50 | 51 | 52 | class CharsetNormalizerMatches(CharsetMatches): 53 | @staticmethod 54 | def from_fp(*args, **kwargs): # type: ignore 55 | warnings.warn( # pragma: nocover 56 | "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " 57 | "and scheduled to be removed in 3.0", 58 | DeprecationWarning, 59 | ) 60 | return from_fp(*args, **kwargs) # pragma: nocover 61 | 62 | @staticmethod 63 | def from_bytes(*args, **kwargs): # type: ignore 64 | warnings.warn( # pragma: nocover 65 | "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " 66 | "and scheduled to be removed in 3.0", 67 | DeprecationWarning, 68 | ) 69 | return from_bytes(*args, **kwargs) # pragma: nocover 70 | 71 | @staticmethod 72 | def from_path(*args, **kwargs): # type: ignore 73 | warnings.warn( # pragma: nocover 74 | "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " 75 | "and scheduled to be removed in 3.0", 76 | DeprecationWarning, 77 | ) 78 | return from_path(*args, **kwargs) # pragma: nocover 79 | 80 | @staticmethod 81 | def normalize(*args, **kwargs): # type: ignore 82 | warnings.warn( # pragma: nocover 83 | "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " 84 | "and scheduled to be removed in 3.0", 85 | DeprecationWarning, 86 | ) 87 | return normalize(*args, **kwargs) # pragma: nocover 88 | 89 | 90 | class CharsetDetector(CharsetNormalizerMatches): 91 | pass 92 | 93 | 94 | class CharsetDoctor(CharsetNormalizerMatches): 95 | pass 96 | -------------------------------------------------------------------------------- /html/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.5.0 (https://getbootstrap.com/) 3 | * Copyright 2011-2020 The Bootstrap Authors 4 | * Copyright 2011-2020 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /scheduler-lambda/app/idna/codec.py: -------------------------------------------------------------------------------- 1 | from .core import encode, decode, alabel, ulabel, IDNAError 2 | import codecs 3 | import re 4 | from typing import Tuple, Optional 5 | 6 | _unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') 7 | 8 | class Codec(codecs.Codec): 9 | 10 | def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]: 11 | if errors != 'strict': 12 | raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) 13 | 14 | if not data: 15 | return b"", 0 16 | 17 | return encode(data), len(data) 18 | 19 | def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: 20 | if errors != 'strict': 21 | raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) 22 | 23 | if not data: 24 | return '', 0 25 | 26 | return decode(data), len(data) 27 | 28 | class IncrementalEncoder(codecs.BufferedIncrementalEncoder): 29 | def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore 30 | if errors != 'strict': 31 | raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) 32 | 33 | if not data: 34 | return "", 0 35 | 36 | labels = _unicode_dots_re.split(data) 37 | trailing_dot = '' 38 | if labels: 39 | if not labels[-1]: 40 | trailing_dot = '.' 41 | del labels[-1] 42 | elif not final: 43 | # Keep potentially unfinished label until the next call 44 | del labels[-1] 45 | if labels: 46 | trailing_dot = '.' 47 | 48 | result = [] 49 | size = 0 50 | for label in labels: 51 | result.append(alabel(label)) 52 | if size: 53 | size += 1 54 | size += len(label) 55 | 56 | # Join with U+002E 57 | result_str = '.'.join(result) + trailing_dot # type: ignore 58 | size += len(trailing_dot) 59 | return result_str, size 60 | 61 | class IncrementalDecoder(codecs.BufferedIncrementalDecoder): 62 | def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore 63 | if errors != 'strict': 64 | raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) 65 | 66 | if not data: 67 | return ('', 0) 68 | 69 | labels = _unicode_dots_re.split(data) 70 | trailing_dot = '' 71 | if labels: 72 | if not labels[-1]: 73 | trailing_dot = '.' 74 | del labels[-1] 75 | elif not final: 76 | # Keep potentially unfinished label until the next call 77 | del labels[-1] 78 | if labels: 79 | trailing_dot = '.' 80 | 81 | result = [] 82 | size = 0 83 | for label in labels: 84 | result.append(ulabel(label)) 85 | if size: 86 | size += 1 87 | size += len(label) 88 | 89 | result_str = '.'.join(result) + trailing_dot 90 | size += len(trailing_dot) 91 | return (result_str, size) 92 | 93 | 94 | class StreamWriter(Codec, codecs.StreamWriter): 95 | pass 96 | 97 | 98 | class StreamReader(Codec, codecs.StreamReader): 99 | pass 100 | 101 | 102 | def getregentry() -> codecs.CodecInfo: 103 | # Compatibility as a search_function for codecs.register() 104 | return codecs.CodecInfo( 105 | name='idna', 106 | encode=Codec().encode, # type: ignore 107 | decode=Codec().decode, # type: ignore 108 | incrementalencoder=IncrementalEncoder, 109 | incrementaldecoder=IncrementalDecoder, 110 | streamwriter=StreamWriter, 111 | streamreader=StreamReader, 112 | ) 113 | -------------------------------------------------------------------------------- /html/css/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/response.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect 4 | 5 | from ..exceptions import HeaderParsingError 6 | from ..packages.six.moves import http_client as httplib 7 | 8 | 9 | def is_fp_closed(obj): 10 | """ 11 | Checks whether a given file-like object is closed. 12 | 13 | :param obj: 14 | The file-like object to check. 15 | """ 16 | 17 | try: 18 | # Check `isclosed()` first, in case Python3 doesn't set `closed`. 19 | # GH Issue #928 20 | return obj.isclosed() 21 | except AttributeError: 22 | pass 23 | 24 | try: 25 | # Check via the official file-like-object way. 26 | return obj.closed 27 | except AttributeError: 28 | pass 29 | 30 | try: 31 | # Check if the object is a container for another file-like object that 32 | # gets released on exhaustion (e.g. HTTPResponse). 33 | return obj.fp is None 34 | except AttributeError: 35 | pass 36 | 37 | raise ValueError("Unable to determine whether fp is closed.") 38 | 39 | 40 | def assert_header_parsing(headers): 41 | """ 42 | Asserts whether all headers have been successfully parsed. 43 | Extracts encountered errors from the result of parsing headers. 44 | 45 | Only works on Python 3. 46 | 47 | :param http.client.HTTPMessage headers: Headers to verify. 48 | 49 | :raises urllib3.exceptions.HeaderParsingError: 50 | If parsing errors are found. 51 | """ 52 | 53 | # This will fail silently if we pass in the wrong kind of parameter. 54 | # To make debugging easier add an explicit check. 55 | if not isinstance(headers, httplib.HTTPMessage): 56 | raise TypeError("expected httplib.Message, got {0}.".format(type(headers))) 57 | 58 | defects = getattr(headers, "defects", None) 59 | get_payload = getattr(headers, "get_payload", None) 60 | 61 | unparsed_data = None 62 | if get_payload: 63 | # get_payload is actually email.message.Message.get_payload; 64 | # we're only interested in the result if it's not a multipart message 65 | if not headers.is_multipart(): 66 | payload = get_payload() 67 | 68 | if isinstance(payload, (bytes, str)): 69 | unparsed_data = payload 70 | if defects: 71 | # httplib is assuming a response body is available 72 | # when parsing headers even when httplib only sends 73 | # header data to parse_headers() This results in 74 | # defects on multipart responses in particular. 75 | # See: https://github.com/urllib3/urllib3/issues/800 76 | 77 | # So we ignore the following defects: 78 | # - StartBoundaryNotFoundDefect: 79 | # The claimed start boundary was never found. 80 | # - MultipartInvariantViolationDefect: 81 | # A message claimed to be a multipart but no subparts were found. 82 | defects = [ 83 | defect 84 | for defect in defects 85 | if not isinstance( 86 | defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) 87 | ) 88 | ] 89 | 90 | if defects or unparsed_data: 91 | raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) 92 | 93 | 94 | def is_response_to_head(response): 95 | """ 96 | Checks whether the request of a response has been a HEAD-request. 97 | Handles the quirks of AppEngine. 98 | 99 | :param http.client.HTTPResponse response: 100 | Response to check if the originating request 101 | used 'HEAD' as a method. 102 | """ 103 | # FIXME: Can we do this somehow without accessing private httplib _method? 104 | method = response._method 105 | if isinstance(method, int): # Platform-specific: Appengine 106 | return method == 3 107 | return method.upper() == "HEAD" 108 | -------------------------------------------------------------------------------- /scheduler-lambda/scheduler-lambda.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "eu-west-1" 3 | } 4 | resource "aws_iam_role" "lambda_role" { 5 | name = "instance_scheduler_daily_role" 6 | assume_role_policy = < 0: 19 | return float(o) 20 | else: 21 | return int(o) 22 | return super(DecimalEncoder, self).default(o) 23 | 24 | def add_record_ec2(item): 25 | return query_table.put_item(Item=item) 26 | 27 | def get_record_ec2(email,item): 28 | response = query_table.query( 29 | KeyConditionExpression=Key("email").eq(email) & Key("created").eq(item)) 30 | 31 | client = boto3.client('kms', region_name = region_name, verify=True) 32 | secret = client.decrypt( 33 | CiphertextBlob=(base64.b64decode(response['Items'][0]['secret'])), 34 | KeyId=kms_key_id 35 | ) 36 | 37 | decryptedPass = secret['Plaintext'].decode('UTF-8') 38 | response['Items'][0]['secret'] = decryptedPass 39 | return response['Items'] 40 | 41 | def get_records_ec2(email,created=None): 42 | z = {} 43 | x = [] 44 | z['Items'] = [] 45 | response= query_table.query( 46 | KeyConditionExpression=Key("email").eq(email) 47 | ) 48 | 49 | for i in response[u'Items']: 50 | if created=='ec2profile_apps' and 'ec2profile' in i['created']: 51 | x.append( json.loads(json.dumps(i, cls=DecimalEncoder))) 52 | elif created=='account' and 'account' in i['created']: 53 | x.append( json.loads(json.dumps(i, cls=DecimalEncoder))) 54 | 55 | elif not created and 'ec2profile' not in i['created'] and 'account' not in i['created']: 56 | x.append( json.loads(json.dumps(i, cls=DecimalEncoder))) 57 | 58 | z['Items'] = x 59 | 60 | # delete any key named secret 61 | for i in range(len(z['Items'])): 62 | if 'secret' in (z['Items'][i]): 63 | del z['Items'][i]['secret'] 64 | 65 | return z 66 | 67 | def delete_record_ec2(email,created): 68 | return query_table.delete_item( 69 | Key={ 70 | 'email': email, 71 | 'created' : created 72 | } 73 | ) 74 | 75 | def delete_records_ec2(email): 76 | items= query_table.query( 77 | KeyConditionExpression=Key("email").eq(email) 78 | ) 79 | for i in range(len(items['Items'])): 80 | query_table.delete_item( 81 | Key={ 82 | 'email': email, 83 | 'created' : items['Items'][i]['created'] 84 | } 85 | ) 86 | return True 87 | 88 | def update_record_ec2(email,created,update_item): 89 | return query_table.update_item( 90 | Key={'email': email, 'created': created 91 | }, 92 | UpdateExpression='SET dtime = :dtime, days = :days, ec2id = :ec2id, notify = :notify, profile = :profile, regi0n = :regi0n, title = :title, service = :service, provider = :provider, todo = :todo', 93 | ExpressionAttributeValues={ 94 | ':dtime': update_item['dtime'], 95 | ':days': update_item['days'], 96 | ':ec2id': update_item['ec2id'], 97 | ':notify': update_item['notify'], 98 | ':profile': update_item['profile'], 99 | ':regi0n': update_item['regi0n'], 100 | ':title': update_item['title'], 101 | ':service': update_item['service'], 102 | ':provider': update_item['provider'], 103 | ':todo': update_item['todo'] 104 | } 105 | ) 106 | 107 | def webhook_url(email,webhook,webhook_url): 108 | return query_table.update_item( 109 | Key={'email': email, 'created': 'account' 110 | }, 111 | UpdateExpression='SET webhook = :webhook, webhook_url = :webhook_url', 112 | ExpressionAttributeValues={ 113 | ':webhook': webhook, 114 | ':webhook_url': webhook_url 115 | } 116 | ) -------------------------------------------------------------------------------- /cloudfront-s3-sync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Change the region 4 | region="eu-west-1" 5 | # Change the bucket with a unique name 6 | bucket_name="instance-scheduler-2022" 7 | 8 | website_directory="./html" 9 | 10 | # Create a new bucket 11 | aws s3 mb --region $region "s3://$bucket_name" 12 | 13 | # Enable public access to the bucket 14 | aws s3api put-public-access-block \ 15 | --bucket $bucket_name \ 16 | --public-access-block-configuration "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false" 17 | 18 | # Update the bucket policy for public read access: 19 | aws s3api put-bucket-policy --bucket $bucket_name --policy "{ 20 | \"Version\": \"2012-10-17\", 21 | \"Statement\": [ 22 | { 23 | \"Sid\": \"PublicReadGetObject\", 24 | \"Effect\": \"Allow\", 25 | \"Principal\": \"*\", 26 | \"Action\": \"s3:GetObject\", 27 | \"Resource\": \"arn:aws:s3:::$bucket_name/*\" 28 | } 29 | ] 30 | }" 31 | 32 | # Enable the s3 bucket to host an `index` and `error` html page 33 | aws s3 website "s3://$bucket_name" --index-document index.html --error-document index.html 34 | 35 | # Upload you website 36 | aws s3 sync $website_directory "s3://$bucket_name/" 37 | 38 | # Bucket URL 39 | echo "curl http://$bucket_name.s3-website.$region.amazonaws.com" 40 | 41 | # CloudFront 42 | aws cloudfront create-distribution --cli-input-json ' 43 | { 44 | "DistributionConfig": { 45 | "Comment": "", 46 | "CacheBehaviors": { 47 | "Quantity": 0 48 | }, 49 | "Logging": { 50 | "Bucket": "", 51 | "Prefix": "", 52 | "Enabled": false, 53 | "IncludeCookies": false 54 | }, 55 | "Origins": { 56 | "Items": [ 57 | { 58 | "OriginPath": "", 59 | "CustomOriginConfig": { 60 | "OriginProtocolPolicy": "http-only", 61 | "HTTPPort": 80, 62 | "HTTPSPort": 443 63 | }, 64 | "Id": "'$bucket_name.s3-website.$region.amazonaws.com'", 65 | "DomainName": "'$bucket_name.s3-website.$region.amazonaws.com'" 66 | } 67 | ], 68 | "Quantity": 1 69 | }, 70 | "DefaultRootObject": "index.html", 71 | "PriceClass": "PriceClass_All", 72 | "Enabled": true, 73 | "DefaultCacheBehavior": { 74 | "TrustedSigners": { 75 | "Enabled": false, 76 | "Quantity": 0 77 | }, 78 | "TargetOriginId": "'$bucket_name.s3-website.$region.amazonaws.com'", 79 | "ViewerProtocolPolicy": "redirect-to-https", 80 | "ForwardedValues": { 81 | "Headers": { 82 | "Quantity": 0 83 | }, 84 | "Cookies": { 85 | "Forward": "none" 86 | }, 87 | "QueryString": false 88 | }, 89 | "SmoothStreaming": false, 90 | "AllowedMethods": { 91 | "Items": [ 92 | "GET", 93 | "HEAD" 94 | ], 95 | "CachedMethods": { 96 | "Items": [ 97 | "GET", 98 | "HEAD" 99 | ], 100 | "Quantity": 2 101 | }, 102 | "Quantity": 2 103 | }, 104 | "MinTTL": 0 105 | }, 106 | "CallerReference": "Mon May 25 21:39:53 CEST 2015", 107 | "CustomErrorResponses": { 108 | "Quantity": 0 109 | }, 110 | "Restrictions": { 111 | "GeoRestriction": { 112 | "RestrictionType": "none", 113 | "Quantity": 0 114 | } 115 | } 116 | } 117 | }' 118 | 119 | cloudfrontDomainName="$(aws cloudfront list-distributions --query "DistributionList.Items[*].{domainname:DomainName,origin:Origins.Items[0].DomainName}[?origin=='$bucket_name.s3-website.$region.amazonaws.com'].domainname" --output text)" 120 | echo "########################################################################" 121 | echo "Click on https://$cloudfrontDomainName" 122 | echo "CloudFront takes around 5 minutes to be deployed" 123 | echo "########################################################################" 124 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/help.py: -------------------------------------------------------------------------------- 1 | """Module containing bug report helper(s).""" 2 | from __future__ import print_function 3 | 4 | import json 5 | import platform 6 | import sys 7 | import ssl 8 | 9 | import idna 10 | import urllib3 11 | 12 | from . import __version__ as requests_version 13 | 14 | try: 15 | import charset_normalizer 16 | except ImportError: 17 | charset_normalizer = None 18 | 19 | try: 20 | import chardet 21 | except ImportError: 22 | chardet = None 23 | 24 | try: 25 | from urllib3.contrib import pyopenssl 26 | except ImportError: 27 | pyopenssl = None 28 | OpenSSL = None 29 | cryptography = None 30 | else: 31 | import OpenSSL 32 | import cryptography 33 | 34 | 35 | def _implementation(): 36 | """Return a dict with the Python implementation and version. 37 | 38 | Provide both the name and the version of the Python implementation 39 | currently running. For example, on CPython 2.7.5 it will return 40 | {'name': 'CPython', 'version': '2.7.5'}. 41 | 42 | This function works best on CPython and PyPy: in particular, it probably 43 | doesn't work for Jython or IronPython. Future investigation should be done 44 | to work out the correct shape of the code for those platforms. 45 | """ 46 | implementation = platform.python_implementation() 47 | 48 | if implementation == 'CPython': 49 | implementation_version = platform.python_version() 50 | elif implementation == 'PyPy': 51 | implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, 52 | sys.pypy_version_info.minor, 53 | sys.pypy_version_info.micro) 54 | if sys.pypy_version_info.releaselevel != 'final': 55 | implementation_version = ''.join([ 56 | implementation_version, sys.pypy_version_info.releaselevel 57 | ]) 58 | elif implementation == 'Jython': 59 | implementation_version = platform.python_version() # Complete Guess 60 | elif implementation == 'IronPython': 61 | implementation_version = platform.python_version() # Complete Guess 62 | else: 63 | implementation_version = 'Unknown' 64 | 65 | return {'name': implementation, 'version': implementation_version} 66 | 67 | 68 | def info(): 69 | """Generate information for a bug report.""" 70 | try: 71 | platform_info = { 72 | 'system': platform.system(), 73 | 'release': platform.release(), 74 | } 75 | except IOError: 76 | platform_info = { 77 | 'system': 'Unknown', 78 | 'release': 'Unknown', 79 | } 80 | 81 | implementation_info = _implementation() 82 | urllib3_info = {'version': urllib3.__version__} 83 | charset_normalizer_info = {'version': None} 84 | chardet_info = {'version': None} 85 | if charset_normalizer: 86 | charset_normalizer_info = {'version': charset_normalizer.__version__} 87 | if chardet: 88 | chardet_info = {'version': chardet.__version__} 89 | 90 | pyopenssl_info = { 91 | 'version': None, 92 | 'openssl_version': '', 93 | } 94 | if OpenSSL: 95 | pyopenssl_info = { 96 | 'version': OpenSSL.__version__, 97 | 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, 98 | } 99 | cryptography_info = { 100 | 'version': getattr(cryptography, '__version__', ''), 101 | } 102 | idna_info = { 103 | 'version': getattr(idna, '__version__', ''), 104 | } 105 | 106 | system_ssl = ssl.OPENSSL_VERSION_NUMBER 107 | system_ssl_info = { 108 | 'version': '%x' % system_ssl if system_ssl is not None else '' 109 | } 110 | 111 | return { 112 | 'platform': platform_info, 113 | 'implementation': implementation_info, 114 | 'system_ssl': system_ssl_info, 115 | 'using_pyopenssl': pyopenssl is not None, 116 | 'using_charset_normalizer': chardet is None, 117 | 'pyOpenSSL': pyopenssl_info, 118 | 'urllib3': urllib3_info, 119 | 'chardet': chardet_info, 120 | 'charset_normalizer': charset_normalizer_info, 121 | 'cryptography': cryptography_info, 122 | 'idna': idna_info, 123 | 'requests': { 124 | 'version': requests_version, 125 | }, 126 | } 127 | 128 | 129 | def main(): 130 | """Pretty-print the bug information as JSON.""" 131 | print(json.dumps(info(), sort_keys=True, indent=2)) 132 | 133 | 134 | if __name__ == '__main__': 135 | main() 136 | -------------------------------------------------------------------------------- /html/reset.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Reset Password 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |
26 | bootstrap 4 login page 27 |
28 |
29 |
30 | 31 | 32 | 33 | 34 |

Reset Password

35 |
36 |
37 | 38 | 39 |
40 | Your email is invalid 41 |
42 |
43 | 44 |
45 | 46 | 47 |
48 | Password is required 49 |
50 |
51 | 52 |
53 | 54 | 55 |
56 | Confirm Password is required 57 |
58 |
59 | 60 | 61 | 62 |
63 | 66 |
67 |
68 | Already have an account? Login 69 |
70 |
71 | Register Login 72 |
73 |
74 |
75 |
76 | 79 |
80 |
81 |
82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests/status_codes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | r""" 4 | The ``codes`` object defines a mapping from common names for HTTP statuses 5 | to their numerical codes, accessible either as attributes or as dictionary 6 | items. 7 | 8 | Example:: 9 | 10 | >>> import requests 11 | >>> requests.codes['temporary_redirect'] 12 | 307 13 | >>> requests.codes.teapot 14 | 418 15 | >>> requests.codes['\o/'] 16 | 200 17 | 18 | Some codes have multiple names, and both upper- and lower-case versions of 19 | the names are allowed. For example, ``codes.ok``, ``codes.OK``, and 20 | ``codes.okay`` all correspond to the HTTP status code 200. 21 | """ 22 | 23 | from .structures import LookupDict 24 | 25 | _codes = { 26 | 27 | # Informational. 28 | 100: ('continue',), 29 | 101: ('switching_protocols',), 30 | 102: ('processing',), 31 | 103: ('checkpoint',), 32 | 122: ('uri_too_long', 'request_uri_too_long'), 33 | 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), 34 | 201: ('created',), 35 | 202: ('accepted',), 36 | 203: ('non_authoritative_info', 'non_authoritative_information'), 37 | 204: ('no_content',), 38 | 205: ('reset_content', 'reset'), 39 | 206: ('partial_content', 'partial'), 40 | 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), 41 | 208: ('already_reported',), 42 | 226: ('im_used',), 43 | 44 | # Redirection. 45 | 300: ('multiple_choices',), 46 | 301: ('moved_permanently', 'moved', '\\o-'), 47 | 302: ('found',), 48 | 303: ('see_other', 'other'), 49 | 304: ('not_modified',), 50 | 305: ('use_proxy',), 51 | 306: ('switch_proxy',), 52 | 307: ('temporary_redirect', 'temporary_moved', 'temporary'), 53 | 308: ('permanent_redirect', 54 | 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 55 | 56 | # Client Error. 57 | 400: ('bad_request', 'bad'), 58 | 401: ('unauthorized',), 59 | 402: ('payment_required', 'payment'), 60 | 403: ('forbidden',), 61 | 404: ('not_found', '-o-'), 62 | 405: ('method_not_allowed', 'not_allowed'), 63 | 406: ('not_acceptable',), 64 | 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), 65 | 408: ('request_timeout', 'timeout'), 66 | 409: ('conflict',), 67 | 410: ('gone',), 68 | 411: ('length_required',), 69 | 412: ('precondition_failed', 'precondition'), 70 | 413: ('request_entity_too_large',), 71 | 414: ('request_uri_too_large',), 72 | 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), 73 | 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 74 | 417: ('expectation_failed',), 75 | 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), 76 | 421: ('misdirected_request',), 77 | 422: ('unprocessable_entity', 'unprocessable'), 78 | 423: ('locked',), 79 | 424: ('failed_dependency', 'dependency'), 80 | 425: ('unordered_collection', 'unordered'), 81 | 426: ('upgrade_required', 'upgrade'), 82 | 428: ('precondition_required', 'precondition'), 83 | 429: ('too_many_requests', 'too_many'), 84 | 431: ('header_fields_too_large', 'fields_too_large'), 85 | 444: ('no_response', 'none'), 86 | 449: ('retry_with', 'retry'), 87 | 450: ('blocked_by_windows_parental_controls', 'parental_controls'), 88 | 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 89 | 499: ('client_closed_request',), 90 | 91 | # Server Error. 92 | 500: ('internal_server_error', 'server_error', '/o\\', '✗'), 93 | 501: ('not_implemented',), 94 | 502: ('bad_gateway',), 95 | 503: ('service_unavailable', 'unavailable'), 96 | 504: ('gateway_timeout',), 97 | 505: ('http_version_not_supported', 'http_version'), 98 | 506: ('variant_also_negotiates',), 99 | 507: ('insufficient_storage',), 100 | 509: ('bandwidth_limit_exceeded', 'bandwidth'), 101 | 510: ('not_extended',), 102 | 511: ('network_authentication_required', 'network_auth', 'network_authentication'), 103 | } 104 | 105 | codes = LookupDict(name='status_codes') 106 | 107 | def _init(): 108 | for code, titles in _codes.items(): 109 | for title in titles: 110 | setattr(codes, title, code) 111 | if not title.startswith(('\\', '/')): 112 | setattr(codes, title.upper(), code) 113 | 114 | def doc(code): 115 | names = ', '.join('``%s``' % n for n in _codes[code]) 116 | return '* %d: %s' % (code, names) 117 | 118 | global __doc__ 119 | __doc__ = (__doc__ + '\n' + 120 | '\n'.join(doc(code) for code in sorted(_codes)) 121 | if __doc__ is not None else None) 122 | 123 | _init() 124 | -------------------------------------------------------------------------------- /html/signup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Login Page 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |
26 | bootstrap 4 login page 27 |
28 |
29 |
30 | 33 |

Register

34 |
35 | 36 |
37 | 38 | 39 |
40 | Your email is invalid 41 |
42 |
43 | 44 |
45 | 46 | 47 |
48 | Password is required 49 |
50 |
51 | 52 |
53 | 54 | 55 |
56 | Confirm Password is required 57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | 65 |
66 | You must agree with our Terms and Conditions 67 |
68 |
69 |
70 | 71 |
72 | 75 |
76 |
77 | Already have an account? Login 78 |
79 |
80 | Forgot account? Reset Password 81 |
82 |
83 |
84 |
85 | 88 |
89 | This App Based on AWS Serverless Architecture 90 |
91 |
92 |
93 |
94 |
95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/request.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | from base64 import b64encode 4 | 5 | from ..exceptions import UnrewindableBodyError 6 | from ..packages.six import b, integer_types 7 | 8 | # Pass as a value within ``headers`` to skip 9 | # emitting some HTTP headers that are added automatically. 10 | # The only headers that are supported are ``Accept-Encoding``, 11 | # ``Host``, and ``User-Agent``. 12 | SKIP_HEADER = "@@@SKIP_HEADER@@@" 13 | SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) 14 | 15 | ACCEPT_ENCODING = "gzip,deflate" 16 | try: 17 | try: 18 | import brotlicffi as _unused_module_brotli # noqa: F401 19 | except ImportError: 20 | import brotli as _unused_module_brotli # noqa: F401 21 | except ImportError: 22 | pass 23 | else: 24 | ACCEPT_ENCODING += ",br" 25 | 26 | _FAILEDTELL = object() 27 | 28 | 29 | def make_headers( 30 | keep_alive=None, 31 | accept_encoding=None, 32 | user_agent=None, 33 | basic_auth=None, 34 | proxy_basic_auth=None, 35 | disable_cache=None, 36 | ): 37 | """ 38 | Shortcuts for generating request headers. 39 | 40 | :param keep_alive: 41 | If ``True``, adds 'connection: keep-alive' header. 42 | 43 | :param accept_encoding: 44 | Can be a boolean, list, or string. 45 | ``True`` translates to 'gzip,deflate'. 46 | List will get joined by comma. 47 | String will be used as provided. 48 | 49 | :param user_agent: 50 | String representing the user-agent you want, such as 51 | "python-urllib3/0.6" 52 | 53 | :param basic_auth: 54 | Colon-separated username:password string for 'authorization: basic ...' 55 | auth header. 56 | 57 | :param proxy_basic_auth: 58 | Colon-separated username:password string for 'proxy-authorization: basic ...' 59 | auth header. 60 | 61 | :param disable_cache: 62 | If ``True``, adds 'cache-control: no-cache' header. 63 | 64 | Example:: 65 | 66 | >>> make_headers(keep_alive=True, user_agent="Batman/1.0") 67 | {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} 68 | >>> make_headers(accept_encoding=True) 69 | {'accept-encoding': 'gzip,deflate'} 70 | """ 71 | headers = {} 72 | if accept_encoding: 73 | if isinstance(accept_encoding, str): 74 | pass 75 | elif isinstance(accept_encoding, list): 76 | accept_encoding = ",".join(accept_encoding) 77 | else: 78 | accept_encoding = ACCEPT_ENCODING 79 | headers["accept-encoding"] = accept_encoding 80 | 81 | if user_agent: 82 | headers["user-agent"] = user_agent 83 | 84 | if keep_alive: 85 | headers["connection"] = "keep-alive" 86 | 87 | if basic_auth: 88 | headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8") 89 | 90 | if proxy_basic_auth: 91 | headers["proxy-authorization"] = "Basic " + b64encode( 92 | b(proxy_basic_auth) 93 | ).decode("utf-8") 94 | 95 | if disable_cache: 96 | headers["cache-control"] = "no-cache" 97 | 98 | return headers 99 | 100 | 101 | def set_file_position(body, pos): 102 | """ 103 | If a position is provided, move file to that point. 104 | Otherwise, we'll attempt to record a position for future use. 105 | """ 106 | if pos is not None: 107 | rewind_body(body, pos) 108 | elif getattr(body, "tell", None) is not None: 109 | try: 110 | pos = body.tell() 111 | except (IOError, OSError): 112 | # This differentiates from None, allowing us to catch 113 | # a failed `tell()` later when trying to rewind the body. 114 | pos = _FAILEDTELL 115 | 116 | return pos 117 | 118 | 119 | def rewind_body(body, body_pos): 120 | """ 121 | Attempt to rewind body to a certain position. 122 | Primarily used for request redirects and retries. 123 | 124 | :param body: 125 | File-like object that supports seek. 126 | 127 | :param int pos: 128 | Position to seek to in file. 129 | """ 130 | body_seek = getattr(body, "seek", None) 131 | if body_seek is not None and isinstance(body_pos, integer_types): 132 | try: 133 | body_seek(body_pos) 134 | except (IOError, OSError): 135 | raise UnrewindableBodyError( 136 | "An error occurred when rewinding request body for redirect/retry." 137 | ) 138 | elif body_pos is _FAILEDTELL: 139 | raise UnrewindableBodyError( 140 | "Unable to record file position for rewinding " 141 | "request body during a redirect/retry." 142 | ) 143 | else: 144 | raise ValueError( 145 | "body_pos must be of type integer, instead it was %s." % type(body_pos) 146 | ) 147 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/contrib/ntlmpool.py: -------------------------------------------------------------------------------- 1 | """ 2 | NTLM authenticating pool, contributed by erikcederstran 3 | 4 | Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 5 | """ 6 | from __future__ import absolute_import 7 | 8 | import warnings 9 | from logging import getLogger 10 | 11 | from ntlm import ntlm 12 | 13 | from .. import HTTPSConnectionPool 14 | from ..packages.six.moves.http_client import HTTPSConnection 15 | 16 | warnings.warn( 17 | "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed " 18 | "in urllib3 v2.0 release, urllib3 is not able to support it properly due " 19 | "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. " 20 | "If you are a user of this module please comment in the mentioned issue.", 21 | DeprecationWarning, 22 | ) 23 | 24 | log = getLogger(__name__) 25 | 26 | 27 | class NTLMConnectionPool(HTTPSConnectionPool): 28 | """ 29 | Implements an NTLM authentication version of an urllib3 connection pool 30 | """ 31 | 32 | scheme = "https" 33 | 34 | def __init__(self, user, pw, authurl, *args, **kwargs): 35 | """ 36 | authurl is a random URL on the server that is protected by NTLM. 37 | user is the Windows user, probably in the DOMAIN\\username format. 38 | pw is the password for the user. 39 | """ 40 | super(NTLMConnectionPool, self).__init__(*args, **kwargs) 41 | self.authurl = authurl 42 | self.rawuser = user 43 | user_parts = user.split("\\", 1) 44 | self.domain = user_parts[0].upper() 45 | self.user = user_parts[1] 46 | self.pw = pw 47 | 48 | def _new_conn(self): 49 | # Performs the NTLM handshake that secures the connection. The socket 50 | # must be kept open while requests are performed. 51 | self.num_connections += 1 52 | log.debug( 53 | "Starting NTLM HTTPS connection no. %d: https://%s%s", 54 | self.num_connections, 55 | self.host, 56 | self.authurl, 57 | ) 58 | 59 | headers = {"Connection": "Keep-Alive"} 60 | req_header = "Authorization" 61 | resp_header = "www-authenticate" 62 | 63 | conn = HTTPSConnection(host=self.host, port=self.port) 64 | 65 | # Send negotiation message 66 | headers[req_header] = "NTLM %s" % ntlm.create_NTLM_NEGOTIATE_MESSAGE( 67 | self.rawuser 68 | ) 69 | log.debug("Request headers: %s", headers) 70 | conn.request("GET", self.authurl, None, headers) 71 | res = conn.getresponse() 72 | reshdr = dict(res.getheaders()) 73 | log.debug("Response status: %s %s", res.status, res.reason) 74 | log.debug("Response headers: %s", reshdr) 75 | log.debug("Response data: %s [...]", res.read(100)) 76 | 77 | # Remove the reference to the socket, so that it can not be closed by 78 | # the response object (we want to keep the socket open) 79 | res.fp = None 80 | 81 | # Server should respond with a challenge message 82 | auth_header_values = reshdr[resp_header].split(", ") 83 | auth_header_value = None 84 | for s in auth_header_values: 85 | if s[:5] == "NTLM ": 86 | auth_header_value = s[5:] 87 | if auth_header_value is None: 88 | raise Exception( 89 | "Unexpected %s response header: %s" % (resp_header, reshdr[resp_header]) 90 | ) 91 | 92 | # Send authentication message 93 | ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE( 94 | auth_header_value 95 | ) 96 | auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE( 97 | ServerChallenge, self.user, self.domain, self.pw, NegotiateFlags 98 | ) 99 | headers[req_header] = "NTLM %s" % auth_msg 100 | log.debug("Request headers: %s", headers) 101 | conn.request("GET", self.authurl, None, headers) 102 | res = conn.getresponse() 103 | log.debug("Response status: %s %s", res.status, res.reason) 104 | log.debug("Response headers: %s", dict(res.getheaders())) 105 | log.debug("Response data: %s [...]", res.read()[:100]) 106 | if res.status != 200: 107 | if res.status == 401: 108 | raise Exception("Server rejected request: wrong username or password") 109 | raise Exception("Wrong server response: %s %s" % (res.status, res.reason)) 110 | 111 | res.fp = None 112 | log.debug("Connection established") 113 | return conn 114 | 115 | def urlopen( 116 | self, 117 | method, 118 | url, 119 | body=None, 120 | headers=None, 121 | retries=3, 122 | redirect=True, 123 | assert_same_host=True, 124 | ): 125 | if headers is None: 126 | headers = {} 127 | headers["Connection"] = "Keep-Alive" 128 | return super(NTLMConnectionPool, self).urlopen( 129 | method, url, body, headers, retries, redirect, assert_same_host 130 | ) 131 | -------------------------------------------------------------------------------- /html/css/table.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #566787; 3 | background: #f5f5f5; 4 | font-family: 'Varela Round', sans-serif; 5 | font-size: 13px; 6 | } 7 | .table-responsive { 8 | margin: 30px 0; 9 | } 10 | .table-wrapper { 11 | background: #fff; 12 | padding: 20px 25px; 13 | margin: 30px 0; 14 | border-radius:1px; 15 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.247); 16 | } 17 | .table-title { 18 | padding-bottom: 15px; 19 | background: #435d7d; 20 | color: #fff; 21 | padding: 16px 30px; 22 | min-width: 100%; 23 | margin: -20px -25px 10px; 24 | border-radius: 3px 3px 0 0; 25 | } 26 | .table-title h2 { 27 | margin: 5px 0 0; 28 | font-size: 24px; 29 | } 30 | .table-title .btn-group { 31 | float: right; 32 | } 33 | .table-title .btn { 34 | color: #fff; 35 | float: right; 36 | font-size: 13px; 37 | border: none; 38 | min-width: 50px; 39 | border-radius: 2px; 40 | border: none; 41 | outline: none !important; 42 | margin-left: 10px; 43 | } 44 | .table-title .btn i { 45 | float: left; 46 | font-size: 21px; 47 | margin-right: 5px; 48 | } 49 | .table-title .btn span { 50 | float: left; 51 | margin-top: 2px; 52 | } 53 | table.table tr th, table.table tr td { 54 | border-color: #e9e9e9; 55 | padding: 4px 2.5px; 56 | vertical-align: middle; 57 | } 58 | table.table tr th:first-child { 59 | width: 60px; 60 | } 61 | table.table tr th:last-child { 62 | width: 100px; 63 | } 64 | table.table-striped tbody tr:nth-of-type(odd) { 65 | background-color: #fcfcfc; 66 | } 67 | table.table-striped.table-hover tbody tr:hover { 68 | background: #f5f5f5; 69 | } 70 | table.table th i { 71 | font-size: 13px; 72 | margin: 0 5px; 73 | cursor: pointer; 74 | } 75 | table.table td:last-child i { 76 | opacity: 0.9; 77 | font-size: 22px; 78 | margin: 0 5px; 79 | } 80 | table.table td a { 81 | font-weight: bold; 82 | color: #566787; 83 | display: inline-block; 84 | text-decoration: none; 85 | outline: none !important; 86 | } 87 | table.table td a:hover { 88 | color: #2196F3; 89 | } 90 | table.table td a.edit { 91 | color: #FFC107; 92 | } 93 | table.table td a.delete { 94 | color: #F44336; 95 | } 96 | table.table td i { 97 | font-size: 19px; 98 | } 99 | table.table .avatar { 100 | border-radius: 50%; 101 | vertical-align: middle; 102 | margin-right: 10px; 103 | } 104 | .pagination { 105 | float: right; 106 | margin: 0 0 5px; 107 | } 108 | .pagination li a { 109 | border: none; 110 | font-size: 13px; 111 | min-width: 30px; 112 | min-height: 30px; 113 | color: #999; 114 | margin: 0 2px; 115 | line-height: 30px; 116 | border-radius: 2px !important; 117 | text-align: center; 118 | padding: 0 6px; 119 | } 120 | .pagination li a:hover { 121 | color: #666; 122 | } 123 | .pagination li.active a, .pagination li.active a.page-link { 124 | background: #03A9F4; 125 | } 126 | .pagination li.active a:hover { 127 | background: #0397d6; 128 | } 129 | .pagination li.disabled i { 130 | color: #ccc; 131 | } 132 | .pagination li i { 133 | font-size: 16px; 134 | padding-top: 6px 135 | } 136 | .hint-text { 137 | float: left; 138 | margin-top: 10px; 139 | font-size: 13px; 140 | } 141 | /* Custom checkbox */ 142 | .custom-checkbox { 143 | position: relative; 144 | } 145 | .custom-checkbox input[type="checkbox"] { 146 | opacity: 0; 147 | position: absolute; 148 | margin: 5px 0 0 3px; 149 | z-index: 9; 150 | } 151 | .custom-checkbox label:before{ 152 | width: 18px; 153 | height: 18px; 154 | } 155 | .custom-checkbox label:before { 156 | content: ''; 157 | margin-right: 10px; 158 | display: inline-block; 159 | vertical-align: text-top; 160 | background: white; 161 | border: 1px solid #bbb; 162 | border-radius: 2px; 163 | box-sizing: border-box; 164 | z-index: 2; 165 | } 166 | .custom-checkbox input[type="checkbox"]:checked + label:after { 167 | content: ''; 168 | position: absolute; 169 | left: 6px; 170 | top: 3px; 171 | width: 6px; 172 | height: 11px; 173 | border: solid #000; 174 | border-width: 0 3px 3px 0; 175 | transform: inherit; 176 | z-index: 3; 177 | transform: rotateZ(45deg); 178 | } 179 | .custom-checkbox input[type="checkbox"]:checked + label:before { 180 | border-color: #03A9F4; 181 | background: #03A9F4; 182 | } 183 | .custom-checkbox input[type="checkbox"]:checked + label:after { 184 | border-color: #fff; 185 | } 186 | .custom-checkbox input[type="checkbox"]:disabled + label:before { 187 | color: #b8b8b8; 188 | cursor: auto; 189 | box-shadow: none; 190 | background: #ddd; 191 | } 192 | /* Modal styles */ 193 | .modal .modal-dialog { 194 | max-width: 400px; 195 | } 196 | .modal .modal-header, .modal .modal-body, .modal .modal-footer { 197 | padding: 20px 30px; 198 | } 199 | .modal .modal-content { 200 | border-radius: 3px; 201 | font-size: 14px; 202 | } 203 | .modal .modal-footer { 204 | background: #ecf0f1; 205 | border-radius: 0 0 3px 3px; 206 | } 207 | .modal .modal-title { 208 | display: inline-block; 209 | } 210 | .modal .form-control { 211 | border-radius: 2px; 212 | box-shadow: none; 213 | border-color: #dddddd; 214 | } 215 | .modal textarea.form-control { 216 | resize: vertical; 217 | } 218 | .modal .btn { 219 | border-radius: 2px; 220 | min-width: 100px; 221 | } 222 | .modal form label { 223 | font-weight: normal; 224 | } -------------------------------------------------------------------------------- /html/pass-verify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Verify Page 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |
26 | bootstrap 4 login page 27 |
28 |
29 |
30 | 31 | 32 | 33 | 34 |

Verify

35 |
36 |
37 | 38 | 39 |
40 | Your email is invalid 41 |
42 |
43 |
44 | 45 | 46 |
47 | Password is required 48 |
49 |
50 | 51 |
52 | 53 | 54 |
55 | Confirm Password is required 56 |
57 |
58 | 59 |
60 | 61 | 62 |
63 | Verify Code is required 64 |
65 |
66 | 67 | 68 |
69 | 72 |
73 |
74 | Already have an account? Login 75 |
76 |
77 |
78 |
79 | 82 |
83 | This App Based on AWS Serverless Architecture 84 |
85 |
86 | 87 |
88 |
89 | 90 | 91 | 92 | 93 |
94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /scheduler-lambda/app/requests-2.27.1.dist-info/METADATA: -------------------------------------------------------------------------------- 1 | Metadata-Version: 2.1 2 | Name: requests 3 | Version: 2.27.1 4 | Summary: Python HTTP for Humans. 5 | Home-page: https://requests.readthedocs.io 6 | Author: Kenneth Reitz 7 | Author-email: me@kennethreitz.org 8 | License: Apache 2.0 9 | Project-URL: Documentation, https://requests.readthedocs.io 10 | Project-URL: Source, https://github.com/psf/requests 11 | Platform: UNKNOWN 12 | Classifier: Development Status :: 5 - Production/Stable 13 | Classifier: Environment :: Web Environment 14 | Classifier: Intended Audience :: Developers 15 | Classifier: License :: OSI Approved :: Apache Software License 16 | Classifier: Natural Language :: English 17 | Classifier: Operating System :: OS Independent 18 | Classifier: Programming Language :: Python 19 | Classifier: Programming Language :: Python :: 2 20 | Classifier: Programming Language :: Python :: 2.7 21 | Classifier: Programming Language :: Python :: 3 22 | Classifier: Programming Language :: Python :: 3.6 23 | Classifier: Programming Language :: Python :: 3.7 24 | Classifier: Programming Language :: Python :: 3.8 25 | Classifier: Programming Language :: Python :: 3.9 26 | Classifier: Programming Language :: Python :: 3.10 27 | Classifier: Programming Language :: Python :: Implementation :: CPython 28 | Classifier: Programming Language :: Python :: Implementation :: PyPy 29 | Classifier: Topic :: Internet :: WWW/HTTP 30 | Classifier: Topic :: Software Development :: Libraries 31 | Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.* 32 | Description-Content-Type: text/markdown 33 | Requires-Dist: urllib3 (<1.27,>=1.21.1) 34 | Requires-Dist: certifi (>=2017.4.17) 35 | Requires-Dist: chardet (<5,>=3.0.2) ; python_version < "3" 36 | Requires-Dist: idna (<3,>=2.5) ; python_version < "3" 37 | Requires-Dist: charset-normalizer (~=2.0.0) ; python_version >= "3" 38 | Requires-Dist: idna (<4,>=2.5) ; python_version >= "3" 39 | Provides-Extra: security 40 | Provides-Extra: socks 41 | Requires-Dist: PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks' 42 | Requires-Dist: win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == 'socks' 43 | Provides-Extra: use_chardet_on_py3 44 | Requires-Dist: chardet (<5,>=3.0.2) ; extra == 'use_chardet_on_py3' 45 | 46 | # Requests 47 | 48 | **Requests** is a simple, yet elegant, HTTP library. 49 | 50 | ```python 51 | >>> import requests 52 | >>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) 53 | >>> r.status_code 54 | 200 55 | >>> r.headers['content-type'] 56 | 'application/json; charset=utf8' 57 | >>> r.encoding 58 | 'utf-8' 59 | >>> r.text 60 | '{"authenticated": true, ...' 61 | >>> r.json() 62 | {'authenticated': True, ...} 63 | ``` 64 | 65 | Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method! 66 | 67 | Requests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code. 68 | 69 | [![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) 70 | [![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests) 71 | [![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors) 72 | 73 | ## Installing Requests and Supported Versions 74 | 75 | Requests is available on PyPI: 76 | 77 | ```console 78 | $ python -m pip install requests 79 | ``` 80 | 81 | Requests officially supports Python 2.7 & 3.6+. 82 | 83 | ## Supported Features & Best–Practices 84 | 85 | Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today. 86 | 87 | - Keep-Alive & Connection Pooling 88 | - International Domains and URLs 89 | - Sessions with Cookie Persistence 90 | - Browser-style TLS/SSL Verification 91 | - Basic & Digest Authentication 92 | - Familiar `dict`–like Cookies 93 | - Automatic Content Decompression and Decoding 94 | - Multi-part File Uploads 95 | - SOCKS Proxy Support 96 | - Connection Timeouts 97 | - Streaming Downloads 98 | - Automatic honoring of `.netrc` 99 | - Chunked HTTP Requests 100 | 101 | ## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io) 102 | 103 | [![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io) 104 | 105 | ## Cloning the repository 106 | 107 | When cloning the Requests repository, you may need to add the `-c 108 | fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see 109 | [this issue](https://github.com/psf/requests/issues/2690) for more background): 110 | 111 | ```shell 112 | git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git 113 | ``` 114 | 115 | You can also apply this setting to your global Git config: 116 | 117 | ```shell 118 | git config --global fetch.fsck.badTimezone ignore 119 | ``` 120 | 121 | --- 122 | 123 | [![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf) 124 | 125 | 126 | -------------------------------------------------------------------------------- /scheduler-lambda/app/urllib3/util/connection.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | import socket 4 | 5 | from ..contrib import _appengine_environ 6 | from ..exceptions import LocationParseError 7 | from ..packages import six 8 | from .wait import NoWayToWaitForSocketError, wait_for_read 9 | 10 | 11 | def is_connection_dropped(conn): # Platform-specific 12 | """ 13 | Returns True if the connection is dropped and should be closed. 14 | 15 | :param conn: 16 | :class:`http.client.HTTPConnection` object. 17 | 18 | Note: For platforms like AppEngine, this will always return ``False`` to 19 | let the platform handle connection recycling transparently for us. 20 | """ 21 | sock = getattr(conn, "sock", False) 22 | if sock is False: # Platform-specific: AppEngine 23 | return False 24 | if sock is None: # Connection already closed (such as by httplib). 25 | return True 26 | try: 27 | # Returns True if readable, which here means it's been dropped 28 | return wait_for_read(sock, timeout=0.0) 29 | except NoWayToWaitForSocketError: # Platform-specific: AppEngine 30 | return False 31 | 32 | 33 | # This function is copied from socket.py in the Python 2.7 standard 34 | # library test suite. Added to its signature is only `socket_options`. 35 | # One additional modification is that we avoid binding to IPv6 servers 36 | # discovered in DNS if the system doesn't have IPv6 functionality. 37 | def create_connection( 38 | address, 39 | timeout=socket._GLOBAL_DEFAULT_TIMEOUT, 40 | source_address=None, 41 | socket_options=None, 42 | ): 43 | """Connect to *address* and return the socket object. 44 | 45 | Convenience function. Connect to *address* (a 2-tuple ``(host, 46 | port)``) and return the socket object. Passing the optional 47 | *timeout* parameter will set the timeout on the socket instance 48 | before attempting to connect. If no *timeout* is supplied, the 49 | global default timeout setting returned by :func:`socket.getdefaulttimeout` 50 | is used. If *source_address* is set it must be a tuple of (host, port) 51 | for the socket to bind as a source address before making the connection. 52 | An host of '' or port 0 tells the OS to use the default. 53 | """ 54 | 55 | host, port = address 56 | if host.startswith("["): 57 | host = host.strip("[]") 58 | err = None 59 | 60 | # Using the value from allowed_gai_family() in the context of getaddrinfo lets 61 | # us select whether to work with IPv4 DNS records, IPv6 records, or both. 62 | # The original create_connection function always returns all records. 63 | family = allowed_gai_family() 64 | 65 | try: 66 | host.encode("idna") 67 | except UnicodeError: 68 | return six.raise_from( 69 | LocationParseError(u"'%s', label empty or too long" % host), None 70 | ) 71 | 72 | for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): 73 | af, socktype, proto, canonname, sa = res 74 | sock = None 75 | try: 76 | sock = socket.socket(af, socktype, proto) 77 | 78 | # If provided, set socket level options before connecting. 79 | _set_socket_options(sock, socket_options) 80 | 81 | if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: 82 | sock.settimeout(timeout) 83 | if source_address: 84 | sock.bind(source_address) 85 | sock.connect(sa) 86 | return sock 87 | 88 | except socket.error as e: 89 | err = e 90 | if sock is not None: 91 | sock.close() 92 | sock = None 93 | 94 | if err is not None: 95 | raise err 96 | 97 | raise socket.error("getaddrinfo returns an empty list") 98 | 99 | 100 | def _set_socket_options(sock, options): 101 | if options is None: 102 | return 103 | 104 | for opt in options: 105 | sock.setsockopt(*opt) 106 | 107 | 108 | def allowed_gai_family(): 109 | """This function is designed to work in the context of 110 | getaddrinfo, where family=socket.AF_UNSPEC is the default and 111 | will perform a DNS search for both IPv6 and IPv4 records.""" 112 | 113 | family = socket.AF_INET 114 | if HAS_IPV6: 115 | family = socket.AF_UNSPEC 116 | return family 117 | 118 | 119 | def _has_ipv6(host): 120 | """Returns True if the system can bind an IPv6 address.""" 121 | sock = None 122 | has_ipv6 = False 123 | 124 | # App Engine doesn't support IPV6 sockets and actually has a quota on the 125 | # number of sockets that can be used, so just early out here instead of 126 | # creating a socket needlessly. 127 | # See https://github.com/urllib3/urllib3/issues/1446 128 | if _appengine_environ.is_appengine_sandbox(): 129 | return False 130 | 131 | if socket.has_ipv6: 132 | # has_ipv6 returns true if cPython was compiled with IPv6 support. 133 | # It does not tell us if the system has IPv6 support enabled. To 134 | # determine that we must bind to an IPv6 address. 135 | # https://github.com/urllib3/urllib3/pull/611 136 | # https://bugs.python.org/issue658327 137 | try: 138 | sock = socket.socket(socket.AF_INET6) 139 | sock.bind((host, 0)) 140 | has_ipv6 = True 141 | except Exception: 142 | pass 143 | 144 | if sock: 145 | sock.close() 146 | return has_ipv6 147 | 148 | 149 | HAS_IPV6 = _has_ipv6("::1") 150 | --------------------------------------------------------------------------------