view packages/packages.py @ 332:d4893670f888 default tip

WIP: use watchdog reboot timer on pi
author drewp@bigasterisk.com
date Thu, 27 Feb 2025 11:09:29 -0800
parents 5b88b38f2471
children
line wrap: on
line source

from io import StringIO

from pyinfra.context import host
from pyinfra.operations import apt, files, server, systemd

import packages.package_lists as package_lists


def kitty():
    apt.packages(packages=['kitty'], present=False, force=True)
    vers = '0.36.2'  # see https://github.com/kovidgoyal/kitty/releases
    home = '/home/drewp'
    local = f"{home}/.local/kitty"
    dl = f'/tmp/kitty-{vers}-x86_64.txz'
    files.download(src=f"https://github.com/kovidgoyal/kitty/releases/download/v{vers}/kitty-{vers}-x86_64.txz", dest=dl)
    files.directory(path=local)
    server.shell(commands=[
        f"mkdir -p {local}",  # https://github.com/Fizzadar/pyinfra/issues/777
        f"aunpack --extract-to={local} {dl}",
    ])
    files.link(target="{local}/bin/kitty", path="{home}/bin/kitty")
    files.link(target="{local}/bin/kitten", path="{home}/bin/kitten")


def nodejs():
    if 'pi' in host.groups or host.name == 'pipe' or host.name == 'prime':
        return
    apt.packages(packages=['libnode72'], present=False, force=True)
    apt.packages(packages=['nodejs'], latest=True)
    server.shell(commands=[
        "rm -f /usr/local/bin/pnp{m,x}",
        "corepack enable",
        # https://github.com/pnpm/pnpm/releases
        # but also https://pnpm.io/installation#compatibility
        "corepack prepare 'pnpm@9.8' --activate",
    ])


def podman():
    # frigate build wants to mount a single file from the host, which needs podman 4.5.1
    # https://github.com/containers/podman/issues/12123#issuecomment-1620439593
    server.shell(commands='apt --fix-broken install')
    apt.deb(src="http://ftp.osuosl.org/pub/ubuntu/pool/main/g/gpgme1.0/libgpgme11t64_1.18.0-4.1ubuntu4_amd64.deb")
    server.shell(commands='apt --fix-broken install')
    apt.deb(src="http://ftp.osuosl.org/pub/ubuntu/pool/universe/c/conmon/conmon_2.1.10+ds1-1build2_amd64.deb")
    apt.deb(src="http://ftp.osuosl.org/pub/ubuntu/pool/universe/libp/libpod/podman_4.9.3+ds1-1build2_amd64.deb")
    apt.packages(packages=['libsubid4', 'buildah', 'podman-docker'], latest=True)


def pdm():
    # https://github.com/pdm-project/pdm/blob/main/CHANGELOG.md
    server.shell(commands=["pip install --break-system-packages 'pdm==2.21.0'"])


def proper_locate():
    apt.packages(packages='mlocate', present=False)
    if 'pi' not in host.groups and host.name not in ['prime', 'pipe']:
        apt.packages(packages='plocate')


def proper_man():
    if 'small' in host.groups or 'pi' in host.groups:
        apt.packages(packages=['mandb'], present=False)


def no_unwanted_services():
    systemd.service(service='nginx', enabled=False, running=False)


apt.packages(packages=package_lists.setup, latest=True)


def roblox():
    server.shell(commands='flatpak install -y org.freedesktop.Platform/x86_64/23.08')
    server.shell(commands='flatpak install -y flathub org.vinegarhq.Vinegar')  # (roblox runner)
    files.put(
        src=StringIO(
            #"#!/bin/sh\nexec flatpak run org.vinegarhq.Vinegar player run 'roblox-player:1'\n"
            "#!/bin/sh\n exec /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=vinegar org.vinegarhq.Vinegar player run -app\n"
        ),
        dest='/usr/local/bin/roblox.real',
        mode='755')

    for desktopFile in [
            '/var/lib/flatpak/exports/share/applications/org.vinegarhq.Vinegar.app.desktop',
            '/var/lib/flatpak/app/org.vinegarhq.Vinegar/current/active/export/share/applications/org.vinegarhq.Vinegar.player.desktop',
    ]:
        files.line(path=desktopFile, line="^Exec", replace='Exec=/usr/local/bin/roblox')
    files.link(target='/usr/local/bin/run_while_allowed', path='/usr/local/bin/roblox', force=True)


def kube_node():

    # avoid having to this workaround:
    # https://longhorn.io/kb/troubleshooting-volume-with-multipath/
    apt.packages(packages=['multipath-tools'], force=True, present=False)

    apt.packages(packages=[
        # https://longhorn.io/docs/1.6.1/deploy/install/#installation-requirements
        'open-iscsi',
        'nfs-common',
        'cryptsetup',
    ])


def install_packages():
    apt.packages(packages=package_lists.general, latest=True)
    apt.packages(packages=package_lists.debug, latest=True)

    if host.name == "pipe":
        apt.packages(packages=package_lists.for_pipe, latest=True)

    if host.name != 'pipe':
        apt.packages(packages=['reptyr'])

    if host.name == "prime":
        apt.packages(packages=package_lists.for_prime, latest=True)

    if host.name == 'plus':
        apt.packages(packages=package_lists.laptop, latest=True)

    if host.data.get('gpu'):
        apt.packages(packages=package_lists.k8s_node_with_nvidia_gpu(host.name))

    if host.data.get('k8s_admin'):
        podman()

    is_kube_node = host.name in ['dash', 'slash', 'ditto', 'ws-printer', 'li-drums']
    if is_kube_node:
        kube_node()

    if host.name == 'ditto':
        apt.packages(packages=package_lists.for_ditto, latest=True)

    if 'pi' not in host.groups:
        kitty()
        apt.packages(packages=package_lists.non_pi, latest=True)

    if 'pi' in host.groups:
        apt.packages(packages=package_lists.pi_setup)

    desktop_env = host.name in ['dash', 'slash', 'plus', 'dot', 'squib', 'pillow', 'tofu']
    if desktop_env:
        apt.packages(packages=package_lists.xorg + package_lists.desktop, latest=True)
        # broken, per https://vinegarhq.org/
        # roblox()
    if desktop_env or host.name in ['bang', 'ditto']:
        pdm()


operations = [
    proper_locate,
    proper_man,
    nodejs,
    install_packages,
    no_unwanted_services,
]
# todo: ./mrv2-v1.0.8-Linux-amd64.deb