forked from toolshed/abra
		
	Abstract common functions into a library
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								bin/__pycache__/abralib.cpython-39.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/__pycache__/abralib.cpython-39.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										103
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					"""Shared utilities for bin/*.py scripts."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from logging import DEBUG, basicConfig, getLogger
 | 
				
			||||||
 | 
					from os import chdir, mkdir
 | 
				
			||||||
 | 
					from os.path import exists, expanduser
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from shlex import split
 | 
				
			||||||
 | 
					from subprocess import check_output
 | 
				
			||||||
 | 
					from sys import exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from requests import get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HOME_PATH = expanduser("~/")
 | 
				
			||||||
 | 
					CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute()
 | 
				
			||||||
 | 
					REPOS_TO_SKIP = (
 | 
				
			||||||
 | 
					    "abra",
 | 
				
			||||||
 | 
					    "abra-apps",
 | 
				
			||||||
 | 
					    "abra-gandi",
 | 
				
			||||||
 | 
					    "abra-hetzner",
 | 
				
			||||||
 | 
					    "backup-bot",
 | 
				
			||||||
 | 
					    "coopcloud.tech",
 | 
				
			||||||
 | 
					    "coturn",
 | 
				
			||||||
 | 
					    "docker-cp-deploy",
 | 
				
			||||||
 | 
					    "docker-dind-bats-kcov",
 | 
				
			||||||
 | 
					    "docs.coopcloud.tech",
 | 
				
			||||||
 | 
					    "example",
 | 
				
			||||||
 | 
					    "gardening",
 | 
				
			||||||
 | 
					    "organising",
 | 
				
			||||||
 | 
					    "pyabra",
 | 
				
			||||||
 | 
					    "radicle-seed-node",
 | 
				
			||||||
 | 
					    "stack-ssh-deploy",
 | 
				
			||||||
 | 
					    "swarm-cronjob",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq")
 | 
				
			||||||
 | 
					SCRIPT_PATH = Path(__file__).absolute().parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					log = getLogger(__name__)
 | 
				
			||||||
 | 
					basicConfig()
 | 
				
			||||||
 | 
					log.setLevel(DEBUG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _run_cmd(cmd, shell=False, **kwargs):
 | 
				
			||||||
 | 
					    """Run a shell command."""
 | 
				
			||||||
 | 
					    args = [split(cmd)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if shell:
 | 
				
			||||||
 | 
					        args = [cmd]
 | 
				
			||||||
 | 
					        kwargs = {"shell": shell}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        return check_output(*args, **kwargs).decode("utf-8").strip()
 | 
				
			||||||
 | 
					    except Exception as exception:
 | 
				
			||||||
 | 
					        log.error(f"Failed to run {cmd}, saw {str(exception)}")
 | 
				
			||||||
 | 
					        exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_repos_json():
 | 
				
			||||||
 | 
					    """ Retrieve repo list from Gitea """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    log.info(f"Retrieving {url}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    repos = []
 | 
				
			||||||
 | 
					    response = True
 | 
				
			||||||
 | 
					    page = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        while response:
 | 
				
			||||||
 | 
					            log.info(f"Trying to fetch page {page}")
 | 
				
			||||||
 | 
					            response = get(url + f"?page={page}", timeout=10).json()
 | 
				
			||||||
 | 
					            repos.extend(response)
 | 
				
			||||||
 | 
					            page += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return repos
 | 
				
			||||||
 | 
					    except Exception as exception:
 | 
				
			||||||
 | 
					        log.error(f"Failed to retrieve {url}, saw {str(exception)}")
 | 
				
			||||||
 | 
					        exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def clone_all_apps(repos_json):
 | 
				
			||||||
 | 
					    """Clone all Co-op Cloud apps to ~/.abra/apps."""
 | 
				
			||||||
 | 
					    if not exists(CLONES_PATH):
 | 
				
			||||||
 | 
					        mkdir(CLONES_PATH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    repos = [[p["name"], p["ssh_url"]] for p in repos_json]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for name, url in repos:
 | 
				
			||||||
 | 
					        if name in REPOS_TO_SKIP:
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not exists(f"{CLONES_PATH}/{name}"):
 | 
				
			||||||
 | 
					            log.info(f"Retrieving {url}")
 | 
				
			||||||
 | 
					            _run_cmd(f"git clone {url} {CLONES_PATH}/{name}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            chdir(f"{CLONES_PATH}/{name}")
 | 
				
			||||||
 | 
					            if not int(_run_cmd("git branch --list | wc -l", shell=True)):
 | 
				
			||||||
 | 
					                log.info(f"Guessing main branch is HEAD for {name}")
 | 
				
			||||||
 | 
					                _run_cmd("git checkout main")
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            log.info(f"Updating {name}")
 | 
				
			||||||
 | 
					            chdir(f"{CLONES_PATH}/{name}")
 | 
				
			||||||
 | 
					            _run_cmd("git fetch -a")
 | 
				
			||||||
							
								
								
									
										109
									
								
								bin/app-json.py
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								bin/app-json.py
									
									
									
									
									
								
							@ -7,84 +7,24 @@
 | 
				
			|||||||
# https://apps.coopcloud.tech
 | 
					# https://apps.coopcloud.tech
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import dump
 | 
					from json import dump
 | 
				
			||||||
from logging import DEBUG, basicConfig, getLogger
 | 
					from os import chdir, listdir
 | 
				
			||||||
from os import chdir, listdir, mkdir
 | 
					from os.path import basename
 | 
				
			||||||
from os.path import basename, exists, expanduser
 | 
					 | 
				
			||||||
from pathlib import Path
 | 
					 | 
				
			||||||
from re import findall, search
 | 
					from re import findall, search
 | 
				
			||||||
from shlex import split
 | 
					from subprocess import DEVNULL
 | 
				
			||||||
from subprocess import DEVNULL, check_output
 | 
					 | 
				
			||||||
from sys import exit
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from requests import get
 | 
					from requests import get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HOME_PATH = expanduser("~/")
 | 
					from abralib import (
 | 
				
			||||||
CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute()
 | 
					    CLONES_PATH,
 | 
				
			||||||
YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq")
 | 
					    REPOS_TO_SKIP,
 | 
				
			||||||
SCRIPT_PATH = Path(__file__).absolute().parent
 | 
					    SCRIPT_PATH,
 | 
				
			||||||
REPOS_TO_SKIP = (
 | 
					    YQ_PATH,
 | 
				
			||||||
    "abra",
 | 
					    _run_cmd,
 | 
				
			||||||
    "abra-apps",
 | 
					    clone_all_apps,
 | 
				
			||||||
    "abra-gandi",
 | 
					    get_repos_json,
 | 
				
			||||||
    "abra-hetzner",
 | 
					    log,
 | 
				
			||||||
    "backup-bot",
 | 
					 | 
				
			||||||
    "coopcloud.tech",
 | 
					 | 
				
			||||||
    "coturn",
 | 
					 | 
				
			||||||
    "docker-cp-deploy",
 | 
					 | 
				
			||||||
    "docker-dind-bats-kcov",
 | 
					 | 
				
			||||||
    "docs.coopcloud.tech",
 | 
					 | 
				
			||||||
    "example",
 | 
					 | 
				
			||||||
    "gardening",
 | 
					 | 
				
			||||||
    "organising",
 | 
					 | 
				
			||||||
    "pyabra",
 | 
					 | 
				
			||||||
    "radicle-seed-node",
 | 
					 | 
				
			||||||
    "stack-ssh-deploy",
 | 
					 | 
				
			||||||
    "swarm-cronjob",
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
log = getLogger(__name__)
 | 
					 | 
				
			||||||
basicConfig()
 | 
					 | 
				
			||||||
log.setLevel(DEBUG)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _run_cmd(cmd, shell=False, **kwargs):
 | 
					 | 
				
			||||||
    """Run a shell command."""
 | 
					 | 
				
			||||||
    args = [split(cmd)]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if shell:
 | 
					 | 
				
			||||||
        args = [cmd]
 | 
					 | 
				
			||||||
        kwargs = {"shell": shell}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        return check_output(*args, **kwargs).decode("utf-8").strip()
 | 
					 | 
				
			||||||
    except Exception as exception:
 | 
					 | 
				
			||||||
        log.error(f"Failed to run {cmd}, saw {str(exception)}")
 | 
					 | 
				
			||||||
        exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_repos_json():
 | 
					 | 
				
			||||||
    """ Retrieve repo list from Gitea """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    log.info(f"Retrieving {url}")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    repos = []
 | 
					 | 
				
			||||||
    response = True
 | 
					 | 
				
			||||||
    page = 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        while response:
 | 
					 | 
				
			||||||
            log.info(f"Trying to fetch page {page}")
 | 
					 | 
				
			||||||
            response = get(url + f"?page={page}", timeout=10).json()
 | 
					 | 
				
			||||||
            repos.extend(response)
 | 
					 | 
				
			||||||
            page += 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return repos
 | 
					 | 
				
			||||||
    except Exception as exception:
 | 
					 | 
				
			||||||
        log.error(f"Failed to retrieve {url}, saw {str(exception)}")
 | 
					 | 
				
			||||||
        exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_published_apps_json():
 | 
					def get_published_apps_json():
 | 
				
			||||||
    """Retrieve already published apps json."""
 | 
					    """Retrieve already published apps json."""
 | 
				
			||||||
@ -99,31 +39,6 @@ def get_published_apps_json():
 | 
				
			|||||||
        return {}
 | 
					        return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def clone_all_apps(repos_json):
 | 
					 | 
				
			||||||
    """Clone all Co-op Cloud apps to ~/.abra/apps."""
 | 
					 | 
				
			||||||
    if not exists(CLONES_PATH):
 | 
					 | 
				
			||||||
        mkdir(CLONES_PATH)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    repos = [[p["name"], p["ssh_url"]] for p in repos_json]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for name, url in repos:
 | 
					 | 
				
			||||||
        if name in REPOS_TO_SKIP:
 | 
					 | 
				
			||||||
            continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if not exists(f"{CLONES_PATH}/{name}"):
 | 
					 | 
				
			||||||
            log.info(f"Retrieving {url}")
 | 
					 | 
				
			||||||
            _run_cmd(f"git clone {url} {CLONES_PATH}/{name}")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            chdir(f"{CLONES_PATH}/{name}")
 | 
					 | 
				
			||||||
            if not int(_run_cmd("git branch --list | wc -l", shell=True)):
 | 
					 | 
				
			||||||
                log.info(f"Guessing main branch is HEAD for {name}")
 | 
					 | 
				
			||||||
                _run_cmd("git checkout main")
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            log.info(f"Updating {name}")
 | 
					 | 
				
			||||||
            chdir(f"{CLONES_PATH}/{name}")
 | 
					 | 
				
			||||||
            _run_cmd("git fetch -a")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def generate_apps_json(repos_json):
 | 
					def generate_apps_json(repos_json):
 | 
				
			||||||
    """Generate the abra-apps.json application versions file."""
 | 
					    """Generate the abra-apps.json application versions file."""
 | 
				
			||||||
    apps_json = {}
 | 
					    apps_json = {}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Usage: ./clone-all-apps.py
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Clone all available apps into ~/.abra/apps using ssh:// URLs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from abralib import clone_all_apps, get_repos_json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    """Run the script."""
 | 
				
			||||||
 | 
					    repos_json = get_repos_json()
 | 
				
			||||||
 | 
					    clone_all_apps(repos_json)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main()
 | 
				
			||||||
@ -4,77 +4,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Output list of apps for Renovate bot configuration
 | 
					# Output list of apps for Renovate bot configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from logging import DEBUG, basicConfig, getLogger
 | 
					from abralib import REPOS_TO_SKIP, get_repos_json
 | 
				
			||||||
from os.path import expanduser
 | 
					 | 
				
			||||||
from pathlib import Path
 | 
					 | 
				
			||||||
from shlex import split
 | 
					 | 
				
			||||||
from subprocess import check_output
 | 
					 | 
				
			||||||
from sys import exit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from requests import get
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HOME_PATH = expanduser("~/")
 | 
					 | 
				
			||||||
CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute()
 | 
					 | 
				
			||||||
YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq")
 | 
					 | 
				
			||||||
SCRIPT_PATH = Path(__file__).absolute().parent
 | 
					 | 
				
			||||||
REPOS_TO_SKIP = (
 | 
					 | 
				
			||||||
    "abra",
 | 
					 | 
				
			||||||
    "abra-apps",
 | 
					 | 
				
			||||||
    "abra-gandi",
 | 
					 | 
				
			||||||
    "abra-hetzner",
 | 
					 | 
				
			||||||
    "backup-bot",
 | 
					 | 
				
			||||||
    "coopcloud.tech",
 | 
					 | 
				
			||||||
    "coturn",
 | 
					 | 
				
			||||||
    "docker-cp-deploy",
 | 
					 | 
				
			||||||
    "docker-dind-bats-kcov",
 | 
					 | 
				
			||||||
    "docs.coopcloud.tech",
 | 
					 | 
				
			||||||
    "example",
 | 
					 | 
				
			||||||
    "gardening",
 | 
					 | 
				
			||||||
    "organising",
 | 
					 | 
				
			||||||
    "pyabra",
 | 
					 | 
				
			||||||
    "radicle-seed-node",
 | 
					 | 
				
			||||||
    "stack-ssh-deploy",
 | 
					 | 
				
			||||||
    "swarm-cronjob",
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
log = getLogger(__name__)
 | 
					 | 
				
			||||||
basicConfig()
 | 
					 | 
				
			||||||
log.setLevel(DEBUG)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _run_cmd(cmd, shell=False, **kwargs):
 | 
					 | 
				
			||||||
    """Run a shell command."""
 | 
					 | 
				
			||||||
    args = [split(cmd)]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if shell:
 | 
					 | 
				
			||||||
        args = [cmd]
 | 
					 | 
				
			||||||
        kwargs = {"shell": shell}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        return check_output(*args, **kwargs).decode("utf-8").strip()
 | 
					 | 
				
			||||||
    except Exception as exception:
 | 
					 | 
				
			||||||
        log.error(f"Failed to run {cmd}, saw {str(exception)}")
 | 
					 | 
				
			||||||
        exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_repos_json():
 | 
					 | 
				
			||||||
    """ Retrieve repo list from Gitea """
 | 
					 | 
				
			||||||
    url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    repos = []
 | 
					 | 
				
			||||||
    response = True
 | 
					 | 
				
			||||||
    page = 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        while response:
 | 
					 | 
				
			||||||
            response = get(url + f"?page={page}", timeout=10).json()
 | 
					 | 
				
			||||||
            repos.extend(response)
 | 
					 | 
				
			||||||
            page += 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return repos
 | 
					 | 
				
			||||||
    except Exception as exception:
 | 
					 | 
				
			||||||
        log.error(f"Failed to retrieve {url}, saw {str(exception)}")
 | 
					 | 
				
			||||||
        exit(1)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user