From da5a86620e18b0a274dcb6b85af8b982c2f1b69a Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 20 Aug 2023 16:53:16 -0300 Subject: [PATCH 1/2] update --- tasks/croc.py | 24 +++++++++++++++++------- tasks/operations/git.py | 3 ++- tasks/postgresql.py | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/tasks/croc.py b/tasks/croc.py index 8b02c15..14a92a2 100644 --- a/tasks/croc.py +++ b/tasks/croc.py @@ -1,3 +1,4 @@ +from pathlib import Path from packaging import version from pyinfra.operations import apk, server, files from pyinfra.facts.server import LinuxName @@ -7,9 +8,14 @@ from pyinfra import host CROC_ALPINE_VERSION = version.parse("3.14") -@deploy("install croc") +@deploy( + "install croc", + data_defaults={ + "croc_install_directory": "/opt/croc", + "croc_bin_directory": "/usr/bin", + }, +) def install_croc(): - # alpine provides croc in-repo as of 3.14 if host.get_fact(LinuxName) == "Alpine": host_alpine_version = version.parse(host.data.alpine_version) @@ -18,11 +24,15 @@ def install_croc(): return # for everyone else, install manually - files.directory("/opt/croc") - files.download( + croc_dir = Path(host.data.croc_install_directory) + target_dir = host.data.croc_bin_directory + files.directory(str(croc_dir)) + files.directory(target_dir) + result = files.download( "https://github.com/schollz/croc/releases/download/v9.6.3/croc_9.6.3_Linux-64bit.tar.gz", - "/opt/croc/croc.tar.gz", + str(croc_dir / "croc.tar.gz"), md5sum="5550b0bfb50d0541cba790562c180bd7", ) - server.shell("tar xvf /opt/croc/croc.tar.gz", _chdir="/opt/croc") - server.shell("mv /opt/croc/croc /usr/bin/croc", _chdir="/opt/croc") + if result.changed: + server.shell(f"tar xvf {croc_dir}/croc.tar.gz", _chdir=str(croc_dir)) + server.shell(f"mv {croc_dir}/croc {target_dir}/croc", _chdir=str(croc_dir)) diff --git a/tasks/operations/git.py b/tasks/operations/git.py index ab452bd..c90e835 100644 --- a/tasks/operations/git.py +++ b/tasks/operations/git.py @@ -29,6 +29,7 @@ class GitFetch(FactBase): class GitRevListComparison(FactBase): def command(self, repo: str, branch: str): + assert branch return f"git -C {repo} rev-list HEAD..origin/{branch} | wc -l" def process(self, output): @@ -122,7 +123,7 @@ def repo( # always fetch upstream branches (that way we can compare if the latest # commit has changed, and then we don't need to execute anything!) host.get_fact(GitFetch, repo=dest) - stdout = host.get_fact(GitRevListComparison, repo=dest, branch=branch) + stdout = host.get_fact(GitRevListComparison, repo=dest, branch=current_branch) repository_has_updates = stdout[0] != "0" # since we immediately always fetch, we will always be modifying the diff --git a/tasks/postgresql.py b/tasks/postgresql.py index 841e132..45b053c 100644 --- a/tasks/postgresql.py +++ b/tasks/postgresql.py @@ -5,7 +5,7 @@ from pyinfra.operations import dnf, systemd, server from pyinfra.facts.server import LinuxName, LinuxDistribution -@deploy("Install PostgreSQL") +@deploy("Install PostgreSQL", data_defaults={"postgresql_version": 15}) def install(): linux_name = host.get_fact(LinuxName) version = host.data.postgresql_version From 93e11c515ff1a0e355ad433c395b7912b721e894 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 20 Aug 2023 16:53:22 -0300 Subject: [PATCH 2/2] add tasks/piped.py --- tasks/piped.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tasks/piped.py diff --git a/tasks/piped.py b/tasks/piped.py new file mode 100644 index 0000000..441e072 --- /dev/null +++ b/tasks/piped.py @@ -0,0 +1,100 @@ +from pyinfra import host +from pyinfra.api import deploy +from pyinfra.operations import files, server, dnf, postgresql, lxd +from pyinfra.facts.server import Which +from pyinfra.facts.lxd import LxdContainers + +from .operations.git import repo +from .postgresql import install as install_postgresql +from .pleroma import WithSecrets +from .install_consul_server import template_and_install_systemd +from .yts import lxc_shell + + +@deploy( + "create lxc container that'll run piped", + data_defaults={"piped_container_name": "piped"}, +) +def install_lxc_container(): + containers = host.get_fact(LxdContainers) + ct_name = host.data.piped_container_name + + found_piped_container = False + for container in containers: + if container["name"] == ct_name: + found_piped_container = True + + if not found_piped_container: + lxd.container( + name="create piped container", + id=ct_name, + image="images:fedora/38", + ) + + # validate the ct is good + lxc_shell(ct_name, "env") + + +@deploy("install piped backend") +def install(): + install_postgresql() + dnf.packages( + [ + "java-17-openjdk-headless", + ] + ) + + with_secrets = WithSecrets(("piped_db_password",)) + + # TODO remove copypaste of this between piped and pleroma + has_postgres = host.get_fact(Which, command="psql") + postgres_kwargs = {} + if has_postgres: + postgres_kwargs = {"_sudo": True, "_sudo_user": "postgres"} + + postgresql.role( + role=host.data.piped_db_user, + password=with_secrets.piped_db_password, + login=True, + **postgres_kwargs, + ) + + postgresql.database( + database=host.data.piped_db_name, + owner=host.data.piped_db_user, + encoding="UTF8", + **postgres_kwargs, + ) + + runner_user = "piped" + remote_main_home_path = f"/opt/piped" + + # we really dont need to build the whole thing + # just croc the jar file manually + + server.group(runner_user) + server.user( + user=runner_user, + present=True, + home=remote_main_home_path, + shell="/bin/false", + group=runner_user, + ensure_home=True, + ) + + config_output = files.template( + "./files/piped/config.properties", + dest=f"{remote_main_home_path}/config.properties", + user=runner_user, + group=runner_user, + mode=500, + env_dict=with_secrets, + ) + + template_and_install_systemd( + "./files/piped/piped.service.j2", + env_dict={ + "user": runner_user, + "remote_main_home_path": remote_main_home_path, + }, + )