b51a6a87f4deafdd4d61fa83f34867a81410103c
4 time
::{self, Duration
},
9 message
::header
::ContentType
, transport
::smtp
::authentication
::Credentials
, Message
,
10 SmtpTransport
, Transport
,
12 use rand
::{rngs
::ThreadRng
, Rng
};
14 use crate::config
::Config
;
18 const FILE_CONF
: &str = "config.ron";
19 const PING_PERIOD
: Duration
= Duration
::from_secs(5); // 5 s.
20 const EMAIL_RESEND_PERIOD
: Duration
= Duration
::from_secs(2 * 60 * 60); // 2 h.
21 const STATE_PRINT_PERIOD
: Duration
= Duration
::from_secs(15 * 60); // 15 min.
23 fn main() -> Result
<()> {
24 println!("Staking Watchdog Watchdog");
26 let config
= Config
::read(FILE_CONF
)?
;
29 "Configuration: {:?}",
31 smtp_password
: "*****".to_string(),
36 let mut time_last_email_send
= time
::Instant
::now() - EMAIL_RESEND_PERIOD
;
37 let mut time_last_state_printed
= time
::Instant
::now() - STATE_PRINT_PERIOD
;
38 let mut error_state
= false;
40 let mut rng
= rand
::thread_rng();
42 let socket
= UdpSocket
::bind("0.0.0.0:0").unwrap();
43 socket
.connect("192.168.2.102:8739").unwrap();
45 .set_read_timeout(Some(Duration
::from_secs(5)))
48 .set_write_timeout(Some(Duration
::from_secs(5)))
52 let time_beginning_loop
= time
::Instant
::now();
54 if let Err(error
) = ping(&socket
, &mut rng
) {
56 println!("Error: {:?}", error
);
57 if time
::Instant
::now() - time_last_email_send
>= EMAIL_RESEND_PERIOD
{
59 println!("Sending email...");
62 &format!("Error: {:?}", error
),
64 &config
.smtp_password
,
66 Err(email_error
) => println!("Error sending email: {:?}", email_error
),
68 println!("Email successfully sent");
69 time_last_email_send
= time
::Instant
::now();
76 println!("End of erroneous state");
79 if time
::Instant
::now() - time_last_state_printed
>= STATE_PRINT_PERIOD
{
80 println!("No error detected");
81 time_last_state_printed
= time
::Instant
::now();
85 let elapsed
= time
::Instant
::now() - time_beginning_loop
;
87 if elapsed
< PING_PERIOD
{
88 let to_wait
= PING_PERIOD
- elapsed
;
89 thread
::sleep(to_wait
);
96 SocketError(std
::io
::Error
),
97 WrongMessageReceived(String
),
100 fn ping(socket
: &UdpSocket
, rng
: &mut ThreadRng
) -> std
::result
::Result
<(), PingError
> {
101 let number
: u64 = rng
.gen();
102 let mut buffer
= number
.to_le_bytes();
104 match socket
.send(&buffer
) {
107 match socket
.recv(&mut buffer
) {
108 Ok(size_received
) => {
109 if size_received
== 8 {
110 let number_received
= u64::from_le_bytes(buffer
);
111 if number_received
!= number
{
112 return Err(PingError
::WrongMessageReceived(format!(
113 "Message number receceived ({}) is not equal to the one sent ({})",
114 number_received
, number
118 return Err(PingError
::WrongMessageReceived(format!(
119 "Size of packet must be 8, received size: {}",
124 Err(error
) => return Err(PingError
::SocketError(error
)),
127 Err(error
) => return Err(PingError
::SocketError(error
)),
133 fn send_email(title
: &str, body
: &str, login
: &str, pass
: &str) -> Result
<()> {
134 let email
= Message
::builder()
136 .from("Staking Watchdog <redmine@d-lan.net>".parse()?
)
137 .to("Greg Burri <greg.burri@gmail.com>".parse()?
)
139 .header(ContentType
::TEXT_PLAIN
)
140 .body(body
.to_string())?
;
142 let creds
= Credentials
::new(login
.to_string(), pass
.to_string());
144 // Open a remote connection to gmail
145 let mailer
= SmtpTransport
::relay("mail.gandi.net")?
150 let response
= mailer
.send(&email
)?
;
152 println!("{:?}", response
);