suricasta_rules/
lib.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// SPDX-FileCopyrightText: Copyright 2025 Jason Ish <jason@codemonkey.net>
3
4pub mod cli;
5pub mod paths;
6pub mod rulesets;
7pub mod sources;
8pub mod update;
9
10use anyhow::Result;
11
12pub fn run(cli: cli::Cli) -> Result<()> {
13    // If on Windows, always user --user mode for now.
14    let user = cfg!(target_os = "windows") || cli.user;
15
16    let path_provider = paths::get_path_provider(user);
17
18    match cli.command {
19        cli::Commands::Update { force, quiet } => {
20            let update_manager = update::UpdateManager::new(path_provider.as_ref());
21            update_manager.update(force, quiet)
22        }
23
24        cli::Commands::EnableRuleset { name } => {
25            let source_manager = sources::SourceManager::new(path_provider.as_ref());
26            let ruleset_manager = rulesets::RulesetManager::new(path_provider.as_ref());
27
28            // Get index, download if missing
29            let source_index = source_manager.get_or_download_index()?;
30
31            let source_name = match name {
32                Some(n) => n,
33                None => match ruleset_manager.select_source(&source_index)? {
34                    Some(n) => n,
35                    None => return Ok(()),
36                },
37            };
38
39            let source_info = source_index.sources.get(&source_name);
40            if source_info.is_none() {
41                return Err(anyhow::anyhow!("Unknown ruleset: {}", source_name));
42            }
43
44            ruleset_manager.enable_source(&source_name, source_info)
45        }
46        cli::Commands::DisableRuleset { name } => {
47            let ruleset_manager = rulesets::RulesetManager::new(path_provider.as_ref());
48
49            let source_name = match name {
50                Some(n) => n,
51                None => match ruleset_manager.select_enabled_source()? {
52                    Some(n) => n,
53                    None => return Ok(()),
54                },
55            };
56
57            ruleset_manager.disable_source(&source_name)
58        }
59        cli::Commands::UpdateSources => {
60            let source_manager = sources::SourceManager::new(path_provider.as_ref());
61            source_manager.update_sources()
62        }
63    }
64}