author | Sunil Nimmagadda <sunil@nimmagadda.net> |
Tue, 23 Jan 2024 20:50:24 +0530 | |
changeset 22 | 809a5a9e5dd9 |
parent 9 | bde5cce81a8a |
permissions | -rw-r--r-- |
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 |
} |