diff --git a/assets/linux/freebsd.png b/assets/linux/freebsd.png deleted file mode 100644 index 6d4a6298..00000000 Binary files a/assets/linux/freebsd.png and /dev/null differ diff --git a/lib/data/model/pkg/manager.dart b/lib/data/model/pkg/manager.dart new file mode 100644 index 00000000..b1740b0e --- /dev/null +++ b/lib/data/model/pkg/manager.dart @@ -0,0 +1 @@ +enum PkgManager { apt, yum, zypper, pacman, opkg } \ No newline at end of file diff --git a/lib/data/model/pkg/upgrade_info.dart b/lib/data/model/pkg/upgrade_info.dart index c42eda0f..c4c9202d 100644 --- a/lib/data/model/pkg/upgrade_info.dart +++ b/lib/data/model/pkg/upgrade_info.dart @@ -1,30 +1,37 @@ -import 'package:toolbox/data/model/server/dist.dart'; +import 'package:toolbox/data/model/pkg/manager.dart'; class UpgradePkgInfo { - final String _raw; - final Dist _dist; + final PkgManager? _mgr; late String package; late String nowVersion; late String newVersion; late String arch; - UpgradePkgInfo(this._raw, this._dist) { - switch (_dist) { - case Dist.debian: - case Dist.ubuntu: - _parseApt(); + UpgradePkgInfo(String raw, this._mgr) { + switch (_mgr) { + case PkgManager.apt: + _parseApt(raw); break; - case Dist.centos: - _parseYum(); + case PkgManager.yum: + _parseYum(raw); + break; + case PkgManager.zypper: + _parseZypper(raw); + break; + case PkgManager.pacman: + _parsePacman(raw); + break; + case PkgManager.opkg: + _parseOpkg(raw); break; default: - throw Exception('Unsupported dist: $_dist'); + throw Exception('Unsupported pkg type: $_mgr'); } } - void _parseApt() { - final split1 = _raw.split("/"); + void _parseApt(String raw) { + final split1 = raw.split("/"); package = split1[0]; final split2 = split1[1].split(" "); newVersion = split2[1]; @@ -32,8 +39,8 @@ class UpgradePkgInfo { nowVersion = split2[5].replaceFirst(']', ''); } - void _parseYum() { - final result = RegExp(r'\S+').allMatches(_raw); + void _parseYum(String raw) { + final result = RegExp(r'\S+').allMatches(raw); final pkgAndArch = result.elementAt(0).group(0) ?? '.'; final split1 = pkgAndArch.split('.'); package = split1[0]; @@ -41,4 +48,28 @@ class UpgradePkgInfo { newVersion = result.elementAt(1).group(0) ?? 'Unknown'; nowVersion = ''; } + + void _parseZypper(String raw) { + final cols = raw.split("|"); + package = cols[2].trim(); + nowVersion = cols[3].trim(); + newVersion = cols[4].trim(); + arch = cols[5].trim(); + } + + void _parsePacman(String raw) { + final parts = raw.split(' '); + package = parts[0]; + nowVersion = parts[1]; + newVersion = parts[3]; + arch = ''; + } + + void _parseOpkg(String raw) { + final parts = raw.split(' - '); + package = parts[0]; + nowVersion = parts[1]; + newVersion = parts[2]; + arch = ''; + } } diff --git a/lib/data/model/server/dist.dart b/lib/data/model/server/dist.dart index c9f80ad3..2a262f51 100644 --- a/lib/data/model/server/dist.dart +++ b/lib/data/model/server/dist.dart @@ -8,7 +8,6 @@ enum Dist { wrt, armbian, arch, - freebsd, /// Rocky Linux rocky; diff --git a/lib/data/provider/pkg.dart b/lib/data/provider/pkg.dart index 4191bf06..269628a2 100644 --- a/lib/data/provider/pkg.dart +++ b/lib/data/provider/pkg.dart @@ -7,17 +7,16 @@ import 'package:toolbox/core/extension/ssh_client.dart'; import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/provider_base.dart'; +import 'package:toolbox/data/model/pkg/manager.dart'; import 'package:toolbox/data/model/pkg/upgrade_info.dart'; import 'package:toolbox/data/model/server/dist.dart'; -enum _Type { apt, yum, dnf, zypper, pkg, pacman, opkg } - class PkgProvider extends BusyProvider { final logger = Logger('PKG'); SSHClient? client; Dist? dist; - _Type? type; + PkgManager? type; Function()? onUpgrade; Function()? onUpdate; PwdRequestFunc? onPasswordRequest; @@ -48,28 +47,23 @@ class PkgProvider extends BusyProvider { switch (dist) { case Dist.centos: case Dist.rocky: - type = _Type.yum; + case Dist.fedora: + type = PkgManager.yum; break; case Dist.debian: case Dist.ubuntu: case Dist.kali: case Dist.armbian: - type = _Type.apt; - break; - case Dist.fedora: - type = _Type.dnf; + type = PkgManager.apt; break; case Dist.opensuse: - type = _Type.zypper; - break; - case Dist.freebsd: - type = _Type.pkg; + type = PkgManager.zypper; break; case Dist.wrt: - type = _Type.opkg; + type = PkgManager.opkg; break; case Dist.arch: - type = _Type.pacman; + type = PkgManager.pacman; break; case null: error = 'Unsupported dist: $dist'; @@ -100,14 +94,14 @@ class PkgProvider extends BusyProvider { if (raw == null) return; var list = raw.split('\n'); switch (type) { - case _Type.yum: + case PkgManager.yum: list = list.sublist(2); list.removeWhere((element) => element.isEmpty); final endLine = list.lastIndexWhere( (element) => element.contains('Obsoleting Packages')); list = list.sublist(0, endLine); break; - case _Type.apt: + case PkgManager.apt: // avoid other outputs // such as: [Could not chdir to home directory /home/test: No such file or directory, , WARNING: apt does not have a stable CLI interface. Use with caution in scripts., , Listing...] final idx = @@ -119,17 +113,23 @@ class PkgProvider extends BusyProvider { list = list.sublist(idx); list.removeWhere((element) => element.isEmpty); break; + case PkgManager.zypper: + list = list.sublist(4); + break; + case PkgManager.pacman: + case PkgManager.opkg: + break; default: return; } - upgradeable = list.map((e) => UpgradePkgInfo(e, dist!)).toList(); + upgradeable = list.map((e) => UpgradePkgInfo(e, type)).toList(); } Future _update() async { switch (type) { - case _Type.yum: + case PkgManager.yum: return await client?.run(_wrap('yum check-update')).string; - case _Type.apt: + case PkgManager.apt: await client!.exec( _wrap('apt update'), onStderr: _onPwd, @@ -142,6 +142,14 @@ class PkgProvider extends BusyProvider { return await client ?.run('apt list --upgradeable'.withLangExport) .string; + case PkgManager.zypper: + return await client?.run(_wrap('zypper lu')).string; + case PkgManager.pacman: + await client?.run('pacman -Sy'); + return await client?.run(_wrap('pacman -Qu')).string; + case PkgManager.opkg: + await client?.run('opkg update'); + return await client?.run(_wrap('opkg list-upgradable')).string; default: error = 'Unsupported dist: $dist'; return null; @@ -151,10 +159,16 @@ class PkgProvider extends BusyProvider { Future upgrade() async { final upgradeCmd = () { switch (type) { - case _Type.yum: + case PkgManager.yum: return 'yum upgrade -y'; - case _Type.apt: + case PkgManager.apt: return 'apt upgrade -y'; + case PkgManager.zypper: + return 'zypper up -y'; + case PkgManager.pacman: + return 'pacman -Syu --noconfirm'; + case PkgManager.opkg: + return 'opkg upgrade ${upgradeable?.map((e) => e.package).join(" ")}'; default: return null; }