ssh_ui

ssh_ui helps you painlessly turn a cursive-based terminal UI (TUI) into an application accessible over ssh. Designed to make the creation of BBS systems or ssh-based games simple, ssh_ui takes a minimally opinionated approach to opening a TUI up to remote connections, beyond requiring you to use cursive. The ssh server implementation is provided by russh.

The main function of the simplest ssh_ui-based application looks something like this:

```

[tokio::main]

async fn main() { let keypair = KeyPair::generatersa(3072, SignatureHash::SHA2256).unwrap(); let mut server = AppServer::newwithport(2222); let app = DialogApp {}; server.run(&[keypair], Arc::new(app)).await.unwrap(); } ```

First this generates a new keypair (but you should load several from disk for user-facing installations). Then it initializes a new AppServer on port 2222 and a new instance of a DialogApp, then calls AppServer::run to listen on the specified port for incoming connections. Let's look next at what makes AppServer tick.

``` struct DialogApp {}

impl App for DialogApp { fn on_load(&mut self) -> Result<(), Box> { Ok(()) }

fn new_session(&self) -> Box<dyn AppSession> {
    Box::new(DialogAppSession::new())
}

} ```

All it's doing here is providing a new DialogAppSession whenever there's a new incoming ssh connection. DialogAppSession is implemented as follows:

``` struct DialogAppSession {}

impl DialogAppSession { pub fn new() -> Self { Self {} } }

impl AppSession for DialogAppSession { fn onstart( &mut self, _siv: &mut Cursive, _sessionhandle: SessionHandle, pubkey: PublicKey, forcerefreshsender: Sender<()>, ) -> Result, Box> { println!("onstart"); Ok(Box::new( Dialog::around(TextView::new("Hello over ssh!")) .title("ssh_ui") .button("Quit", |s| s.quit()), )) } } ```

This is where the actual cursive TUI is created and returned to ssh_ui. You can return whatever TUI you want, and ssh_ui will take care of serving it to the client.

Contributions

If you'd like to use ssh_ui and it doesn't quite fit your needs, feel free to open an issue or pull request on the GitHub repository.