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  }