152 lines
3.6 KiB
Dart
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';
|
|
}
|
|
}
|