import 'package:flutter/material.dart'; /// A tool/runtime PeachDeployments can detect on a server and install if /// missing. [detect] prints a version line to stdout when present, nothing /// otherwise (guarded by `command -v`). [pkg] maps a package manager to the /// package(s) to install. [unit] is a systemd unit to `enable --now` after. class EnvTool { final String key; final String label; final IconData icon; final String detect; final Map pkg; final String? unit; const EnvTool( this.key, this.label, this.icon, this.detect, this.pkg, { this.unit, }); String packagesFor(String pm) => pkg[pm] ?? key; } const List kEnvTools = [ EnvTool( 'java', 'Java (JDK)', Icons.coffee, 'command -v java >/dev/null 2>&1 && java -version 2>&1 | head -n1', { 'apt': 'openjdk-17-jdk', 'dnf': 'java-17-openjdk-devel', 'yum': 'java-17-openjdk-devel', 'apk': 'openjdk17', 'zypper': 'java-17-openjdk-devel', 'pacman': 'jdk-openjdk', }, ), EnvTool( 'mariadb', 'MariaDB / MySQL', Icons.storage, '(command -v mariadb >/dev/null 2>&1 && mariadb --version 2>&1 | head -n1) || ' '(command -v mysql >/dev/null 2>&1 && mysql --version 2>&1 | head -n1)', { 'apt': 'mariadb-server', 'dnf': 'mariadb-server', 'yum': 'mariadb-server', 'apk': 'mariadb mariadb-client', 'zypper': 'mariadb', 'pacman': 'mariadb', }, unit: 'mariadb', ), EnvTool( 'postgres', 'PostgreSQL', Icons.dataset, 'command -v psql >/dev/null 2>&1 && psql --version 2>&1 | head -n1', { 'apt': 'postgresql', 'dnf': 'postgresql-server', 'yum': 'postgresql-server', 'apk': 'postgresql', 'zypper': 'postgresql-server', 'pacman': 'postgresql', }, unit: 'postgresql', ), EnvTool( 'nginx', 'nginx', Icons.dns, 'command -v nginx >/dev/null 2>&1 && nginx -v 2>&1 | head -n1', { 'apt': 'nginx', 'dnf': 'nginx', 'yum': 'nginx', 'apk': 'nginx', 'zypper': 'nginx', 'pacman': 'nginx', }, unit: 'nginx', ), EnvTool( 'docker', 'Docker', Icons.inventory_2, 'command -v docker >/dev/null 2>&1 && docker --version 2>&1 | head -n1', { 'apt': 'docker.io', 'dnf': 'docker', 'yum': 'docker', 'apk': 'docker', 'zypper': 'docker', 'pacman': 'docker', }, unit: 'docker', ), EnvTool( 'node', 'Node.js', Icons.javascript, 'command -v node >/dev/null 2>&1 && node --version 2>&1 | head -n1', { 'apt': 'nodejs npm', 'dnf': 'nodejs', 'yum': 'nodejs', 'apk': 'nodejs npm', 'zypper': 'nodejs', 'pacman': 'nodejs npm', }, ), EnvTool( 'git', 'Git', Icons.merge_type, 'command -v git >/dev/null 2>&1 && git --version 2>&1 | head -n1', { 'apt': 'git', 'dnf': 'git', 'yum': 'git', 'apk': 'git', 'zypper': 'git', 'pacman': 'git', }, ), ]; /// Builds the install command for a detected package manager. String installCommandFor(String pm, String packages) { switch (pm) { case 'apt': return 'apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $packages'; case 'dnf': return 'dnf install -y $packages'; case 'yum': return 'yum install -y $packages'; case 'apk': return 'apk add --no-cache $packages'; case 'zypper': return 'zypper --non-interactive install $packages'; case 'pacman': return 'pacman -Sy --noconfirm $packages'; default: return 'echo "Unsupported package manager"; false'; } }