src/main.rs
author Sunil Nimmagadda <sunil@nimmagadda.net>
Tue, 30 Jan 2024 16:25:28 +0530
changeset 23 1bfa6fd5b5f9
parent 9 bde5cce81a8a
permissions -rw-r--r--
Use with_capacity as it's known by now.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
847fed6198dc Idiomatic imports with use.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 5
diff changeset
     1
use tokio::signal::unix;
847fed6198dc Idiomatic imports with use.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 5
diff changeset
     2
use tokio::time;
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     3
9
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     4
const ADV_INTERVAL: u64 = 1;
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     5
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     6
#[derive(Debug)]
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     7
enum VRRPv2State {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     8
    Initialize,
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
     9
    Backup,
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    10
    Master,
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    11
}
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    12
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    13
struct StateMachine {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    14
    state: VRRPv2State,
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    15
}
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    16
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    17
impl StateMachine {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    18
    fn new() -> Self {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    19
        StateMachine {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    20
            state: VRRPv2State::Initialize,
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    21
        }
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    22
    }
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    23
    fn transit_to(&mut self, new_state: VRRPv2State) {
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    24
        std::println!("vvrpd: {:?} -> {:?}", self.state, new_state);
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    25
        self.state = new_state;
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    26
    }
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    27
}
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    28
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    29
async fn advert_handler() {
9
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    30
    println!("advert timer fired");
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    31
}
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    32
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    33
async fn sighup_handler() {
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    34
    println!("got SIGHUP");
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    35
}
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    36
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    37
#[tokio::main(flavor = "current_thread")]
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
async fn main() {
9
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    39
    let advert_timer_handle = tokio::spawn(async move {
6
847fed6198dc Idiomatic imports with use.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 5
diff changeset
    40
        let mut advert_interval = time::interval(time::Duration::from_secs(ADV_INTERVAL));
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    41
        loop {
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    42
            advert_interval.tick().await;
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    43
            advert_handler().await;
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    44
        }
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    45
    });
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
    let sighup_handle = tokio::spawn(async move {
6
847fed6198dc Idiomatic imports with use.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 5
diff changeset
    47
        let mut stream =
847fed6198dc Idiomatic imports with use.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 5
diff changeset
    48
            unix::signal(unix::SignalKind::hangup()).expect("Should be a signal stream");
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    49
        loop {
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    50
            stream.recv().await;
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    51
            sighup_handler().await;
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    52
        }
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    53
    });
9
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    54
    let mut sm = StateMachine::new();
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    55
    sm.transit_to(VRRPv2State::Master);
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    56
    sm.transit_to(VRRPv2State::Backup);
bde5cce81a8a A skeletal state machine, wip.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
    57
    tokio::try_join!(advert_timer_handle, sighup_handle).expect("task(s) erred");
3
dfb0782a497f Backed out changeset 50156c8f38b0
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    58
}