mirror of
https://gitlab.sectorq.eu/jaydee/portainer.git
synced 2025-12-14 10:44:52 +01:00
build
This commit is contained in:
187
portainer.py
187
portainer.py
@@ -7,6 +7,7 @@ import argparse
|
||||
from tabulate import tabulate
|
||||
from port import Portainer
|
||||
import logging
|
||||
|
||||
VERSION = "0.0.1"
|
||||
|
||||
defaults = {
|
||||
@@ -15,42 +16,67 @@ defaults = {
|
||||
"deploy_mode": "git",
|
||||
"autostart": True,
|
||||
"stack_mode": "swarm",
|
||||
"site": "portainer"
|
||||
"site": "portainer",
|
||||
}
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description="Portainer helper - use env vars or pass credentials.")
|
||||
parser.add_argument("--base",
|
||||
"-b",
|
||||
default=os.getenv("PORTAINER_URL", "https://portainer.example.com"),
|
||||
help="Base URL for Portainer (ENV: PORTAINER_URL)"
|
||||
)
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Portainer helper - use env vars or pass credentials."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--base",
|
||||
"-b",
|
||||
default=os.getenv("PORTAINER_URL", "https://portainer.example.com"),
|
||||
help="Base URL for Portainer (ENV: PORTAINER_URL)",
|
||||
)
|
||||
parser.add_argument("--site", "-t", type=str, default=None, help="Site")
|
||||
parser.add_argument("--endpoint-id", "-e", type=str, default=None, help="Endpoint ID to limit stack operations")
|
||||
parser.add_argument("--refresh-environment", "-R", action="store_true", help="List endpoints")
|
||||
parser.add_argument("--list-endpoints", "-E", action="store_true", help="List endpoints")
|
||||
parser.add_argument(
|
||||
"--endpoint-id",
|
||||
"-e",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Endpoint ID to limit stack operations",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--refresh-environment", "-R", action="store_true", help="List endpoints"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--list-endpoints", "-E", action="store_true", help="List endpoints"
|
||||
)
|
||||
parser.add_argument("--list-stacks", "-l", action="store_true", help="List stacks")
|
||||
parser.add_argument("--print-all-data", "-A", action="store_true", help="List stacks")
|
||||
parser.add_argument("--list-containers", "-c", action="store_true", help="List containers")
|
||||
parser.add_argument(
|
||||
"--list-containers", "-c", action="store_true", help="List containers"
|
||||
)
|
||||
parser.add_argument("--update-stack", "-U", action="store_true", help="Update stacks")
|
||||
parser.add_argument("--stop-containers", "-O", action="store_true", help="Stop containers")
|
||||
parser.add_argument("--start-containers", "-X", action="store_true", help="Start containers")
|
||||
parser.add_argument(
|
||||
"--stop-containers", "-O", action="store_true", help="Stop containers"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--start-containers", "-X", action="store_true", help="Start containers"
|
||||
)
|
||||
parser.add_argument("--update-status", "-S", action="store_true", help="Update status")
|
||||
parser.add_argument("--get-stack", metavar="NAME_OR_ID", help="Get stack by name or numeric id")
|
||||
parser.add_argument(
|
||||
"--get-stack", metavar="NAME_OR_ID", help="Get stack by name or numeric id"
|
||||
)
|
||||
parser.add_argument("--action", "-a", type=str, default=None, help="Action to perform")
|
||||
parser.add_argument("--autostart", "-Z", action="store_true", help="Auto-start created stacks")
|
||||
parser.add_argument("--start-stack", "-x", action='store_true')
|
||||
parser.add_argument("--stop-stack", "-o", action='store_true')
|
||||
parser.add_argument("--secrets", "-q", action='store_true')
|
||||
parser.add_argument("--debug", "-D", action='store_true')
|
||||
parser.add_argument("--create-stack", "-n", action='store_true')
|
||||
parser.add_argument("--create-stack_new2", "-N", action='store_true')
|
||||
parser.add_argument("--gpu", "-g", action='store_true')
|
||||
parser.add_argument("--create-stacks", "-C", action='store_true')
|
||||
parser.add_argument("--refresh-status", "-r", action='store_true')
|
||||
parser.add_argument(
|
||||
"--autostart", "-Z", action="store_true", help="Auto-start created stacks"
|
||||
)
|
||||
parser.add_argument("--start-stack", "-x", action="store_true")
|
||||
parser.add_argument("--stop-stack", "-o", action="store_true")
|
||||
parser.add_argument("--secrets", "-q", action="store_true")
|
||||
parser.add_argument("--debug", "-D", action="store_true")
|
||||
parser.add_argument("--create-stack", "-n", action="store_true")
|
||||
parser.add_argument("--create-stack_new2", "-N", action="store_true")
|
||||
parser.add_argument("--gpu", "-g", action="store_true")
|
||||
parser.add_argument("--create-stacks", "-C", action="store_true")
|
||||
parser.add_argument("--refresh-status", "-r", action="store_true")
|
||||
|
||||
parser.add_argument("--stack", "-s", type=str, help="Stack ID for operations")
|
||||
parser.add_argument("--token-only", action="store_true", help="Print auth token and exit")
|
||||
parser.add_argument(
|
||||
"--token-only", action="store_true", help="Print auth token and exit"
|
||||
)
|
||||
parser.add_argument("--timeout", type=int, default=10, help="Request timeout seconds")
|
||||
parser.add_argument("--deploy-mode", "-m", type=str, default="git", help="Deploy mode")
|
||||
parser.add_argument("--stack-mode", "-w", default=None, help="Stack mode")
|
||||
@@ -64,32 +90,32 @@ if _LOG_LEVEL == "DEBUG":
|
||||
logging.basicConfig(
|
||||
filename=LOG_FILE,
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s : %(levelname)s : %(message)s',
|
||||
datefmt='%m/%d/%Y %I:%M:%S %p'
|
||||
format="%(asctime)s : %(levelname)s : %(message)s",
|
||||
datefmt="%m/%d/%Y %I:%M:%S %p",
|
||||
)
|
||||
logging.debug('using debug logging')
|
||||
logging.debug("using debug logging")
|
||||
elif _LOG_LEVEL == "ERROR":
|
||||
logging.basicConfig(
|
||||
filename=LOG_FILE,
|
||||
level=logging.ERROR,
|
||||
format='%(asctime)s : %(levelname)s : %(message)s',
|
||||
datefmt='%m/%d/%Y %I:%M:%S %p'
|
||||
format="%(asctime)s : %(levelname)s : %(message)s",
|
||||
datefmt="%m/%d/%Y %I:%M:%S %p",
|
||||
)
|
||||
logging.info('using error logging')
|
||||
logging.info("using error logging")
|
||||
elif _LOG_LEVEL == "SCAN":
|
||||
logging.basicConfig(
|
||||
filename=LOG_FILE,
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s : %(levelname)s : %(message)s',
|
||||
datefmt='%m/%d/%Y %I:%M:%S %p'
|
||||
format="%(asctime)s : %(levelname)s : %(message)s",
|
||||
datefmt="%m/%d/%Y %I:%M:%S %p",
|
||||
)
|
||||
logging.info('using scan logging')
|
||||
logging.info("using scan logging")
|
||||
else:
|
||||
logging.basicConfig(
|
||||
filename=LOG_FILE,
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s : %(levelname)s : %(message)s',
|
||||
datefmt='%m/%d/%Y %I:%M:%S %p'
|
||||
format="%(asctime)s : %(levelname)s : %(message)s",
|
||||
datefmt="%m/%d/%Y %I:%M:%S %p",
|
||||
)
|
||||
logging.info("script started")
|
||||
|
||||
@@ -125,10 +151,14 @@ def get_portainer_token(base_url, username=None, password=None, timeout=10):
|
||||
username = username or os.getenv("PORTAINER_USER")
|
||||
password = password or os.getenv("PORTAINER_PASS")
|
||||
if not username or not password:
|
||||
raise ValueError("Username and password must be provided (or set PORTAINER_USER / PORTAINER_PASS).")
|
||||
raise ValueError(
|
||||
"Username and password must be provided (or set PORTAINER_USER / PORTAINER_PASS)."
|
||||
)
|
||||
|
||||
url = f"{base_url.rstrip('/')}/api/auth"
|
||||
resp = requests.post(url, json={"Username": username, "Password": password}, timeout=timeout)
|
||||
resp = requests.post(
|
||||
url, json={"Username": username, "Password": password}, timeout=timeout
|
||||
)
|
||||
resp.raise_for_status()
|
||||
data = resp.json()
|
||||
token = data.get("jwt") or data.get("JWT") or data.get("token")
|
||||
@@ -161,28 +191,30 @@ if __name__ == "__main__":
|
||||
# Example usage: set PORTAINER_USER and PORTAINER_PASS in env, or pass literals below.
|
||||
# token = get_portainer_token(base,"admin","l4c1j4yd33Du5lo") # or get_portainer_token(base, "admin", "secret")
|
||||
if args.action is None:
|
||||
actions = ["delete_stack",
|
||||
"create_stack",
|
||||
"stop_stack",
|
||||
"start_stack",
|
||||
"list_stacks",
|
||||
"update_stack",
|
||||
"secrets",
|
||||
"print_all_data",
|
||||
"list_endpoints",
|
||||
"list_containers",
|
||||
"stop_containers",
|
||||
"start_containers",
|
||||
"refresh_environment",
|
||||
"refresh_status",
|
||||
"update_status"]
|
||||
actions = [
|
||||
"delete_stack",
|
||||
"create_stack",
|
||||
"stop_stack",
|
||||
"start_stack",
|
||||
"list_stacks",
|
||||
"update_stack",
|
||||
"secrets",
|
||||
"print_all_data",
|
||||
"list_endpoints",
|
||||
"list_containers",
|
||||
"stop_containers",
|
||||
"start_containers",
|
||||
"refresh_environment",
|
||||
"refresh_status",
|
||||
"update_status",
|
||||
]
|
||||
print("Possible actions: ")
|
||||
i = 1
|
||||
for a in actions:
|
||||
print(f" > {i}. {a}")
|
||||
i += 1
|
||||
ans = input("\nSelect action to perform: ")
|
||||
args.action = actions[int(ans)-1]
|
||||
args.action = actions[int(ans) - 1]
|
||||
|
||||
token = portainer_api_key
|
||||
# Example: list endpoints
|
||||
@@ -197,7 +229,7 @@ if __name__ == "__main__":
|
||||
"influxdb2-admin-token": "l4c1j4yd33Du5lo",
|
||||
"ha_influxdb2_admin_token": "l4c1j4yd33Du5lo",
|
||||
"wordpress_db_password": "wordpress",
|
||||
"wordpress_root_db_password": "wordpress"
|
||||
"wordpress_root_db_password": "wordpress",
|
||||
}
|
||||
for key, value in secrets.items():
|
||||
res = por.create_secret(key, value, args.endpoint_id, args.timeout)
|
||||
@@ -205,23 +237,40 @@ if __name__ == "__main__":
|
||||
sys.exit()
|
||||
|
||||
if args.action == "delete_stack":
|
||||
args = prompt_missing_args(args, defaults, [
|
||||
("site", "Site"),
|
||||
("endpoint_id", "Endpoint ID"),
|
||||
("stack", "Stack name or ID")
|
||||
])
|
||||
por.delete_stack(args.endpoint_id, args.stack,)
|
||||
args = prompt_missing_args(
|
||||
args,
|
||||
defaults,
|
||||
[
|
||||
("site", "Site"),
|
||||
("endpoint_id", "Endpoint ID"),
|
||||
("stack", "Stack name or ID"),
|
||||
],
|
||||
)
|
||||
por.delete_stack(
|
||||
args.endpoint_id,
|
||||
args.stack,
|
||||
)
|
||||
sys.exit()
|
||||
|
||||
if args.action == "create_stack":
|
||||
args = prompt_missing_args(args, defaults, [
|
||||
("site", "Site"),
|
||||
("endpoint_id", "Endpoint ID"),
|
||||
("stack", "Stack name or ID"),
|
||||
("stack_mode", "Stack mode (swarm or compose)"),
|
||||
("deploy_mode", "Deploy mode (git or upload)")
|
||||
])
|
||||
por.create_stack(args.endpoint_id, args.stack, args.deploy_mode, args.autostart, args.stack_mode)
|
||||
args = prompt_missing_args(
|
||||
args,
|
||||
defaults,
|
||||
[
|
||||
("site", "Site"),
|
||||
("endpoint_id", "Endpoint ID"),
|
||||
("stack", "Stack name or ID"),
|
||||
("stack_mode", "Stack mode (swarm or compose)"),
|
||||
("deploy_mode", "Deploy mode (git or upload)"),
|
||||
],
|
||||
)
|
||||
por.create_stack(
|
||||
args.endpoint_id,
|
||||
args.stack,
|
||||
args.deploy_mode,
|
||||
args.autostart,
|
||||
args.stack_mode,
|
||||
)
|
||||
sys.exit()
|
||||
|
||||
if args.action == "stop_stack":
|
||||
|
||||
Reference in New Issue
Block a user