This is an old revision of the document!
# python3 -V # apt install python3-venv $ python3 -m venv ~/venv1 $ source ~/venv1/bin/activate (venv1) $ which python (venv1) $ which ansible (venv1) $ deactivate
(venv1) # python
(venv1) # pip install ipython
(venv1) :~$ pip install Flask (venv1) :~$ mkdir -p pywebd/; cd $_ (venv1) :~/pywebd$ cat app.py
from flask import Flask, send_from_directory import os import configparser config = configparser.ConfigParser() config.read('/etc/pywebd/pywebd.conf') if 'PYWEBD_DOC_ROOT' in os.environ: pywebd_doc_root = os.environ.get('PYWEBD_DOC_ROOT') else: pywebd_doc_root = config['default']['DocumentRoot'] app = Flask(__name__) @app.route('/') def index(): return send_from_directory(pywebd_doc_root, 'index.html') @app.route('/<path:path>') def sendstuff(path): print(path) return send_from_directory(pywebd_doc_root, path) if __name__ == "__main__": if 'PYWEBD_PORT' in os.environ: pywebd_port = os.environ.get('PYWEBD_PORT') else: pywebd_port = config['default']['Listen'] app.run(host="0.0.0.0", port=pywebd_port, debug=True) # app.run(ssl_context=('/etc/pywebd/pywebd.crt', '/etc/pywebd/pywebd.key'), debug=True, host='0.0.0.0', port=pywebd_port)
# mkdir -p /etc/pywebd/ # cat /etc/pywebd/pywebd.conf
[default] DocumentRoot = /var/www/ Listen = 4080
# #cp /root/wild.crt /etc/pywebd/pywebd.crt # #cp /root/wild.key /etc/pywebd/pywebd.key
(venv1) :~/pywebd$ #export PYWEBD_PORT=4443 (venv1) :~/pywebd$ #export PYWEBD_DOC_ROOT=/var/www/html/ (venv1) :~/pywebd$ #PYWEBD_PORT=4443 PYWEBD_DOC_ROOT=/var/www/html/ python app.py (venv1) :~/pywebd$ python app.py (venv1) :~/pywebd$ pip freeze | tee requirements.txt (venv1) :~/pywebd$ #pip install gunicorn (venv1) :~/pywebd$ #gunicorn app:app --bind 0.0.0.0:8000
server# ###docker run -ti --rm --name pywebd2 python:3.11-alpine sh / # ### pip install poetry server# apt install python3-poetry; export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring #https://stackoverflow.com/questions/74438817/poetry-failed-to-unlock-the-collection / # poetry new pywebd2 / # cd pywebd2 /pywebd2 # poetry add fastapi dotenv uvicorn ###gunicorn /pywebd2 # more pyproject.toml /pywebd2 # cat app.py
from fastapi import FastAPI from dotenv import load_dotenv import os CONST_VER = "ver1.1" hostname = os.uname().nodename load_dotenv() pywebd_message = os.environ.get('PYWEBD_MESSAGE') app = FastAPI() @app.get("/") async def home(): return {"data": f"{pywebd_message} from {hostname} app {CONST_VER}"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
/pywebd2 # cat .env
PYWEBD_MESSAGE="Hello World!!!"
/pywebd2 # cat tests/test_ver_format.py
import app, re assert re.match(r'^ver\d+\.\d+$', app.CONST_VER),"Incorrect VER format"
/pywebd2 # poetry run python3 -m unittest /pywebd2 # #export PYWEBD_MESSAGE="Another message" /pywebd2 # poetry run python3 app.py /pywebd2 # poetry run uvicorn app:app --reload --host 0.0.0.0 --port 4080
/pywebd2 # ###poetry run gunicorn app:app --bind 0.0.0.0:6080 -k uvicorn.workers.UvicornWorker
gate# apt install python3-xmltodict/stable gate# cat /etc/zabbix/dhcp-pools.py
#!/usr/bin/env python3 # Example usage: # ./dhcp-pools.py # ./dhcp-pools.py LAN1 defined|used from sys import argv import subprocess, xmltodict, json p = subprocess.Popen("/usr/bin/dhcpd-pools -f x", stdout=subprocess.PIPE, shell=True) (output, err) = p.communicate() p_status = p.wait() o = xmltodict.parse(output) #print (o) if len(argv)==1: r=[] for i in o['dhcpstatus']['shared-network']: s={} s["{#POOLNAME}"]=i['location'] r.insert(1,s) print(json.dumps(r)) else: LANNAME=argv[1] USDEF=argv[2] res = next((sub for sub in o['dhcpstatus']['shared-network'] if sub['location'] == LANNAME), None) print(res[USDEF])
(venv1) server:~# pip install requests (venv1) server:~# cat zab_set_map_name.py
#!/usr/bin/env python3 import requests import json from sys import argv if len(argv) != 3 : print("You must set argument!!!\nExample: python zab_set_map_name.py 2 \"ISP 1\"") quit() MAPID = argv[1] MAPNAME = argv[2] ZABBIX_API_URL = "http://127.0.0.1/zabbix/api_jsonrpc.php" UNAME = "Admin" PWORD = "zabbix" print("\nLogin user {} to Zabbiz API".format(UNAME)) r = requests.post(ZABBIX_API_URL, json={ "jsonrpc": "2.0", "method": "user.login", "params": { "username": UNAME, "password": PWORD}, "id": 1 }) print(json.dumps(r.json(), indent=4, sort_keys=True)) AUTHTOKEN = r.json()["result"] #print("Rename Map with ID", MAPID, "to", MAPNAME) print(f"Rename Map with ID {MAPID} to {MAPNAME}") r = requests.post(ZABBIX_API_URL, headers={'Authorization': 'Bearer ' + AUTHTOKEN}, json={ "jsonrpc": "2.0", "method": "map.update", "params": { "sysmapid": MAPID, "name": MAPNAME }, "id": 2 }) print(json.dumps(r.json(), indent=4, sort_keys=True)) print("\nLogout user") r = requests.post(ZABBIX_API_URL, headers={'Authorization': 'Bearer ' + AUTHTOKEN}, json={ "jsonrpc": "2.0", "method": "user.logout", "params": {}, "id": 2, }) print(json.dumps(r.json(), indent=4, sort_keys=True))
(venv1) server:~# chmod +x zab_set_map_name.py (venv1) server:~# ./zab_set_map_name.py 2 "ISP 1"
dir$ python3 -m http.server 80