From e068fe1a387ca17bde0605774f6031d868a004e6 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Jan 2025 18:26:55 +0000 Subject: [PATCH 1/2] Remove non-storage functionality from satorictl --- Cargo.lock | 3 +- ctl/Cargo.toml | 1 - ctl/src/cli/archive/mod.rs | 65 ---------- ctl/src/cli/debug.rs | 122 ------------------ ctl/src/cli/{archive => }/delete_event.rs | 0 ctl/src/cli/{archive => }/delete_segment.rs | 0 ctl/src/cli/{archive => }/explore/app/mod.rs | 0 .../explore/app/panels/camera_list.rs | 4 +- .../explore/app/panels/event_list.rs | 2 +- .../{archive => }/explore/app/panels/mod.rs | 0 .../explore/app/panels/trigger_list.rs | 2 +- ctl/src/cli/{archive => }/explore/mod.rs | 0 .../cli/{archive => }/explore/table_scroll.rs | 0 ctl/src/cli/{archive => }/export_video.rs | 0 ctl/src/cli/{archive => }/get_event.rs | 0 ctl/src/cli/{archive => }/get_segment.rs | 0 ctl/src/cli/{archive => }/list_cameras.rs | 0 ctl/src/cli/{archive => }/list_events.rs | 0 ctl/src/cli/{archive => }/list_segments.rs | 0 ctl/src/cli/mod.rs | 77 ++++++----- ctl/src/cli/{archive => }/prune_events.rs | 0 ctl/src/cli/{archive => }/prune_segments.rs | 0 ctl/src/cli/trigger.rs | 67 ---------- ctl/src/main.rs | 11 +- 24 files changed, 62 insertions(+), 292 deletions(-) delete mode 100644 ctl/src/cli/archive/mod.rs delete mode 100644 ctl/src/cli/debug.rs rename ctl/src/cli/{archive => }/delete_event.rs (100%) rename ctl/src/cli/{archive => }/delete_segment.rs (100%) rename ctl/src/cli/{archive => }/explore/app/mod.rs (100%) rename ctl/src/cli/{archive => }/explore/app/panels/camera_list.rs (97%) rename ctl/src/cli/{archive => }/explore/app/panels/event_list.rs (98%) rename ctl/src/cli/{archive => }/explore/app/panels/mod.rs (100%) rename ctl/src/cli/{archive => }/explore/app/panels/trigger_list.rs (97%) rename ctl/src/cli/{archive => }/explore/mod.rs (100%) rename ctl/src/cli/{archive => }/explore/table_scroll.rs (100%) rename ctl/src/cli/{archive => }/export_video.rs (100%) rename ctl/src/cli/{archive => }/get_event.rs (100%) rename ctl/src/cli/{archive => }/get_segment.rs (100%) rename ctl/src/cli/{archive => }/list_cameras.rs (100%) rename ctl/src/cli/{archive => }/list_events.rs (100%) rename ctl/src/cli/{archive => }/list_segments.rs (100%) rename ctl/src/cli/{archive => }/prune_events.rs (100%) rename ctl/src/cli/{archive => }/prune_segments.rs (100%) delete mode 100644 ctl/src/cli/trigger.rs diff --git a/Cargo.lock b/Cargo.lock index a0f93b61..19aea2b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -2621,7 +2621,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "url", ] [[package]] diff --git a/ctl/Cargo.toml b/ctl/Cargo.toml index 7be8e2c3..f820e69d 100644 --- a/ctl/Cargo.toml +++ b/ctl/Cargo.toml @@ -16,4 +16,3 @@ satori-storage.workspace = true tokio.workspace = true tracing.workspace = true tracing-subscriber.workspace = true -url.workspace = true diff --git a/ctl/src/cli/archive/mod.rs b/ctl/src/cli/archive/mod.rs deleted file mode 100644 index b3984187..00000000 --- a/ctl/src/cli/archive/mod.rs +++ /dev/null @@ -1,65 +0,0 @@ -mod delete_event; -mod delete_segment; -mod explore; -mod export_video; -mod get_event; -mod get_segment; -mod list_cameras; -mod list_events; -mod list_segments; -mod prune_events; -mod prune_segments; - -use super::{CliExecute, CliResult, CliResultWithValue}; -use async_trait::async_trait; -use clap::{Parser, Subcommand}; -use satori_storage::StorageConfig; -use std::path::PathBuf; - -/// Interact with an archive target. -#[derive(Debug, Clone, Parser)] -pub(crate) struct ArchiveCommand { - /// Path to storage configuration. - #[arg(long)] - storage: PathBuf, - - #[command(subcommand)] - command: ArchiveSubcommand, -} - -#[async_trait] -impl CliExecute for ArchiveCommand { - async fn execute(&self) -> CliResult { - let storage_config: StorageConfig = satori_common::load_config_file(&self.storage); - let storage = storage_config.create_provider(); - - match &self.command { - ArchiveSubcommand::ListEvents(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::ListCameras(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::ListSegments(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::GetEvent(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::GetSegment(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::DeleteEvent(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::DeleteSegment(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::PruneEvents(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::PruneSegments(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::ExportVideo(cmd) => cmd.execute(storage).await, - ArchiveSubcommand::Explore(cmd) => cmd.execute(storage).await, - } - } -} - -#[derive(Debug, Clone, Subcommand)] -pub(crate) enum ArchiveSubcommand { - ListEvents(list_events::ListEventsCommand), - ListCameras(list_cameras::ListCamerasCommand), - ListSegments(list_segments::ListSegmentsCommand), - GetEvent(get_event::GetEventCommand), - GetSegment(get_segment::GetSegmentCommand), - DeleteEvent(delete_event::DeleteEventCommand), - DeleteSegment(delete_segment::DeleteSegmentCommand), - PruneEvents(prune_events::PruneEventsCommand), - PruneSegments(prune_segments::PruneSegmentsCommand), - ExportVideo(export_video::ExportVideoSubcommand), - Explore(explore::ExploreCommand), -} diff --git a/ctl/src/cli/debug.rs b/ctl/src/cli/debug.rs deleted file mode 100644 index 846db657..00000000 --- a/ctl/src/cli/debug.rs +++ /dev/null @@ -1,122 +0,0 @@ -use super::{CliExecute, CliResult}; -use async_trait::async_trait; -use clap::{Parser, Subcommand}; -use satori_common::{ - mqtt::{AsyncClientExt, MqttClient, MqttConfig, PublishExt}, - ArchiveCommand, ArchiveSegmentsCommand, Event, EventMetadata, Message, Trigger, -}; -use std::{path::PathBuf, time::Duration}; -use tracing::{info, warn}; -use url::Url; - -/// Debugging operations. -#[derive(Debug, Clone, Parser)] -pub(crate) struct DebugCommand { - /// Path to MQTT configuration - #[arg(long)] - mqtt: PathBuf, - - #[command(subcommand)] - command: DebugSubcommand, -} - -#[async_trait] -impl CliExecute for DebugCommand { - async fn execute(&self) -> CliResult { - let mqtt_config: MqttConfig = satori_common::load_config_file(&self.mqtt); - let mut mqtt_client: MqttClient = mqtt_config.into(); - - match &self.command { - DebugSubcommand::DumpMessages => loop { - tokio::select! { - _ = tokio::signal::ctrl_c() => { - info!("Exiting."); - break; - } - msg = mqtt_client.poll() => { - if let Some(msg) = msg { - match msg.try_payload_from_json::() { - Ok(msg) => { - info!("{:#?}", msg); - } - Err(_) => { - warn!("Failed to parse message"); - } - } - } - } - } - }, - DebugSubcommand::ArchiveEvent(cmd) => { - let trigger = Trigger { - metadata: EventMetadata { - id: "default-trigger".into(), - timestamp: chrono::Utc::now().into(), - }, - reason: cmd.reason.clone(), - cameras: vec!["camera-1".into(), "camera-2".into()], - pre: Duration::from_secs(120), - post: Duration::from_secs(60), - }; - let mut event: Event = trigger.into(); - event.cameras[0].segment_list = - vec!["one.ts".into(), "two.ts".into(), "three.ts".into()]; - event.cameras[1].segment_list = - vec!["four.ts".into(), "five.ts".into(), "six.ts".into()]; - let message = Message::ArchiveCommand(ArchiveCommand::EventMetadata(event)); - - let mut client = mqtt_client.client(); - let topic = mqtt_client.topic(); - client.publish_json(topic, &message).await; - mqtt_client.poll_until_message_is_sent().await; - } - DebugSubcommand::ArchiveSegments(cmd) => { - let message = - Message::ArchiveCommand(ArchiveCommand::Segments(ArchiveSegmentsCommand { - camera_name: cmd.camera.clone(), - camera_url: cmd.url.clone(), - segment_list: cmd.filename.clone(), - })); - - let mut client = mqtt_client.client(); - let topic = mqtt_client.topic(); - client.publish_json(topic, &message).await; - mqtt_client.poll_until_message_is_sent().await; - } - } - - mqtt_client.disconnect().await; - - Ok(()) - } -} - -#[derive(Debug, Clone, Subcommand)] -pub(crate) enum DebugSubcommand { - DumpMessages, - ArchiveEvent(DebugArchiveEventCommand), - ArchiveSegments(DebugArchiveSegmentsCommand), -} - -/// Send a dummy event to listening archivers. -#[derive(Debug, Clone, Parser)] -pub(crate) struct DebugArchiveEventCommand { - /// Reason to include in dummy event. - #[arg(long, default_value = "Debug event from satorictl")] - reason: String, -} - -/// Send a video segment list to listening archivers. -#[derive(Debug, Clone, Parser)] -pub(crate) struct DebugArchiveSegmentsCommand { - /// Name of the camera to retrieve segments from. - #[arg(long)] - camera: String, - - /// URL of the camera's HLS stream. - #[arg(long)] - url: Url, - - /// Filenames of segments to archive. - filename: Vec, -} diff --git a/ctl/src/cli/archive/delete_event.rs b/ctl/src/cli/delete_event.rs similarity index 100% rename from ctl/src/cli/archive/delete_event.rs rename to ctl/src/cli/delete_event.rs diff --git a/ctl/src/cli/archive/delete_segment.rs b/ctl/src/cli/delete_segment.rs similarity index 100% rename from ctl/src/cli/archive/delete_segment.rs rename to ctl/src/cli/delete_segment.rs diff --git a/ctl/src/cli/archive/explore/app/mod.rs b/ctl/src/cli/explore/app/mod.rs similarity index 100% rename from ctl/src/cli/archive/explore/app/mod.rs rename to ctl/src/cli/explore/app/mod.rs diff --git a/ctl/src/cli/archive/explore/app/panels/camera_list.rs b/ctl/src/cli/explore/app/panels/camera_list.rs similarity index 97% rename from ctl/src/cli/archive/explore/app/panels/camera_list.rs rename to ctl/src/cli/explore/app/panels/camera_list.rs index c641d952..f8636499 100644 --- a/ctl/src/cli/archive/explore/app/panels/camera_list.rs +++ b/ctl/src/cli/explore/app/panels/camera_list.rs @@ -2,9 +2,7 @@ use super::{ super::{border_style, highlight_style, App, KeyEventResult, SharedEvent}, PanelOperations, }; -use crate::cli::archive::explore::{ - reset_terminal, setup_terminal, table_scroll::TableScrollState, -}; +use crate::cli::explore::{reset_terminal, setup_terminal, table_scroll::TableScrollState}; use async_trait::async_trait; use crossterm::event::{KeyCode, KeyEvent}; use ratatui::{ diff --git a/ctl/src/cli/archive/explore/app/panels/event_list.rs b/ctl/src/cli/explore/app/panels/event_list.rs similarity index 98% rename from ctl/src/cli/archive/explore/app/panels/event_list.rs rename to ctl/src/cli/explore/app/panels/event_list.rs index 6dfa2217..e3aa6069 100644 --- a/ctl/src/cli/archive/explore/app/panels/event_list.rs +++ b/ctl/src/cli/explore/app/panels/event_list.rs @@ -2,7 +2,7 @@ use super::{ super::{border_style, highlight_style, App, KeyEventResult, SharedEvent}, PanelOperations, }; -use crate::cli::archive::explore::table_scroll::TableScrollState; +use crate::cli::explore::table_scroll::TableScrollState; use async_trait::async_trait; use crossterm::event::{KeyCode, KeyEvent}; use ratatui::{ diff --git a/ctl/src/cli/archive/explore/app/panels/mod.rs b/ctl/src/cli/explore/app/panels/mod.rs similarity index 100% rename from ctl/src/cli/archive/explore/app/panels/mod.rs rename to ctl/src/cli/explore/app/panels/mod.rs diff --git a/ctl/src/cli/archive/explore/app/panels/trigger_list.rs b/ctl/src/cli/explore/app/panels/trigger_list.rs similarity index 97% rename from ctl/src/cli/archive/explore/app/panels/trigger_list.rs rename to ctl/src/cli/explore/app/panels/trigger_list.rs index 92d81fc5..43cf5bef 100644 --- a/ctl/src/cli/archive/explore/app/panels/trigger_list.rs +++ b/ctl/src/cli/explore/app/panels/trigger_list.rs @@ -2,7 +2,7 @@ use super::{ super::{border_style, highlight_style, App, KeyEventResult, SharedEvent}, PanelOperations, }; -use crate::cli::archive::explore::table_scroll::TableScrollState; +use crate::cli::explore::table_scroll::TableScrollState; use async_trait::async_trait; use crossterm::event::{KeyCode, KeyEvent}; use ratatui::{ diff --git a/ctl/src/cli/archive/explore/mod.rs b/ctl/src/cli/explore/mod.rs similarity index 100% rename from ctl/src/cli/archive/explore/mod.rs rename to ctl/src/cli/explore/mod.rs diff --git a/ctl/src/cli/archive/explore/table_scroll.rs b/ctl/src/cli/explore/table_scroll.rs similarity index 100% rename from ctl/src/cli/archive/explore/table_scroll.rs rename to ctl/src/cli/explore/table_scroll.rs diff --git a/ctl/src/cli/archive/export_video.rs b/ctl/src/cli/export_video.rs similarity index 100% rename from ctl/src/cli/archive/export_video.rs rename to ctl/src/cli/export_video.rs diff --git a/ctl/src/cli/archive/get_event.rs b/ctl/src/cli/get_event.rs similarity index 100% rename from ctl/src/cli/archive/get_event.rs rename to ctl/src/cli/get_event.rs diff --git a/ctl/src/cli/archive/get_segment.rs b/ctl/src/cli/get_segment.rs similarity index 100% rename from ctl/src/cli/archive/get_segment.rs rename to ctl/src/cli/get_segment.rs diff --git a/ctl/src/cli/archive/list_cameras.rs b/ctl/src/cli/list_cameras.rs similarity index 100% rename from ctl/src/cli/archive/list_cameras.rs rename to ctl/src/cli/list_cameras.rs diff --git a/ctl/src/cli/archive/list_events.rs b/ctl/src/cli/list_events.rs similarity index 100% rename from ctl/src/cli/archive/list_events.rs rename to ctl/src/cli/list_events.rs diff --git a/ctl/src/cli/archive/list_segments.rs b/ctl/src/cli/list_segments.rs similarity index 100% rename from ctl/src/cli/archive/list_segments.rs rename to ctl/src/cli/list_segments.rs diff --git a/ctl/src/cli/mod.rs b/ctl/src/cli/mod.rs index 6389b0ac..6471378c 100644 --- a/ctl/src/cli/mod.rs +++ b/ctl/src/cli/mod.rs @@ -1,47 +1,66 @@ -mod archive; -mod debug; -mod trigger; +mod delete_event; +mod delete_segment; +mod explore; +mod export_video; +mod get_event; +mod get_segment; +mod list_cameras; +mod list_events; +mod list_segments; +mod prune_events; +mod prune_segments; +use super::{CliExecute, CliResult, CliResultWithValue}; use async_trait::async_trait; use clap::{Parser, Subcommand}; +use satori_storage::StorageConfig; +use std::path::PathBuf; -pub(crate) type CliResultWithValue = Result; -pub(crate) type CliResult = CliResultWithValue<()>; - -#[async_trait] -pub(crate) trait CliExecute { - async fn execute(&self) -> CliResult; -} - -/// Control Satori NVR. +/// Interact with a Satori NVR archive target. #[derive(Debug, Clone, Parser)] #[command(author, version = satori_common::version!(), about, long_about = None)] pub(crate) struct Cli { + /// Path to storage configuration. + #[arg(long)] + storage: PathBuf, + #[command(subcommand)] - command: Command, + command: ArchiveSubcommand, } #[async_trait] impl CliExecute for Cli { async fn execute(&self) -> CliResult { - self.command.execute().await + let storage_config: StorageConfig = satori_common::load_config_file(&self.storage); + let storage = storage_config.create_provider(); + + match &self.command { + ArchiveSubcommand::ListEvents(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::ListCameras(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::ListSegments(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::GetEvent(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::GetSegment(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::DeleteEvent(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::DeleteSegment(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::PruneEvents(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::PruneSegments(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::ExportVideo(cmd) => cmd.execute(storage).await, + ArchiveSubcommand::Explore(cmd) => cmd.execute(storage).await, + } } } #[derive(Debug, Clone, Subcommand)] -pub(crate) enum Command { - Trigger(trigger::TriggerCommand), - Archive(archive::ArchiveCommand), - Debug(debug::DebugCommand), -} - -#[async_trait] -impl CliExecute for Command { - async fn execute(&self) -> CliResult { - match self { - Command::Trigger(cmd) => cmd.execute().await, - Command::Archive(cmd) => cmd.execute().await, - Command::Debug(cmd) => cmd.execute().await, - } - } +pub(crate) enum ArchiveSubcommand { + ListEvents(list_events::ListEventsCommand), + ListCameras(list_cameras::ListCamerasCommand), + ListSegments(list_segments::ListSegmentsCommand), + GetEvent(get_event::GetEventCommand), + GetSegment(get_segment::GetSegmentCommand), + DeleteEvent(delete_event::DeleteEventCommand), + DeleteSegment(delete_segment::DeleteSegmentCommand), + PruneEvents(prune_events::PruneEventsCommand), + PruneSegments(prune_segments::PruneSegmentsCommand), + ExportVideo(export_video::ExportVideoSubcommand), + Explore(explore::ExploreCommand), } diff --git a/ctl/src/cli/archive/prune_events.rs b/ctl/src/cli/prune_events.rs similarity index 100% rename from ctl/src/cli/archive/prune_events.rs rename to ctl/src/cli/prune_events.rs diff --git a/ctl/src/cli/archive/prune_segments.rs b/ctl/src/cli/prune_segments.rs similarity index 100% rename from ctl/src/cli/archive/prune_segments.rs rename to ctl/src/cli/prune_segments.rs diff --git a/ctl/src/cli/trigger.rs b/ctl/src/cli/trigger.rs deleted file mode 100644 index 80155ec1..00000000 --- a/ctl/src/cli/trigger.rs +++ /dev/null @@ -1,67 +0,0 @@ -use super::{CliExecute, CliResult}; -use async_trait::async_trait; -use clap::Parser; -use satori_common::{ - mqtt::{AsyncClientExt, MqttClient, MqttConfig}, - Message, -}; -use std::{path::PathBuf, time::Duration}; - -/// Manually send a trigger command. -#[derive(Debug, Clone, Parser)] -pub(crate) struct TriggerCommand { - /// Path to MQTT configuration. - #[arg(long)] - mqtt: PathBuf, - - /// String used to uniquely identify different distinct trigger scenarios. - #[arg(long)] - id: String, - - /// Timestamp of this trigger, defaults to now if not specified. - #[arg(long)] - timestamp: Option>, - - /// Name of the cameras that are affected by the trigger. - #[arg(long)] - camera: Option>, - - /// A human readable reason for this trigger. - #[arg(long)] - reason: Option, - - /// Time into the past. - #[arg(long)] - pre: Option, - - /// Time into the future. - #[arg(long)] - post: Option, -} - -#[async_trait] -impl CliExecute for TriggerCommand { - async fn execute(&self) -> CliResult { - let mqtt_config: MqttConfig = satori_common::load_config_file(&self.mqtt); - let mut mqtt_client: MqttClient = mqtt_config.into(); - - let trigger = satori_common::TriggerCommand { - id: self.id.clone(), - timestamp: self.timestamp, - cameras: self.camera.clone(), - reason: self.reason.clone(), - pre: self.pre.map(Duration::from_secs), - post: self.post.map(Duration::from_secs), - }; - let message = Message::TriggerCommand(trigger); - - let mut client = mqtt_client.client(); - let topic = mqtt_client.topic(); - client.publish_json(topic, &message).await; - mqtt_client.poll_until_message_is_sent().await; - - mqtt_client.disconnect().await; - - Ok(()) - } -} diff --git a/ctl/src/main.rs b/ctl/src/main.rs index 0f9e936a..9508546f 100644 --- a/ctl/src/main.rs +++ b/ctl/src/main.rs @@ -1,8 +1,17 @@ mod cli; -use crate::cli::{Cli, CliExecute, CliResult}; +use crate::cli::Cli; +use async_trait::async_trait; use clap::Parser; +pub(crate) type CliResultWithValue = Result; +pub(crate) type CliResult = CliResultWithValue<()>; + +#[async_trait] +pub(crate) trait CliExecute { + async fn execute(&self) -> CliResult; +} + #[tokio::main] async fn main() -> CliResult { tracing_subscriber::fmt::init(); From bbaa1d8e30211cbcb6a99539392a14b0b7a0143f Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Jan 2025 18:40:03 +0000 Subject: [PATCH 2/2] Rename satorictl => satori-storage-cli --- .github/workflows/ci.yml | 2 +- Cargo.lock | 34 +++++++++---------- Cargo.toml | 2 +- flake.nix | 4 +-- {ctl => storage-cli}/Cargo.toml | 2 +- {ctl => storage-cli}/default.nix | 12 +++---- {ctl => storage-cli}/src/cli/delete_event.rs | 0 .../src/cli/delete_segment.rs | 0 .../src/cli/explore/app/mod.rs | 5 ++- .../src/cli/explore/app/panels/camera_list.rs | 0 .../src/cli/explore/app/panels/event_list.rs | 0 .../src/cli/explore/app/panels/mod.rs | 0 .../cli/explore/app/panels/trigger_list.rs | 0 {ctl => storage-cli}/src/cli/explore/mod.rs | 0 .../src/cli/explore/table_scroll.rs | 0 {ctl => storage-cli}/src/cli/export_video.rs | 0 {ctl => storage-cli}/src/cli/get_event.rs | 0 {ctl => storage-cli}/src/cli/get_segment.rs | 0 {ctl => storage-cli}/src/cli/list_cameras.rs | 0 {ctl => storage-cli}/src/cli/list_events.rs | 0 {ctl => storage-cli}/src/cli/list_segments.rs | 0 {ctl => storage-cli}/src/cli/mod.rs | 0 {ctl => storage-cli}/src/cli/prune_events.rs | 0 .../src/cli/prune_segments.rs | 0 {ctl => storage-cli}/src/main.rs | 0 25 files changed, 32 insertions(+), 29 deletions(-) rename {ctl => storage-cli}/Cargo.toml (93%) rename {ctl => storage-cli}/default.nix (67%) rename {ctl => storage-cli}/src/cli/delete_event.rs (100%) rename {ctl => storage-cli}/src/cli/delete_segment.rs (100%) rename {ctl => storage-cli}/src/cli/explore/app/mod.rs (98%) rename {ctl => storage-cli}/src/cli/explore/app/panels/camera_list.rs (100%) rename {ctl => storage-cli}/src/cli/explore/app/panels/event_list.rs (100%) rename {ctl => storage-cli}/src/cli/explore/app/panels/mod.rs (100%) rename {ctl => storage-cli}/src/cli/explore/app/panels/trigger_list.rs (100%) rename {ctl => storage-cli}/src/cli/explore/mod.rs (100%) rename {ctl => storage-cli}/src/cli/explore/table_scroll.rs (100%) rename {ctl => storage-cli}/src/cli/export_video.rs (100%) rename {ctl => storage-cli}/src/cli/get_event.rs (100%) rename {ctl => storage-cli}/src/cli/get_segment.rs (100%) rename {ctl => storage-cli}/src/cli/list_cameras.rs (100%) rename {ctl => storage-cli}/src/cli/list_events.rs (100%) rename {ctl => storage-cli}/src/cli/list_segments.rs (100%) rename {ctl => storage-cli}/src/cli/mod.rs (100%) rename {ctl => storage-cli}/src/cli/prune_events.rs (100%) rename {ctl => storage-cli}/src/cli/prune_segments.rs (100%) rename {ctl => storage-cli}/src/main.rs (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f279962..5af9e9d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,8 +60,8 @@ jobs: package: - satori-agent - satori-archiver - - satorictl - satori-event-processor + - satori-storage-cli steps: - uses: actions/checkout@v4 diff --git a/Cargo.lock b/Cargo.lock index 19aea2b3..414f0fb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2587,37 +2587,37 @@ dependencies = [ ] [[package]] -name = "satori-testing-utils" +name = "satori-storage-cli" version = "0.3.1" dependencies = [ - "axum", + "async-trait", "chrono", - "ctor", - "m3u8-rs", - "nix", - "rand", - "reqwest", - "rumqttc", - "rust-s3", + "clap", + "crossterm", + "ratatui", + "rayon", "satori-common", - "tempfile", + "satori-storage", "tokio", "tracing", "tracing-subscriber", ] [[package]] -name = "satorictl" +name = "satori-testing-utils" version = "0.3.1" dependencies = [ - "async-trait", + "axum", "chrono", - "clap", - "crossterm", - "ratatui", - "rayon", + "ctor", + "m3u8-rs", + "nix", + "rand", + "reqwest", + "rumqttc", + "rust-s3", "satori-common", - "satori-storage", + "tempfile", "tokio", "tracing", "tracing-subscriber", diff --git a/Cargo.toml b/Cargo.toml index 70d5296a..504f0f76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,8 @@ members = [ "agent", "archiver", - "ctl", "event-processor", + "storage-cli", "integration-tests", ] diff --git a/flake.nix b/flake.nix index 6e98768e..1d7f2d24 100644 --- a/flake.nix +++ b/flake.nix @@ -69,8 +69,8 @@ packages = import ./agent {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;} // import ./archiver {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;} - // import ./ctl {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;} - // import ./event-processor {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;}; + // import ./event-processor {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;} + // import ./storage-cli {inherit pkgs rustPlatform version gitRevision nativeBuildInputs buildInputs;}; } ); } diff --git a/ctl/Cargo.toml b/storage-cli/Cargo.toml similarity index 93% rename from ctl/Cargo.toml rename to storage-cli/Cargo.toml index f820e69d..3d359cd5 100644 --- a/ctl/Cargo.toml +++ b/storage-cli/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "satorictl" +name = "satori-storage-cli" license.workspace = true version.workspace = true edition.workspace = true diff --git a/ctl/default.nix b/storage-cli/default.nix similarity index 67% rename from ctl/default.nix rename to storage-cli/default.nix index b326eec5..4d1e2d62 100644 --- a/ctl/default.nix +++ b/storage-cli/default.nix @@ -6,8 +6,8 @@ buildInputs, nativeBuildInputs, }: rec { - satorictl = rustPlatform.buildRustPackage { - pname = "satorictl"; + satori-storage-cli = rustPlatform.buildRustPackage { + pname = "satori-storage-cli"; version = version; src = ./..; @@ -16,7 +16,7 @@ nativeBuildInputs = nativeBuildInputs; buildInputs = buildInputs; - cargoBuildFlags = ["--package satorictl"]; + cargoBuildFlags = ["--package satori-storage-cli"]; GIT_REVISION = gitRevision; @@ -24,8 +24,8 @@ doCheck = false; }; - satorictl-container-image = pkgs.dockerTools.buildImage { - name = "satorictl"; + satori-storage-cli-container-image = pkgs.dockerTools.buildImage { + name = "satori-storage-cli"; tag = "latest"; created = "now"; @@ -36,7 +36,7 @@ }; config = { - Entrypoint = ["${pkgs.tini}/bin/tini" "--" "${satorictl}/bin/satorictl"]; + Entrypoint = ["${pkgs.tini}/bin/tini" "--" "${satori-storage-cli}/bin/satori-storage-cli"]; Env = [ "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ]; diff --git a/ctl/src/cli/delete_event.rs b/storage-cli/src/cli/delete_event.rs similarity index 100% rename from ctl/src/cli/delete_event.rs rename to storage-cli/src/cli/delete_event.rs diff --git a/ctl/src/cli/delete_segment.rs b/storage-cli/src/cli/delete_segment.rs similarity index 100% rename from ctl/src/cli/delete_segment.rs rename to storage-cli/src/cli/delete_segment.rs diff --git a/ctl/src/cli/explore/app/mod.rs b/storage-cli/src/cli/explore/app/mod.rs similarity index 98% rename from ctl/src/cli/explore/app/mod.rs rename to storage-cli/src/cli/explore/app/mod.rs index 29ca1a0c..cd0bff90 100644 --- a/ctl/src/cli/explore/app/mod.rs +++ b/storage-cli/src/cli/explore/app/mod.rs @@ -200,7 +200,10 @@ fn render_event_info_pane(f: &mut Frame, app: &mut App, area: Rec fn render_app_info_pane(f: &mut Frame, _: &mut App, area: Rect) { let title = Line::from(vec![ - Span::styled("satorictl", Style::default().add_modifier(Modifier::BOLD)), + Span::styled( + "Satori storage explorer", + Style::default().add_modifier(Modifier::BOLD), + ), Span::raw(" "), Span::raw(satori_common::version!()), ]); diff --git a/ctl/src/cli/explore/app/panels/camera_list.rs b/storage-cli/src/cli/explore/app/panels/camera_list.rs similarity index 100% rename from ctl/src/cli/explore/app/panels/camera_list.rs rename to storage-cli/src/cli/explore/app/panels/camera_list.rs diff --git a/ctl/src/cli/explore/app/panels/event_list.rs b/storage-cli/src/cli/explore/app/panels/event_list.rs similarity index 100% rename from ctl/src/cli/explore/app/panels/event_list.rs rename to storage-cli/src/cli/explore/app/panels/event_list.rs diff --git a/ctl/src/cli/explore/app/panels/mod.rs b/storage-cli/src/cli/explore/app/panels/mod.rs similarity index 100% rename from ctl/src/cli/explore/app/panels/mod.rs rename to storage-cli/src/cli/explore/app/panels/mod.rs diff --git a/ctl/src/cli/explore/app/panels/trigger_list.rs b/storage-cli/src/cli/explore/app/panels/trigger_list.rs similarity index 100% rename from ctl/src/cli/explore/app/panels/trigger_list.rs rename to storage-cli/src/cli/explore/app/panels/trigger_list.rs diff --git a/ctl/src/cli/explore/mod.rs b/storage-cli/src/cli/explore/mod.rs similarity index 100% rename from ctl/src/cli/explore/mod.rs rename to storage-cli/src/cli/explore/mod.rs diff --git a/ctl/src/cli/explore/table_scroll.rs b/storage-cli/src/cli/explore/table_scroll.rs similarity index 100% rename from ctl/src/cli/explore/table_scroll.rs rename to storage-cli/src/cli/explore/table_scroll.rs diff --git a/ctl/src/cli/export_video.rs b/storage-cli/src/cli/export_video.rs similarity index 100% rename from ctl/src/cli/export_video.rs rename to storage-cli/src/cli/export_video.rs diff --git a/ctl/src/cli/get_event.rs b/storage-cli/src/cli/get_event.rs similarity index 100% rename from ctl/src/cli/get_event.rs rename to storage-cli/src/cli/get_event.rs diff --git a/ctl/src/cli/get_segment.rs b/storage-cli/src/cli/get_segment.rs similarity index 100% rename from ctl/src/cli/get_segment.rs rename to storage-cli/src/cli/get_segment.rs diff --git a/ctl/src/cli/list_cameras.rs b/storage-cli/src/cli/list_cameras.rs similarity index 100% rename from ctl/src/cli/list_cameras.rs rename to storage-cli/src/cli/list_cameras.rs diff --git a/ctl/src/cli/list_events.rs b/storage-cli/src/cli/list_events.rs similarity index 100% rename from ctl/src/cli/list_events.rs rename to storage-cli/src/cli/list_events.rs diff --git a/ctl/src/cli/list_segments.rs b/storage-cli/src/cli/list_segments.rs similarity index 100% rename from ctl/src/cli/list_segments.rs rename to storage-cli/src/cli/list_segments.rs diff --git a/ctl/src/cli/mod.rs b/storage-cli/src/cli/mod.rs similarity index 100% rename from ctl/src/cli/mod.rs rename to storage-cli/src/cli/mod.rs diff --git a/ctl/src/cli/prune_events.rs b/storage-cli/src/cli/prune_events.rs similarity index 100% rename from ctl/src/cli/prune_events.rs rename to storage-cli/src/cli/prune_events.rs diff --git a/ctl/src/cli/prune_segments.rs b/storage-cli/src/cli/prune_segments.rs similarity index 100% rename from ctl/src/cli/prune_segments.rs rename to storage-cli/src/cli/prune_segments.rs diff --git a/ctl/src/main.rs b/storage-cli/src/main.rs similarity index 100% rename from ctl/src/main.rs rename to storage-cli/src/main.rs