Skip to main content

Monitor

Struct Monitor 

Source
pub struct Monitor { /* private fields */ }
Expand description

The live monitor.

Implementations§

Source§

impl Monitor

Source

pub async fn bind(cfg: &Config) -> Result<Self>

Open the listening socket, if this arrangement needs one.

A failure to bind is fatal, exactly as in autossh: without the listener the loop can never complete and every probe would fail.

Source

pub fn enabled(&self) -> bool

Source

pub fn listener_fd(&self) -> Option<RawFd>

The descriptor the monitor listens on, if it has one.

Exposed so a test can assert it is close-on-exec: were the forked ssh to inherit it, the port or socket would stay held after rash exited.

Source

pub fn next_forwards(&self) -> Vec<OsString>

The forwards for the next ssh start.

For the UNIX arrangement the remote socket path is different every time. A socket left behind on the remote by an unclean disconnect would stop sshd binding it, and StreamLocalBindUnlink defaults to no on the server — which a client cannot override. Without a fresh path, rash would restart for ever against a forward that could never come up.

Source

pub async fn probe(&self, cfg: &Config) -> bool

Send a probe and wait for it to come back. false means the tunnel is not carrying traffic and ssh should be restarted.

Trait Implementations§

Source§

impl Drop for Monitor

Source§

fn drop(&mut self)

Take the sockets away on the way out.

Binding already unlinks a stale file, so a leftover cannot break the next run — but without this the directory accumulates a dead pair per run, indefinitely. The pid file has the same guard, and the same limitation: a process killed with SIGKILL runs no destructors, so the next bind’s unlink is still the thing that guarantees correctness.

Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.