github.com/crowdsecurity/crowdsec@v1.6.1/test/bats/90_decisions.bats (about) 1 #!/usr/bin/env bats 2 # vim: ft=bats:list:ts=8:sts=4:sw=4:et:ai:si: 3 4 set -u 5 6 setup_file() { 7 load "../lib/setup_file.sh" 8 9 TESTDATA="${BATS_TEST_DIRNAME}/testdata/90_decisions" 10 export TESTDATA 11 } 12 13 teardown_file() { 14 load "../lib/teardown_file.sh" 15 } 16 17 setup() { 18 load "../lib/setup.sh" 19 load "../lib/bats-file/load.bash" 20 ./instance-data load 21 LOGFILE=$(config_get '.common.log_dir')/crowdsec.log 22 export LOGFILE 23 ./instance-crowdsec start 24 } 25 26 teardown() { 27 ./instance-crowdsec stop 28 } 29 30 #---------- 31 32 @test "'decisions add' requires parameters" { 33 rune -1 cscli decisions add 34 assert_line "Usage:" 35 assert_stderr --partial "missing arguments, a value is required (--ip, --range or --scope and --value)" 36 37 rune -1 cscli decisions add -o json 38 rune -0 jq -c '[ .level, .msg]' <(stderr | grep "^{") 39 assert_output '["fatal","missing arguments, a value is required (--ip, --range or --scope and --value)"]' 40 } 41 42 @test "cscli decisions list, with and without --machine" { 43 is_db_postgres && skip 44 rune -0 cscli decisions add -i 10.20.30.40 -t ban 45 46 rune -0 cscli decisions list 47 refute_output --partial 'Machine' 48 # machine name appears quoted in the "REASON" column 49 assert_output --regexp " 'githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})?' " 50 refute_output --regexp " githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})? " 51 52 rune -0 cscli decisions list -m 53 assert_output --partial 'Machine' 54 assert_output --regexp " 'githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})?' " 55 assert_output --regexp " githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})? " 56 57 rune -0 cscli decisions list --machine 58 assert_output --partial 'Machine' 59 assert_output --regexp " 'githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})?' " 60 assert_output --regexp " githubciXXXXXXXXXXXXXXXXXXXXXXXX([a-zA-Z0-9]{16})? " 61 } 62 63 @test "cscli decisions list, incorrect parameters" { 64 rune -1 cscli decisions list --until toto 65 assert_stderr --partial 'unable to retrieve decisions: performing request: API error: while parsing duration: time: invalid duration \"toto\"' 66 rune -1 cscli decisions list --until toto -o json 67 rune -0 jq -c '[.level, .msg]' <(stderr | grep "^{") 68 assert_output '["fatal","unable to retrieve decisions: performing request: API error: while parsing duration: time: invalid duration \"toto\""]' 69 } 70 71 @test "cscli decisions import" { 72 # required input 73 rune -1 cscli decisions import 74 assert_stderr --partial 'required flag(s) \"input\" not set"' 75 76 # unsupported format 77 rune -1 cscli decisions import -i - <<<'value\n5.6.7.8' --format xml 78 assert_stderr --partial "invalid format 'xml', expected one of 'json', 'csv', 'values'" 79 80 # invalid defaults 81 rune -1 cscli decisions import --duration "" -i - <<<'value\n5.6.7.8' --format csv 82 assert_stderr --partial "--duration cannot be empty" 83 rune -1 cscli decisions import --scope "" -i - <<<'value\n5.6.7.8' --format csv 84 assert_stderr --partial "--scope cannot be empty" 85 rune -1 cscli decisions import --reason "" -i - <<<'value\n5.6.7.8' --format csv 86 assert_stderr --partial "--reason cannot be empty" 87 rune -1 cscli decisions import --type "" -i - <<<'value\n5.6.7.8' --format csv 88 assert_stderr --partial "--type cannot be empty" 89 90 #---------- 91 # JSON 92 #---------- 93 94 # import from file 95 rune -1 cscli decisions import -i "${TESTDATA}/json_decisions" 96 assert_stderr --partial "unable to guess format from file extension, please provide a format with --format flag" 97 98 rune -0 cscli decisions import -i "${TESTDATA}/decisions.json" 99 assert_stderr --partial "Parsing json" 100 assert_stderr --partial "Imported 5 decisions" 101 102 # import from stdin 103 rune -1 cscli decisions import -i /dev/stdin < <(cat "${TESTDATA}/decisions.json") 104 assert_stderr --partial "unable to guess format from file extension, please provide a format with --format flag" 105 rune -0 cscli decisions import -i /dev/stdin < <(cat "${TESTDATA}/decisions.json") --format json 106 assert_stderr --partial "Parsing json" 107 assert_stderr --partial "Imported 5 decisions" 108 109 # invalid json 110 rune -1 cscli decisions import -i - <<<'{"blah":"blah"}' --format json 111 assert_stderr --partial 'Parsing json' 112 assert_stderr --partial 'json: cannot unmarshal object into Go value of type []main.decisionRaw' 113 114 # json with extra data 115 rune -1 cscli decisions import -i - <<<'{"values":"1.2.3.4","blah":"blah"}' --format json 116 assert_stderr --partial 'Parsing json' 117 assert_stderr --partial 'json: cannot unmarshal object into Go value of type []main.decisionRaw' 118 119 #---------- 120 # CSV 121 #---------- 122 123 # import from file 124 rune -1 cscli decisions import -i "${TESTDATA}/csv_decisions" 125 assert_stderr --partial "unable to guess format from file extension, please provide a format with --format flag" 126 127 rune -0 cscli decisions import -i "${TESTDATA}/decisions.csv" 128 assert_stderr --partial 'Parsing csv' 129 assert_stderr --partial 'Imported 5 decisions' 130 131 # import from stdin 132 rune -1 cscli decisions import -i /dev/stdin < <(cat "${TESTDATA}/decisions.csv") 133 assert_stderr --partial "unable to guess format from file extension, please provide a format with --format flag" 134 rune -0 cscli decisions import -i /dev/stdin < <(cat "${TESTDATA}/decisions.csv") --format csv 135 assert_stderr --partial "Parsing csv" 136 assert_stderr --partial "Imported 5 decisions" 137 138 # invalid csv 139 # XXX: improve validation 140 rune -0 cscli decisions import -i - <<<'value\n1.2.3.4,5.6.7.8' --format csv 141 assert_stderr --partial 'Parsing csv' 142 assert_stderr --partial "Imported 0 decisions" 143 144 #---------- 145 # VALUES 146 #---------- 147 148 # can use '-' as stdin 149 rune -0 cscli decisions import -i - --format values <<-EOT 150 1.2.3.4 151 1.2.3.5 152 1.2.3.6 153 EOT 154 assert_stderr --partial 'Parsing values' 155 assert_stderr --partial 'Imported 3 decisions' 156 157 # leading or trailing spaces are ignored 158 rune -0 cscli decisions import -i - --format values <<-EOT 159 10.2.3.4 160 10.2.3.5 161 10.2.3.6 162 EOT 163 assert_stderr --partial 'Parsing values' 164 assert_stderr --partial 'Imported 3 decisions' 165 166 # silently discarding (but logging) invalid decisions 167 168 rune -0 cscli alerts delete --all 169 truncate -s 0 "${LOGFILE}" 170 171 rune -0 cscli decisions import -i - --format values <<-EOT 172 whatever 173 EOT 174 assert_stderr --partial 'Parsing values' 175 assert_stderr --partial 'Imported 1 decisions' 176 assert_file_contains "$LOGFILE" "invalid addr/range 'whatever': invalid address" 177 178 rune -0 cscli decisions list -a -o json 179 assert_json '[]' 180 181 # disarding only some invalid decisions 182 183 184 rune -0 cscli alerts delete --all 185 truncate -s 0 "${LOGFILE}" 186 187 rune -0 cscli decisions import -i - --format values <<-EOT 188 1.2.3.4 189 bad-apple 190 1.2.3.5 191 EOT 192 assert_stderr --partial 'Parsing values' 193 assert_stderr --partial 'Imported 3 decisions' 194 assert_file_contains "$LOGFILE" "invalid addr/range 'bad-apple': invalid address" 195 196 rune -0 cscli decisions list -a -o json 197 rune -0 jq -r '.[0].decisions | length' <(output) 198 assert_output 2 199 200 #---------- 201 # Batch 202 #---------- 203 204 rune -0 cscli decisions import -i - --format values --batch 2 --debug <<-EOT 205 1.2.3.4 206 1.2.3.5 207 1.2.3.6 208 EOT 209 assert_stderr --partial 'Processing chunk of 2 decisions' 210 assert_stderr --partial 'Processing chunk of 1 decisions' 211 assert_stderr --partial 'Imported 3 decisions' 212 }