mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 15:24:35 +01:00
opts: new logs page
This commit is contained in:
@@ -1,10 +1,38 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
/// format: [NAME][LEVEL]: MESSAGE
|
||||||
|
final _headReg = RegExp(r'(\[[A-Za-z]+\])(\[[A-Z]+\]): (.*)');
|
||||||
|
const _level2Color = {
|
||||||
|
'[INFO]': Colors.blue,
|
||||||
|
'[WARNING]': Colors.yellow,
|
||||||
|
};
|
||||||
|
|
||||||
class DebugProvider extends ChangeNotifier {
|
class DebugProvider extends ChangeNotifier {
|
||||||
final widgets = <Widget>[];
|
final widgets = <Widget>[];
|
||||||
|
|
||||||
void addText(String text) {
|
void addText(String text) {
|
||||||
|
final match = _headReg.allMatches(text);
|
||||||
|
|
||||||
|
if (match.isNotEmpty) {
|
||||||
|
addWidget(Text.rich(TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: match.first.group(1),
|
||||||
|
style: const TextStyle(color: Colors.cyan),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: match.first.group(2),
|
||||||
|
style: TextStyle(color: _level2Color[match.first.group(2)]),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: '\n${match.first.group(3)}',
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)));
|
||||||
|
} else {
|
||||||
_addText(text);
|
_addText(text);
|
||||||
|
}
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,17 +73,8 @@ class DebugProvider extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _addWidget(Widget widget) {
|
void _addWidget(Widget widget) {
|
||||||
final outlined = Container(
|
widgets.add(widget);
|
||||||
margin: const EdgeInsets.symmetric(vertical: 2),
|
widgets.add(const SizedBox(height: 13));
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(
|
|
||||||
color: Colors.green,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: widget,
|
|
||||||
);
|
|
||||||
|
|
||||||
widgets.add(outlined);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ final _editionReg = RegExp(r'(Client:)\s+(.+-.+)');
|
|||||||
final _dockerPrefixReg = RegExp(r'(sudo )?docker ');
|
final _dockerPrefixReg = RegExp(r'(sudo )?docker ');
|
||||||
|
|
||||||
const _dockerPS = 'docker ps -a';
|
const _dockerPS = 'docker ps -a';
|
||||||
|
const _dockerImgs = 'docker images';
|
||||||
|
|
||||||
final _logger = Logger('DockerProvider');
|
final _logger = Logger('DOCKER');
|
||||||
|
|
||||||
class DockerProvider extends BusyProvider {
|
class DockerProvider extends BusyProvider {
|
||||||
final dockerStore = locator<DockerStore>();
|
final dockerStore = locator<DockerStore>();
|
||||||
@@ -84,7 +85,7 @@ class DockerProvider extends BusyProvider {
|
|||||||
lines.removeWhere((element) => element.isEmpty);
|
lines.removeWhere((element) => element.isEmpty);
|
||||||
items = lines.map((e) => DockerPsItem.fromRawString(e)).toList();
|
items = lines.map((e) => DockerPsItem.fromRawString(e)).toList();
|
||||||
|
|
||||||
final imageCmd = _wrap('docker image ls');
|
final imageCmd = _wrap(_dockerImgs);
|
||||||
raw = '';
|
raw = '';
|
||||||
await client!.exec(
|
await client!.exec(
|
||||||
imageCmd,
|
imageCmd,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import 'package:toolbox/data/model/server/dist.dart';
|
|||||||
enum _Type { apt, yum, dnf, zypper, pkg, pacman, opkg }
|
enum _Type { apt, yum, dnf, zypper, pkg, pacman, opkg }
|
||||||
|
|
||||||
class PkgProvider extends BusyProvider {
|
class PkgProvider extends BusyProvider {
|
||||||
final logger = Logger('PkgProvider');
|
final logger = Logger('PKG');
|
||||||
|
|
||||||
SSHClient? client;
|
SSHClient? client;
|
||||||
Dist? dist;
|
Dist? dist;
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class ServerProvider extends BusyProvider {
|
|||||||
|
|
||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
|
|
||||||
final logger = Logger('ServerProvider');
|
final logger = Logger('SERVER');
|
||||||
|
|
||||||
Memory get emptyMemory =>
|
Memory get emptyMemory =>
|
||||||
Memory(total: 1, used: 0, free: 1, cache: 0, avail: 1);
|
Memory(total: 1, used: 0, free: 1, cache: 0, avail: 1);
|
||||||
@@ -132,6 +132,21 @@ class ServerProvider extends BusyProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void closeServer({ServerPrivateInfo? spi}) {
|
||||||
|
if (spi == null) {
|
||||||
|
for (var i = 0; i < _servers.length; i++) {
|
||||||
|
_servers[i].client?.close();
|
||||||
|
_servers[i].client = null;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final idx = _servers.indexWhere((e) => e.info == spi);
|
||||||
|
if (idx < 0) {
|
||||||
|
throw RangeError.index(idx, _servers);
|
||||||
|
}
|
||||||
|
_servers[idx].client?.close();
|
||||||
|
}
|
||||||
|
|
||||||
void addServer(ServerPrivateInfo spi) {
|
void addServer(ServerPrivateInfo spi) {
|
||||||
_servers.add(genInfo(spi));
|
_servers.add(genInfo(spi));
|
||||||
locator<ServerStore>().put(spi);
|
locator<ServerStore>().put(spi);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class _DebugPageState extends State<DebugPage> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('App log'),
|
title: const Text('Logs'),
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
),
|
),
|
||||||
body: _buildTerminal(context),
|
body: _buildTerminal(context),
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class _MyHomePageState extends State<MyHomePage>
|
|||||||
void dispose() {
|
void dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
WidgetsBinding.instance.removeObserver(this);
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
|
_serverProvider.closeServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Reference in New Issue
Block a user