Show dialog for ssh output

This commit is contained in:
lemoer 2025-07-07 21:27:50 +02:00
parent 4a41bad5b6
commit 171831994a

View File

@ -81,12 +81,23 @@ class MyHomePage extends StatefulWidget {
class _MyHomePageState extends State<MyHomePage> {
int navIndex = 0;
OpenSSHEd25519KeyPair? keyPair;
String _output = '';
String? _output;
SSHClient? client;
String key = '';
Future<void> doSSH(String user) async {
SSHSocket? socket;
if (client != null) {
// If we already have a client, close it
client!.close();
client = null;
}
setState(() {
_output = null;
});
try {
socket = await SSHSocket.connect(
'192.168.0.15',
@ -94,17 +105,48 @@ class _MyHomePageState extends State<MyHomePage> {
timeout: const Duration(seconds: 0, milliseconds: 500),
);
final client = SSHClient(
client = SSHClient(
socket,
username: user,
identities: List.of(keyPair != null ? [keyPair!] : []),
);
final uptime = await client.run('uptime');
setState(() {
_output = utf8.decode(uptime);
_output = 'Connecting to SSH server...\n\n';
});
if (client == null) {
return;
}
final shell = await client!.shell();
shell.stdout.listen((data) {
setState(() {
if (_output == null) {
return;
}
_output = _output! + utf8.decode(data);
});
});
if (client == null) {
return;
}
await shell.done;
if (client == null) {
return;
}
client!.close();
setState(() {
_output = null;
});
} on SSHAuthError catch (_) {
setState(() {
_output = null;
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
@ -115,6 +157,9 @@ class _MyHomePageState extends State<MyHomePage> {
);
return;
} on SocketException catch (_) {
setState(() {
_output = null;
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
@ -382,11 +427,7 @@ class _MyHomePageState extends State<MyHomePage> {
),
);
if (authentikApiState.isClosed()) {
return mainPage;
}
Widget title;
Widget? title;
var children = <Widget>[];
var actions = [
TextButton(onPressed: authentikApiState.exit, child: Text("Cancel")),
@ -394,7 +435,7 @@ class _MyHomePageState extends State<MyHomePage> {
switch (authentikApiState.status) {
case AuthentikUserSettingsChangeDialogStatus.closed:
return mainPage;
break;
case AuthentikUserSettingsChangeDialogStatus.waitingForOAuth:
title = Text("Waiting for OAuth");
children = [Text("Please complete the OAuth flow in your browser.")];
@ -429,6 +470,31 @@ class _MyHomePageState extends State<MyHomePage> {
children = [Text("Saving...")];
}
if (_output != null) {
title = Text("SSH Output");
children.add(Text(_output!, style: TextStyle(fontSize: 12)));
// TODO: fix action.
actions = [
TextButton(
onPressed: () {
setState(() {
_output = null;
if (client != null) {
client!.close();
client = null;
}
});
},
child: Text("Cancel"),
),
];
}
if (title == null) {
// If we have no title, just return the main page
return mainPage;
}
final dialog = AlertDialog(
title: title,
content: SingleChildScrollView(child: Column(children: children)),