Skip to main content

brandmeister/
lib.rs

1//! This simple library verifies the last time a ham-radio repeater was seen on the [BrandMeister] network
2//! using [BrandMeister]'s API returns the time elapsed in seconds.
3//! It is not a full client for the brandmeister API.
4//!
5//! See check_brandmeister for a client implementing a [nagios] plugin using this library.
6//!
7//! [BrandMeister]: https://brandmeister.network/
8//! [nagios]: https://nagios-plugins.org/doc/guidelines.html
9
10#![warn(missing_docs)]
11
12use anyhow::{Context, Result};
13use chrono::{TimeZone, Utc};
14use serde::Deserialize;
15
16#[derive(Debug, Deserialize)]
17struct RepeaterStatus {
18    last_updated: String,
19}
20
21fn get_bm_repeater_last_update(repeater_id: u32) -> Result<String, anyhow::Error> {
22    let request_url = format!(
23        "http://api.brandmeister.network/v1.0/repeater/?action=get&q={}",
24        repeater_id
25    );
26    let status: RepeaterStatus = ureq::get(&request_url)
27        .call()?
28        .into_json()
29        .context("error parsing brandmeister API result, ensure repeater id is valid")?;
30    Ok(status.last_updated)
31}
32
33/// Return the number of seconds since the repeater was seen online on BrandMeister.
34///
35/// Example:
36/// ```no_run
37/// use check_brandmeister::last_seen_seconds;
38/// let min :u32 = last_seen_seconds("270107");
39/// ```
40pub fn last_seen_seconds(repeater_id: u32) -> Result<i64> {
41    let last_update_str = get_bm_repeater_last_update(repeater_id)?;
42    let last_update = Utc.datetime_from_str(&last_update_str, "%Y-%m-%d %H:%M:%S")?;
43    Ok(Utc::now().signed_duration_since(last_update).num_seconds())
44}