Files
PeachDeployments/lib/Peach/about/external/data/EnvCheck.dart
alvocool 38881d1fe1 Add app source and tests
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 10:15:30 +03:00

152 lines
3.6 KiB
Dart

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<String, String> 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<EnvTool> 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';
}
}