* Fix/fix clippy warn (#434) - Fixed following Clippy Warnings(previous warning count: 671 -> after: 4) - clippy::needless_return - clippy::println_empty_string - clippy::redundant_field_names - clippy::single_char_pattern - clippy::len_zero - clippy::iter_nth_zero - clippy::bool_comparison - clippy::question_mark - clippy::needless_collect - clippy::unnecessary_unwrap - clippy::ptr_arg - clippy::needless_collect - clippy::needless_borrow - clippy::new_without_default - clippy::assign_op_pattern - clippy::bool_assert_comparison - clippy::into_iter_on_ref - clippy::deref_addrof - clippy::while_let_on_iterator - clippy::match_like_matches_macro - clippy::or_fun_call - clippy::useless_conversion - clippy::let_and_return - clippy::redundant_clone - clippy::redundant_closure - clippy::cmp_owned - clippy::upper_case_acronyms - clippy::map_identity - clippy::unused_io_amount - clippy::assertions_on_constants - clippy::op_ref - clippy::useless_vec - clippy::vec_init_then_push - clippy::useless_format - clippy::bind_instead_of_map - clippy::bool_comparison - clippy::clone_on_copy - clippy::too_many_arguments - clippy::module_inception - fixed clippy::needless_lifetimes - fixed clippy::borrowed_box (Thanks for helping by hach1yon!) * Merge main and output fix#443#444 (#445) * removed tools/sigmac (#441) * removed tools/sigmac - moved tools/sigmac to hayabusa-rules repo * fixed doc link tools/sigmac * fixed submodule track * fixed submodule track from latest to v1.1.0 tag * fixed link * erased enter #444 * erased enter #444 * reverted logo enter * fixed rules submodule target commit #444 Co-authored-by: Yamato Security <71482215+YamatoSecurity@users.noreply.github.com> * readme update screenshots etc (#448) * Opensslを静的にコンパイルするためにCargo.tomlの設定変更 (#437) * cargo update - openssl static * updated cargo * macos2apple * cargo update * cargo update * aliasキーがない場合もEvent.EventDataを自動で走査する (#442) * add no event key * support not-register-alias search * added checking EventData when key do not match in alias #290 - added checking key in Event.EventData, if key is not exist in eventkey_alias.txt. * cargo fmt * fixed panic when filter files does not exists * fixed errorlog format when filter config files does not exist Co-authored-by: DustInDark <nextsasasa@gmail.com> * changed downcast library from mopa to downcast_rs #447 (#450) * Fixed Clippy Warnings (#451) * fixed clippy warn * fixed cargo clippy warnging * fixed clippy warngings in clippy ver 0.1.59 * fixed clippy warnings clippy::unnecessary_to_owned * added temporary blackhat arsenal badge * added rust report card badges #453 * added repository maintenance levels badge #453 * documentation update macOS usage etc * update * added clippy workflow #428 (#429) * added clippy workflow #428 * fixed action yaml to run clippy #428 * fixed indent * fixed workflow * fixed workflow error * fixed indent * changed no annotation #428 * adujusted annotation version * fixed clippy::needless_match * remove if let exception * removed unnecessary permission check #428 * statistics event id update (#457) * Feature/#440 refactoring #395 (#464) * updated submodule * fix degrade for pull req #464 (#468) * fix degrade for pull req #464 * add trim * Fearture/ added output update result#410 (#452) * add git2 crate #391 * added Update option #391 * updated readme #391 * fixed cargo.lock * fixed option if-statement #391 * changed utc short option and rule-update short option #391 * updated readme * updated readme * fixed -u long option & version number update #391 * added fast-forwarding rules repository #391 * updated command line option #391 * moved output logo prev update rule * fixed readme #391 * removed recursive option in readme * changed rules update from clone and pull to submodule update #391 * fixed document * changed unnecessary clone recursively to clone only * English message update. * cargo fmt * English message update. (4657c35e5ccherry-pick) * added create rules folder when rules folder is not exist * fixed gitmodules github-rules url from ssh to https * added output of updated file #420 * fixed error #410 * changed update rule list seq * added test * fixed output #410 * fixed output and fixed output date field when modified field is lacked #410 * fixed compile error * fixed output - added enter after Latest rule update output - added output when no exist new rule - fixed Latest rule update date format - changed output from 'Latest rule update' to 'Latest rules update' * fixed compile error * changed modified date source from rules folder to each yml rule file * formatting use chrono in main.rs * merge develop clippy ci * fixed output when no update rule #410 - removed Latest rule update - no output "Rules update successfully" when No rule changed * Change English Co-authored-by: Tanaka Zakku <71482215+YamatoSecurity@users.noreply.github.com> * Remove unnecessary code from timeline_event_info and rename files for… (#470) * Remove unnecessary code from timeline_event_info and rename files for issue462 * Remove unnecessary code #462 * add equalsfield pipe (#467) * Enhancement: add config config #456 (#471) * added config option #456 * added process of option to speicifed config folder #456 following files adjust config option. * noisy_rules.txt * exclude_rules.txt * fixed usage in readme * updated rules submodule: * fixed process when yml file exist in .git folder * ignore when yml file exist in .git folder * Add: --level-tuning option's outline * Add: read Rule files * Add: input rule_level.txt files & read rules * cargo fmt * Add: level-tuning function * Reface: split to options file * WIP: Text overwrite failed... * Fix: Text overwrite was failed * Add: Error handlings * Add: id, level validation * mv: IDS_REGEX to configs file * fix: level tuning's file name * Cargo fmt * Pivot Keyword List機能の追加 (#412) * add get_pivot_keyword() func * change function name and call it's function * [WIP] support config file * compilete output * cargo fmt * [WIP] add test * add test * support -o option in pivot * add pivot mod * fix miss * pass test in pivot.rs * add comment * pass all test * add fast return * fix output * add test config file * review * rebase * cargo fmt * test pass * fix clippy in my commit * cargo fmt * little refactor * change file input logic and config format * [WIP] change output * [wip] change deta structure * change output & change data structure * pass test * add config * cargo fmt & clippy & rebase * fix cllipy * delete /rules/ in .gitignore * clean comment * clean * clean * fix rebase miss * fix rebase miss * fix clippy * file name output on -o to stdout * add pivot_keywords.txt to ./config * updated english * Documentation update * cargo fmt and clean * updated translate japanese * readme update * readme update Co-authored-by: DustInDark <nextsasasa@gmail.com> Co-authored-by: Tanaka Zakku <71482215+YamatoSecurity@users.noreply.github.com> * Add: test * Add: README.md * Cargo fmt * Use #[cfg(test)] * Fixed output stop when control char exist in windows terminal (#485) * added control character filter in details #382 * fixed document - removed fixed windows teminal caution in readme * fixed level tuning test and added test files #390 * changed level_tuning.txt header from next_level to new_level * fixed convert miss change to low level * added run args rules path to check test easy #390 * fixed comment out processing in level_tuning.txt * fixed config to show level-tuning option * fixed level-tuning option usage from required to option * reduce output mitre attack detail tachnique No. by config file (#483) * reduced mitre attck tag output by config file #477 * prepared 1.2.0 version toml * added test files and mitre attck strategy tag file #477 * fixed cargo.toml version * updated cargo.lock * output tag english update * cargo fmt Co-authored-by: Tanaka Zakku <71482215+YamatoSecurity@users.noreply.github.com> * Fix: test file's path was incorrect * Add: add test_files/config/level_tuning.txt * Add: Flush method. * inserted debug data * reverted config usage * fixed test yaml file path * Feature/#216 output allfields csvnewcolumn (#469) * refactoring * refactoring * under constructing * underconstructing * under construction * underconstructing * fix existing testcase * finish implement * fmt * add option * change name * fix control code bug * fix disp * change format and fix testcase * fix help * Fix: show usage when hayabusa has no args * rm: debug line * Enhance/warning architecture#478 (#482) * added enhance of architecture check #478 * changed check architecture process after output logo #478 * English msg update * fixed detect method of os-bit to windows and linux * removed mac and unix architecture and binary and updated its process of windows * fix clippy * added check on Wow64 env #478 * Update contributors.txt Co-authored-by: Tanaka Zakku <71482215+YamatoSecurity@users.noreply.github.com> * added --level-tuning option to usage * Revert "added --level-tuning option to usage" This reverts commite6a74090a3. * readme update * Update README-Japanese.md * readme, version, cargo update * typo fix * typo fix * rm: duplicated test & fix test name * Add: show logo, and some infos * small english fix * twitter link fix (#486) * added feature of tag output reducing to agg condition #477 (#488) * changed level output from informational to info #491 * updated rules submodule * v1.2 changelog update (#473) * changelog update * Update CHANGELOG.md added contributor in "Fields that are not defined in eventkey_alias.txt will automatically be searched in Event.EventData." ref #442 * Update CHANGELOG-Japanese.md Fields that are not defined in eventkey_alias.txt will automatically be searched in Event.EventData. added contributor in "Fields that are not defined in eventkey_alias.txt will automatically be searched in Event.EventData." ref #442 * Update CHANGELOG.md added bug fixes (#444) and `Performance and. accuracy` add contributor ref(#395) * Update CHANGELOG-Japanese.md * Translated v1.2 change log to Japanese v1.2の内容を日本語に修正 * fixed typo added lacked back quote. * added description added following issue and pr description to readme - #216 / #469 L8 - #390 / #459 L9 - #478 / #482 L19 - #477/ #483 L20 * added description README.md added following issue and pr description to readme - #216 / #469 L8 - #390 / #459 L9 - #478 / #482 L19 - #477/ #483 L20 * changelog update * changelog update * update Co-authored-by: DustInDark <nextsasasa@gmail.com> * updated rules #493 (#494) * Resolve conflict develop (#496) * removed tools/sigmac (#441) * removed tools/sigmac - moved tools/sigmac to hayabusa-rules repo * fixed doc link tools/sigmac * fixed submodule track * fixed submodule track from latest to v1.1.0 tag * fixed link * fixed rules submodule targe #444 * updated submodule * updated rules submodule Co-authored-by: Yamato Security <71482215+YamatoSecurity@users.noreply.github.com> Co-authored-by: Yamato Security <71482215+YamatoSecurity@users.noreply.github.com> Co-authored-by: kazuminn <warugaki.k.k@gmail.com> Co-authored-by: James / hach1yon <32596618+hach1yon@users.noreply.github.com> Co-authored-by: garigariganzy <tosada31@hotmail.co.jp> Co-authored-by: itiB <is0312vx@ed.ritsumei.ac.jp>
421 lines
15 KiB
Rust
421 lines
15 KiB
Rust
extern crate serde_derive;
|
|
extern crate yaml_rust;
|
|
|
|
use crate::detections::configs;
|
|
use crate::detections::print::AlertMessage;
|
|
use crate::detections::print::ERROR_LOG_STACK;
|
|
use crate::detections::print::QUIET_ERRORS_FLAG;
|
|
use crate::filter::RuleExclude;
|
|
use hashbrown::HashMap;
|
|
use std::ffi::OsStr;
|
|
use std::fs;
|
|
use std::io;
|
|
use std::io::BufWriter;
|
|
use std::io::{BufReader, Read};
|
|
use std::path::{Path, PathBuf};
|
|
use yaml_rust::Yaml;
|
|
use yaml_rust::YamlLoader;
|
|
|
|
pub struct ParseYaml {
|
|
pub files: Vec<(String, yaml_rust::Yaml)>,
|
|
pub rulecounter: HashMap<String, u128>,
|
|
pub ignorerule_count: u128,
|
|
pub errorrule_count: u128,
|
|
}
|
|
|
|
impl Default for ParseYaml {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
impl ParseYaml {
|
|
pub fn new() -> ParseYaml {
|
|
ParseYaml {
|
|
files: Vec::new(),
|
|
rulecounter: HashMap::new(),
|
|
ignorerule_count: 0,
|
|
errorrule_count: 0,
|
|
}
|
|
}
|
|
|
|
pub fn read_file(&self, path: PathBuf) -> Result<String, String> {
|
|
let mut file_content = String::new();
|
|
|
|
let mut fr = fs::File::open(path)
|
|
.map(BufReader::new)
|
|
.map_err(|e| e.to_string())?;
|
|
|
|
fr.read_to_string(&mut file_content)
|
|
.map_err(|e| e.to_string())?;
|
|
|
|
Ok(file_content)
|
|
}
|
|
|
|
pub fn read_dir<P: AsRef<Path>>(
|
|
&mut self,
|
|
path: P,
|
|
level: &str,
|
|
exclude_ids: &RuleExclude,
|
|
) -> io::Result<String> {
|
|
let metadata = fs::metadata(path.as_ref());
|
|
if metadata.is_err() {
|
|
let errmsg = format!(
|
|
"fail to read metadata of file: {}",
|
|
path.as_ref().to_path_buf().display(),
|
|
);
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
AlertMessage::alert(&mut BufWriter::new(std::io::stderr().lock()), &errmsg)?;
|
|
}
|
|
if !*QUIET_ERRORS_FLAG {
|
|
ERROR_LOG_STACK
|
|
.lock()
|
|
.unwrap()
|
|
.push(format!("[ERROR] {}", errmsg));
|
|
}
|
|
return io::Result::Ok(String::default());
|
|
}
|
|
let mut yaml_docs = vec![];
|
|
if metadata.unwrap().file_type().is_file() {
|
|
// 拡張子がymlでないファイルは無視
|
|
if path
|
|
.as_ref()
|
|
.to_path_buf()
|
|
.extension()
|
|
.unwrap_or_else(|| OsStr::new(""))
|
|
!= "yml"
|
|
{
|
|
return io::Result::Ok(String::default());
|
|
}
|
|
|
|
// 個別のファイルの読み込みは即終了としない。
|
|
let read_content = self.read_file(path.as_ref().to_path_buf());
|
|
if read_content.is_err() {
|
|
let errmsg = format!(
|
|
"fail to read file: {}\n{} ",
|
|
path.as_ref().to_path_buf().display(),
|
|
read_content.unwrap_err()
|
|
);
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
AlertMessage::warn(&mut BufWriter::new(std::io::stderr().lock()), &errmsg)?;
|
|
}
|
|
if !*QUIET_ERRORS_FLAG {
|
|
ERROR_LOG_STACK
|
|
.lock()
|
|
.unwrap()
|
|
.push(format!("[WARN] {}", errmsg));
|
|
}
|
|
self.errorrule_count += 1;
|
|
return io::Result::Ok(String::default());
|
|
}
|
|
|
|
// ここも個別のファイルの読み込みは即終了としない。
|
|
let yaml_contents = YamlLoader::load_from_str(&read_content.unwrap());
|
|
if yaml_contents.is_err() {
|
|
let errmsg = format!(
|
|
"Failed to parse yml: {}\n{} ",
|
|
path.as_ref().to_path_buf().display(),
|
|
yaml_contents.unwrap_err()
|
|
);
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
AlertMessage::warn(&mut BufWriter::new(std::io::stderr().lock()), &errmsg)?;
|
|
}
|
|
if !*QUIET_ERRORS_FLAG {
|
|
ERROR_LOG_STACK
|
|
.lock()
|
|
.unwrap()
|
|
.push(format!("[WARN] {}", errmsg));
|
|
}
|
|
self.errorrule_count += 1;
|
|
return io::Result::Ok(String::default());
|
|
}
|
|
|
|
yaml_docs.extend(yaml_contents.unwrap().into_iter().map(|yaml_content| {
|
|
let filepath = format!("{}", path.as_ref().to_path_buf().display());
|
|
(filepath, yaml_content)
|
|
}));
|
|
} else {
|
|
let mut entries = fs::read_dir(path)?;
|
|
yaml_docs = entries.try_fold(vec![], |mut ret, entry| {
|
|
let entry = entry?;
|
|
// フォルダは再帰的に呼び出す。
|
|
if entry.file_type()?.is_dir() {
|
|
self.read_dir(entry.path(), level, exclude_ids)?;
|
|
return io::Result::Ok(ret);
|
|
}
|
|
// ファイル以外は無視
|
|
if !entry.file_type()?.is_file() {
|
|
return io::Result::Ok(ret);
|
|
}
|
|
|
|
// 拡張子がymlでないファイルは無視
|
|
let path = entry.path();
|
|
if path.extension().unwrap_or_else(|| OsStr::new("")) != "yml" {
|
|
return io::Result::Ok(ret);
|
|
}
|
|
|
|
// ignore if yml file in .git folder.
|
|
if path.to_str().unwrap().contains("/.git/") {
|
|
return io::Result::Ok(ret);
|
|
}
|
|
|
|
// 個別のファイルの読み込みは即終了としない。
|
|
let read_content = self.read_file(path);
|
|
if read_content.is_err() {
|
|
let errmsg = format!(
|
|
"fail to read file: {}\n{} ",
|
|
entry.path().display(),
|
|
read_content.unwrap_err()
|
|
);
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
AlertMessage::warn(&mut BufWriter::new(std::io::stderr().lock()), &errmsg)?;
|
|
}
|
|
if !*QUIET_ERRORS_FLAG {
|
|
ERROR_LOG_STACK
|
|
.lock()
|
|
.unwrap()
|
|
.push(format!("[WARN] {}", errmsg));
|
|
}
|
|
self.errorrule_count += 1;
|
|
return io::Result::Ok(ret);
|
|
}
|
|
|
|
// ここも個別のファイルの読み込みは即終了としない。
|
|
let yaml_contents = YamlLoader::load_from_str(&read_content.unwrap());
|
|
if yaml_contents.is_err() {
|
|
let errmsg = format!(
|
|
"Failed to parse yml: {}\n{} ",
|
|
entry.path().display(),
|
|
yaml_contents.unwrap_err()
|
|
);
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
AlertMessage::warn(&mut BufWriter::new(std::io::stderr().lock()), &errmsg)?;
|
|
}
|
|
if !*QUIET_ERRORS_FLAG {
|
|
ERROR_LOG_STACK
|
|
.lock()
|
|
.unwrap()
|
|
.push(format!("[WARN] {}", errmsg));
|
|
}
|
|
self.errorrule_count += 1;
|
|
return io::Result::Ok(ret);
|
|
}
|
|
|
|
let yaml_contents = yaml_contents.unwrap().into_iter().map(|yaml_content| {
|
|
let filepath = format!("{}", entry.path().display());
|
|
(filepath, yaml_content)
|
|
});
|
|
ret.extend(yaml_contents);
|
|
io::Result::Ok(ret)
|
|
})?;
|
|
}
|
|
|
|
let files: Vec<(String, Yaml)> = yaml_docs
|
|
.into_iter()
|
|
.filter_map(|(filepath, yaml_doc)| {
|
|
//除外されたルールは無視する
|
|
let rule_id = &yaml_doc["id"].as_str();
|
|
if rule_id.is_some() {
|
|
match exclude_ids
|
|
.no_use_rule
|
|
.get(&rule_id.unwrap_or("").to_string())
|
|
{
|
|
None => (),
|
|
Some(_) => {
|
|
self.ignorerule_count += 1;
|
|
return Option::None;
|
|
}
|
|
}
|
|
}
|
|
|
|
self.rulecounter.insert(
|
|
yaml_doc["ruletype"].as_str().unwrap_or("Other").to_string(),
|
|
self.rulecounter
|
|
.get(&yaml_doc["ruletype"].as_str().unwrap_or("Other").to_string())
|
|
.unwrap_or(&0)
|
|
+ 1,
|
|
);
|
|
|
|
if configs::CONFIG.read().unwrap().args.is_present("verbose") {
|
|
println!("Loaded yml file path: {}", filepath);
|
|
}
|
|
|
|
// 指定されたレベルより低いルールは無視する
|
|
let doc_level = &yaml_doc["level"]
|
|
.as_str()
|
|
.unwrap_or("informational")
|
|
.to_string()
|
|
.to_uppercase();
|
|
let doc_level_num = configs::LEVELMAP.get(doc_level).unwrap_or(&1);
|
|
let args_level_num = configs::LEVELMAP.get(level).unwrap_or(&1);
|
|
if doc_level_num < args_level_num {
|
|
return Option::None;
|
|
}
|
|
|
|
if !configs::CONFIG
|
|
.read()
|
|
.unwrap()
|
|
.args
|
|
.is_present("enable-deprecated-rules")
|
|
{
|
|
let rule_status = &yaml_doc["status"].as_str();
|
|
if rule_status.is_some() && rule_status.unwrap() == "deprecated" {
|
|
self.ignorerule_count += 1;
|
|
return Option::None;
|
|
}
|
|
}
|
|
|
|
Option::Some((filepath, yaml_doc))
|
|
})
|
|
.collect();
|
|
self.files.extend(files);
|
|
io::Result::Ok(String::default())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
|
|
use crate::detections::print::AlertMessage;
|
|
use crate::detections::print::ERROR_LOG_PATH;
|
|
use crate::filter;
|
|
use crate::yaml;
|
|
use crate::yaml::RuleExclude;
|
|
use hashbrown::HashSet;
|
|
use std::path::Path;
|
|
use yaml_rust::YamlLoader;
|
|
|
|
#[test]
|
|
fn test_read_file_yaml() {
|
|
AlertMessage::create_error_log(ERROR_LOG_PATH.to_string());
|
|
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let exclude_ids = RuleExclude {
|
|
no_use_rule: HashSet::new(),
|
|
};
|
|
let _ = &yaml.read_dir(
|
|
"test_files/rules/yaml/1.yml",
|
|
&String::default(),
|
|
&exclude_ids,
|
|
);
|
|
assert_eq!(yaml.files.len(), 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_read_dir_yaml() {
|
|
AlertMessage::create_error_log(ERROR_LOG_PATH.to_string());
|
|
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let exclude_ids = RuleExclude {
|
|
no_use_rule: HashSet::new(),
|
|
};
|
|
let _ = &yaml.read_dir("test_files/rules/yaml/", &String::default(), &exclude_ids);
|
|
assert_ne!(yaml.files.len(), 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_read_yaml() {
|
|
let yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/yaml/1.yml");
|
|
let ret = yaml.read_file(path.to_path_buf()).unwrap();
|
|
let rule = YamlLoader::load_from_str(&ret).unwrap();
|
|
for i in rule {
|
|
if i["title"].as_str().unwrap() == "Sysmon Check command lines" {
|
|
assert_eq!(
|
|
"*",
|
|
i["detection"]["selection"]["CommandLine"].as_str().unwrap()
|
|
);
|
|
assert_eq!(1, i["detection"]["selection"]["EventID"].as_i64().unwrap());
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_failed_read_yaml() {
|
|
let yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/yaml/error.yml");
|
|
let ret = yaml.read_file(path.to_path_buf()).unwrap();
|
|
let rule = YamlLoader::load_from_str(&ret);
|
|
assert!(rule.is_err());
|
|
}
|
|
|
|
#[test]
|
|
/// no specifed "level" arguments value is adapted default level(informational)
|
|
fn test_default_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "", &filter::exclude_ids()).unwrap();
|
|
assert_eq!(yaml.files.len(), 5);
|
|
}
|
|
|
|
#[test]
|
|
fn test_info_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "informational", &filter::exclude_ids())
|
|
.unwrap();
|
|
assert_eq!(yaml.files.len(), 5);
|
|
}
|
|
#[test]
|
|
fn test_low_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "LOW", &filter::exclude_ids()).unwrap();
|
|
assert_eq!(yaml.files.len(), 4);
|
|
}
|
|
#[test]
|
|
fn test_medium_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "MEDIUM", &filter::exclude_ids())
|
|
.unwrap();
|
|
assert_eq!(yaml.files.len(), 3);
|
|
}
|
|
#[test]
|
|
fn test_high_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "HIGH", &filter::exclude_ids()).unwrap();
|
|
assert_eq!(yaml.files.len(), 2);
|
|
}
|
|
#[test]
|
|
fn test_critical_level_read_yaml() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/level_yaml");
|
|
yaml.read_dir(path, "CRITICAL", &filter::exclude_ids())
|
|
.unwrap();
|
|
assert_eq!(yaml.files.len(), 1);
|
|
}
|
|
#[test]
|
|
fn test_all_exclude_rules_file() {
|
|
AlertMessage::create_error_log(ERROR_LOG_PATH.to_string());
|
|
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/yaml");
|
|
yaml.read_dir(path, "", &filter::exclude_ids()).unwrap();
|
|
assert_eq!(yaml.ignorerule_count, 10);
|
|
}
|
|
#[test]
|
|
fn test_none_exclude_rules_file() {
|
|
AlertMessage::create_error_log(ERROR_LOG_PATH.to_string());
|
|
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/yaml");
|
|
let exclude_ids = RuleExclude {
|
|
no_use_rule: HashSet::new(),
|
|
};
|
|
yaml.read_dir(path, "", &exclude_ids).unwrap();
|
|
assert_eq!(yaml.ignorerule_count, 0);
|
|
}
|
|
#[test]
|
|
fn test_exclude_deprecated_rules_file() {
|
|
let mut yaml = yaml::ParseYaml::new();
|
|
let path = Path::new("test_files/rules/deprecated");
|
|
let exclude_ids = RuleExclude {
|
|
no_use_rule: HashSet::new(),
|
|
};
|
|
yaml.read_dir(path, "", &exclude_ids).unwrap();
|
|
assert_eq!(yaml.ignorerule_count, 1);
|
|
}
|
|
}
|