diff --git a/lib/core/extension/numx.dart b/lib/core/extension/numx.dart index efee581c..8bf6744e 100644 --- a/lib/core/extension/numx.dart +++ b/lib/core/extension/numx.dart @@ -1,5 +1,5 @@ extension NumX on num { - String get convertBytes { + String get bytes2Str { const suffix = ['B', 'KB', 'MB', 'GB', 'TB']; double value = toDouble(); int squareTimes = 0; @@ -12,10 +12,12 @@ extension NumX on num { } return '$finalValue ${suffix[squareTimes]}'; } + + String get kb2Str => (this * 1024).bytes2Str; } extension BigIntX on BigInt { - String get convertBytes { + String get bytes2Str { const suffix = ['B', 'KB', 'MB', 'GB', 'TB']; double value = toDouble(); int squareTimes = 0; @@ -28,4 +30,6 @@ extension BigIntX on BigInt { } return '$finalValue ${suffix[squareTimes]}'; } + + String get kb2Str => (this * BigInt.from(1024)).bytes2Str; } diff --git a/lib/data/model/app/shell_func.dart b/lib/data/model/app/shell_func.dart index c0f98411..ab4658c9 100644 --- a/lib/data/model/app/shell_func.dart +++ b/lib/data/model/app/shell_func.dart @@ -214,7 +214,7 @@ const _statusCmds = [ 'cat /proc/stat | grep cpu', 'uptime', 'cat /proc/net/snmp', - 'df -h', + 'df -B 1K', "cat /proc/meminfo | grep -E 'Mem|Swap'", 'cat /sys/class/thermal/thermal_zone*/type', 'cat /sys/class/thermal/thermal_zone*/temp', @@ -246,7 +246,7 @@ const _bsdStatusCmd = [ 'uname -or', 'top -l 1 | grep "CPU usage"', 'uptime', - 'df -h', + 'df -k', 'top -l 1 | grep PhysMem', //'sysctl -a | grep temperature', 'hostname', diff --git a/lib/data/model/container/image.dart b/lib/data/model/container/image.dart index b3a8a5f2..86bdb295 100644 --- a/lib/data/model/container/image.dart +++ b/lib/data/model/container/image.dart @@ -34,7 +34,7 @@ final class PodmanImg implements ContainerImg { }); @override - String? get sizeMB => size?.convertBytes; + String? get sizeMB => size?.bytes2Str; @override int? get containersCount => containers; diff --git a/lib/data/model/server/disk.dart b/lib/data/model/server/disk.dart index b9a3bb71..df6485d1 100644 --- a/lib/data/model/server/disk.dart +++ b/lib/data/model/server/disk.dart @@ -7,9 +7,9 @@ class Disk { final String dev; final String mount; final int usedPercent; - final String used; - final String size; - final String avail; + final BigInt used; + final BigInt size; + final BigInt avail; const Disk({ required this.dev, @@ -20,6 +20,12 @@ class Disk { required this.avail, }); + /// raw: + /// ``` + /// Filesystem 1K-blocks Used Available Use% Mounted on + /// overlay 959122528 154470540 755857572 17% / + /// tmpfs 65536 0 65536 0% /dev + /// ``` static List parse(String raw) { final list = []; final items = raw.split('\n'); @@ -43,9 +49,9 @@ class Disk { dev: vals[0], mount: vals[5], usedPercent: int.parse(vals[4].replaceFirst('%', '')), - used: vals[2], - size: vals[1], - avail: vals[3], + used: BigInt.tryParse(vals[2]) ?? BigInt.zero, + size: BigInt.tryParse(vals[1]) ?? BigInt.one, + avail: BigInt.tryParse(vals[3]) ?? BigInt.one, )); } catch (e) { continue; @@ -79,8 +85,8 @@ class DiskIO extends TimeSeq { (String?, String?) getSpeed(String dev) { final (read_, write_) = _getSpeed(dev); if (read_ == null || write_ == null) return (null, null); - final read = '${read_.convertBytes}/s'; - final write = '${write_.convertBytes}/s'; + final read = '${read_.bytes2Str}/s'; + final write = '${write_.bytes2Str}/s'; return (read, write); } @@ -92,8 +98,8 @@ class DiskIO extends TimeSeq { read += read_ ?? 0; write += write_ ?? 0; } - final readStr = '${read.convertBytes}/s'; - final writeStr = '${write.convertBytes}/s'; + final readStr = '${read.bytes2Str}/s'; + final writeStr = '${write.bytes2Str}/s'; return (readStr, writeStr); } diff --git a/lib/data/model/server/net_speed.dart b/lib/data/model/server/net_speed.dart index 03e269c8..5f7290b5 100644 --- a/lib/data/model/server/net_speed.dart +++ b/lib/data/model/server/net_speed.dart @@ -47,10 +47,10 @@ class NetSpeed extends TimeSeq { for (var i = 0; i < now.length; i++) { size += sizeInBytes(i); } - return size.convertBytes; + return size.bytes2Str; } final idx = deviceIdx(device); - return sizeInBytes(idx).convertBytes; + return sizeInBytes(idx).bytes2Str; } String speedOut({String? device, bool all = false}) { @@ -73,10 +73,10 @@ class NetSpeed extends TimeSeq { for (var i = 0; i < now.length; i++) { size += sizeOutBytes(i); } - return size.convertBytes; + return size.bytes2Str; } final idx = deviceIdx(device); - return sizeOutBytes(idx).convertBytes; + return sizeOutBytes(idx).bytes2Str; } int deviceIdx(String? device) { @@ -90,7 +90,7 @@ class NetSpeed extends TimeSeq { return 0; } - String buildStandardOutput(double speed) => '${speed.convertBytes}/s'; + String buildStandardOutput(double speed) => '${speed.bytes2Str}/s'; /// [raw] example: /// Inter-| Receive | Transmit diff --git a/lib/data/res/status.dart b/lib/data/res/status.dart index 98b7e9be..7f2aa5c9 100644 --- a/lib/data/res/status.dart +++ b/lib/data/res/status.dart @@ -41,13 +41,13 @@ abstract final class InitStatus { avail: 1, ), disk: [ - const Disk( + Disk( dev: '/', mount: '/', usedPercent: 0, - used: '0', - size: '0', - avail: '0', + used: BigInt.zero, + size: BigInt.one, + avail: BigInt.zero, ) ], tcp: const Conn(maxConn: 0, active: 0, passive: 0, fail: 0), diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart index 1340933a..4818d5a5 100644 --- a/lib/view/page/private_key/edit.dart +++ b/lib/view/page/private_key/edit.dart @@ -193,8 +193,8 @@ class _PrivateKeyEditPageState extends State { context.showSnackBar( l10n.fileTooLarge( path, - size.convertBytes, - Miscs.privateKeyMaxSize.convertBytes, + size.bytes2Str, + Miscs.privateKeyMaxSize.bytes2Str, ), ); return; diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 5d657d42..8205f6c5 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -256,7 +256,7 @@ class _ServerDetailPageState extends State ), UIs.width7, Text( - 'of ${(ss.mem.total * 1024).convertBytes}', + 'of ${(ss.mem.total * 1024).bytes2Str}', style: UIs.text13Grey, ) ], @@ -297,7 +297,7 @@ class _ServerDetailPageState extends State Text('${used.toStringAsFixed(0)}%', style: UIs.text27), UIs.width7, Text( - 'of ${(ss.swap.total * 1024).convertBytes} ', + 'of ${(ss.swap.total * 1024).bytes2Str} ', style: UIs.text13Grey, ) ], @@ -452,7 +452,7 @@ class _ServerDetailPageState extends State Widget _buildDiskItem(Disk disk, ServerStatus ss) { final (read, write) = ss.diskIO.getSpeed(disk.dev); final text = () { - final use = '${disk.used} / ${disk.size}'; + final use = '${disk.used.kb2Str} / ${disk.size.kb2Str}'; if (read == null || write == null) return use; return '$use\n${l10n.read} $read | ${l10n.write} $write'; }(); diff --git a/lib/view/page/storage/local.dart b/lib/view/page/storage/local.dart index 3ad07f1c..44c31cf1 100644 --- a/lib/view/page/storage/local.dart +++ b/lib/view/page/storage/local.dart @@ -182,7 +182,7 @@ class _LocalStoragePageState extends State { title: Text(fileName), subtitle: isDir ? null - : Text(stat.size.convertBytes, style: UIs.textGrey), + : Text(stat.size.bytes2Str, style: UIs.textGrey), trailing: Text( stat.modified .toString() diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index d4b75f3d..f6f1c0c9 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -304,7 +304,7 @@ class _SftpPageState extends State with AfterLayoutMixin { subtitle: isDir ? null : Text( - (file.attr.size ?? 0).convertBytes, + (file.attr.size ?? 0).bytes2Str, style: UIs.textGrey, ), onTap: () { diff --git a/lib/view/page/storage/sftp_mission.dart b/lib/view/page/storage/sftp_mission.dart index ce47ee3c..05696410 100644 --- a/lib/view/page/storage/sftp_mission.dart +++ b/lib/view/page/storage/sftp_mission.dart @@ -94,7 +94,7 @@ class _SftpMissionPageState extends State { ); case SftpWorkerStatus.loading: final percentStr = (status.progress ?? 0.0).toStringAsFixed(2); - final size = (status.size ?? 0).convertBytes; + final size = (status.size ?? 0).bytes2Str; return _wrapInCard( status: status, subtitle: l10n.percentOfSize(percentStr, size),