foodcritic 4.0.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -0
  3. data/README.md +7 -7
  4. data/bin/foodcritic +1 -1
  5. data/chef_dsl_metadata/chef_11.0.0.json +4 -0
  6. data/chef_dsl_metadata/chef_11.10.0.json +176 -1
  7. data/chef_dsl_metadata/chef_11.10.2.json +176 -1
  8. data/chef_dsl_metadata/chef_11.10.4.json +176 -1
  9. data/chef_dsl_metadata/chef_11.12.0.json +10861 -0
  10. data/chef_dsl_metadata/chef_11.12.2.json +10861 -0
  11. data/chef_dsl_metadata/chef_11.12.4.json +10800 -0
  12. data/chef_dsl_metadata/chef_11.12.8.json +10800 -0
  13. data/chef_dsl_metadata/chef_11.14.2.json +11172 -0
  14. data/chef_dsl_metadata/chef_11.14.6.json +11178 -0
  15. data/chef_dsl_metadata/chef_11.16.0.json +11236 -0
  16. data/chef_dsl_metadata/chef_11.16.2.json +11236 -0
  17. data/chef_dsl_metadata/chef_11.16.4.json +11236 -0
  18. data/chef_dsl_metadata/chef_11.18.0.json +11291 -0
  19. data/chef_dsl_metadata/chef_11.18.12.json +11291 -0
  20. data/chef_dsl_metadata/chef_11.18.6.json +11291 -0
  21. data/chef_dsl_metadata/chef_11.2.0.json +4 -0
  22. data/chef_dsl_metadata/chef_11.4.0.json +4 -0
  23. data/chef_dsl_metadata/chef_11.4.2.json +4 -0
  24. data/chef_dsl_metadata/chef_11.4.4.json +4 -0
  25. data/chef_dsl_metadata/chef_11.6.0.json +4 -0
  26. data/chef_dsl_metadata/chef_11.6.2.json +4 -0
  27. data/chef_dsl_metadata/chef_11.8.0.json +4 -0
  28. data/chef_dsl_metadata/chef_11.8.2.json +4 -0
  29. data/chef_dsl_metadata/chef_12.0.0.json +11855 -0
  30. data/chef_dsl_metadata/chef_12.0.1.json +11865 -0
  31. data/chef_dsl_metadata/chef_12.0.3.json +12054 -0
  32. data/chef_dsl_metadata/chef_12.1.0.json +12468 -0
  33. data/chef_dsl_metadata/chef_12.1.1.json +12468 -0
  34. data/chef_dsl_metadata/chef_12.1.2.json +12468 -0
  35. data/chef_dsl_metadata/chef_12.2.1.json +12645 -0
  36. data/chef_dsl_metadata/chef_12.3.0.json +12839 -0
  37. data/chef_dsl_metadata/chef_12.4.0.json +14625 -0
  38. data/chef_dsl_metadata/chef_12.4.1.json +14625 -0
  39. data/features/002_check_string_interpolation.feature +5 -0
  40. data/features/041_check_raw_download.feature +17 -9
  41. data/features/044_check_for_bare_attribute_keys.feature +10 -0
  42. data/features/048_check_for_shellout.feature +6 -1
  43. data/features/052_check_for_metadata_using_suggests_keyword.feature +15 -0
  44. data/features/053_check_for_metadata_using_recommends_keyword.feature +15 -0
  45. data/features/step_definitions/cookbook_steps.rb +66 -4
  46. data/features/support/command_helpers.rb +8 -2
  47. data/features/support/env.rb +7 -3
  48. data/lib/foodcritic/api.rb +5 -4
  49. data/lib/foodcritic/chef.rb +3 -7
  50. data/lib/foodcritic/command_line.rb +15 -0
  51. data/lib/foodcritic/domain.rb +14 -0
  52. data/lib/foodcritic/linter.rb +44 -4
  53. data/lib/foodcritic/rake_task.rb +15 -11
  54. data/lib/foodcritic/rules.rb +38 -6
  55. data/lib/foodcritic/version.rb +1 -1
  56. data/man/foodcritic.1 +8 -1
  57. data/man/foodcritic.1.ronn +7 -0
  58. data/misc/lucene.treetop +150 -0
  59. data/spec/foodcritic/command_line_spec.rb +10 -0
  60. data/spec/foodcritic/domain_spec.rb +19 -0
  61. data/spec/foodcritic/linter_spec.rb +13 -1
  62. data/spec/regression/cookbooks.txt +0 -60
  63. data/spec/regression/expected-output.txt +5 -445
  64. data/spec/regression_helpers.rb +5 -5
  65. data/spec/spec_helper.rb +7 -3
  66. metadata +38 -7
@@ -4,8 +4,7 @@ require 'rake/tasklib'
4
4
  module FoodCritic
5
5
  module Rake
6
6
  class LintTask < ::Rake::TaskLib
7
- attr_accessor :name, :files
8
- attr_writer :options
7
+ attr_accessor :name, :files, :options
9
8
 
10
9
  def initialize(name = :foodcritic)
11
10
  @name = name
@@ -15,24 +14,29 @@ module FoodCritic
15
14
  define
16
15
  end
17
16
 
18
- def options
19
- {
20
- fail_tags: ['correctness'], # differs to default cmd-line behaviour
21
- cookbook_paths: @files,
22
- exclude_paths: ['test/**/*', 'spec/**/*', 'features/**/*'],
23
- context: false,
24
- }.merge(@options)
25
- end
26
17
 
27
18
  def define
28
19
  desc 'Lint Chef cookbooks' unless ::Rake.application.last_comment
29
20
  task(name) do
30
- result = FoodCritic::Linter.new.check(options)
21
+ puts "Starting Foodcritic linting..."
22
+ result = FoodCritic::Linter.new.check(options.merge(default_options))
31
23
  printer = options[:context] ? ContextOutput.new : SummaryOutput.new
32
24
  printer.output(result) if result.warnings.any?
33
25
  abort if result.failed?
26
+ puts "Completed!"
34
27
  end
35
28
  end
29
+
30
+ private
31
+ def default_options
32
+ {
33
+ fail_tags: ['correctness'], # differs to default cmd-line behaviour
34
+ cookbook_paths: files,
35
+ exclude_paths: ['test/**/*', 'spec/**/*', 'features/**/*'],
36
+ context: false,
37
+ chef_version: FoodCritic::Linter::DEFAULT_CHEF_VERSION
38
+ }
39
+ end
36
40
  end
37
41
  end
38
42
  end
@@ -22,7 +22,7 @@ rule 'FC002', 'Avoid string interpolation where not required' do
22
22
  recipe do |ast|
23
23
  ast.xpath(%q{//*[self::string_literal | self::assoc_new]/string_add[
24
24
  count(descendant::string_embexpr) = 1 and
25
- count(tstring_content|string_add/tstring_content) = 0]})
25
+ count(string_add) = 0]})
26
26
  end
27
27
  end
28
28
 
@@ -618,7 +618,7 @@ rule 'FC041', 'Execute resource used to run curl or wget commands' do
618
618
  recipe do |ast|
619
619
  find_resources(ast, type: 'execute').select do |cmd|
620
620
  cmd_str = (resource_attribute(cmd, 'command') || resource_name(cmd)).to_s
621
- (cmd_str.include?('curl ') || cmd_str.include?('wget '))
621
+ (cmd_str.match(/^curl.*(-o|>|--output).*$/) || cmd_str.include?('wget '))
622
622
  end
623
623
  end
624
624
  end
@@ -646,10 +646,17 @@ rule 'FC044', 'Avoid bare attribute keys' do
646
646
  declared = ast.xpath('//descendant::var_field/ident/@value').map do |v|
647
647
  v.to_s
648
648
  end
649
+
649
650
  ast.xpath('//assign/*[self::vcall or self::var_ref]
650
651
  [count(child::kw) = 0]/ident').select do |v|
652
+
653
+ local_declared = v.xpath("ancestor::*[self::brace_block or self::do_block]
654
+ /block_var/descendant::ident/@value").map do |v|
655
+ v.to_s
656
+ end
657
+
651
658
  (v['value'] != 'secure_password') &&
652
- !declared.include?(v['value']) &&
659
+ !(declared + local_declared).uniq.include?(v['value']) &&
653
660
  !v.xpath("ancestor::*[self::brace_block or self::do_block]/block_var/
654
661
  descendant::ident/@value='#{v['value']}'")
655
662
  end
@@ -698,9 +705,18 @@ end
698
705
  rule 'FC048', 'Prefer Mixlib::ShellOut' do
699
706
  tags %w(style processes)
700
707
  recipe do |ast|
701
- ast.xpath('//xstring_literal | //*[self::command or self::fcall]/
702
- ident[@value="system"][count(following-sibling::args_add_block/
703
- descendant::kw[@value="true" or @value="false"]) = 0]')
708
+
709
+ xstring_literal=ast.xpath('//xstring_literal')
710
+ next xstring_literal if xstring_literal.any?
711
+
712
+ ast.xpath('//*[self::command or self::fcall]/ident[@value="system"]').select do |x|
713
+ resource_name = x.xpath('ancestor::do_block/preceding-sibling::command/ident/@value')
714
+ if resource_name.any? && resource_attribute?(resource_name.to_s, 'system')
715
+ next false
716
+ end
717
+ next x.xpath('count(following-sibling::args_add_block/descendant::kw[@value="true" or @value="false"]) = 0')
718
+ end
719
+
704
720
  end
705
721
  end
706
722
 
@@ -739,3 +755,19 @@ rule 'FC051', 'Template partials loop indefinitely' do
739
755
  end.map { |t| file_match(t) }
740
756
  end
741
757
  end
758
+
759
+ rule 'FC052', 'Metadata uses the unimplemented "suggests" keyword' do
760
+ tags %w(style metadata)
761
+ metadata do |ast, filename|
762
+ ast.xpath(%Q(//command[ident/@value='suggests']))
763
+ end
764
+ end
765
+
766
+ rule 'FC053', 'Metadata uses the unimplemented "recommends" keyword' do
767
+ tags %w(style metadata)
768
+ metadata do |ast, filename|
769
+ ast.xpath(%Q(//command[ident/@value='recommends']))
770
+ end
771
+ end
772
+
773
+ # NOTE: FC054 was yanked and should be considered reserved, do not reuse it
@@ -1,4 +1,4 @@
1
1
  module FoodCritic
2
2
  # The current version of foodcritic
3
- VERSION = '4.0.0'
3
+ VERSION = '5.0.0'
4
4
  end
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "FOODCRITIC" "1" "June 2014" "" ""
4
+ .TH "FOODCRITIC" "1" "September 2015" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBfoodcritic\fR \- lint tool for chef cookbooks
@@ -9,6 +9,9 @@
9
9
  .SH "SYNOPSIS"
10
10
  \fBfoodcritic\fR [\fIoptions\fR\.\.\.] \fIcookbook\fR\.\.\.
11
11
  .
12
+ .P
13
+ \fBfoodcritic\fR [\fIoptions\fR\.\.\.] \-\-list
14
+ .
12
15
  .SH "DESCRIPTION"
13
16
  \fBfoodcritic\fR makes it easier to flag problems in your Chef cookbooks that will cause Chef to blow up when you attempt to converge\. This is about faster feedback\.
14
17
  .
@@ -22,6 +25,10 @@ Each \fBcookbook\fR path specified will be examined for common problems and poor
22
25
  Only check against rules with the specified tags\. Prefix tags with a tilde \fB~\fR to exclude rules\.
23
26
  .
24
27
  .TP
28
+ \fB\-l\fR, \fB\-\-list\fR
29
+ Do not perform a lint check; instead simply list the rules that would be enabled based on the defaults and the rule selection options (\-t, \-I)
30
+ .
31
+ .TP
25
32
  \fB\-f\fR, \fB\-\-epic\-fail\fR \fITAGS\fR
26
33
  Exit non\-zero if any of the specified tags are matched\. Use the pseudo\-tag \fBany\fR to fail if any tag is matched\.
27
34
  .
@@ -5,6 +5,8 @@ foodcritic(1) -- lint tool for chef cookbooks
5
5
 
6
6
  `foodcritic` [<options>...] <cookbook>...
7
7
 
8
+ `foodcritic` [<options>...] --list
9
+
8
10
 
9
11
  ## DESCRIPTION
10
12
 
@@ -22,6 +24,11 @@ poor style.
22
24
  Only check against rules with the specified tags. Prefix
23
25
  tags with a tilde `~` to exclude rules.
24
26
 
27
+ * `-l`, `--list`:
28
+ Do not perform a lint check; instead simply list the
29
+ rules that would be enabled based on the defaults and
30
+ the rule selection options (-t, -I)
31
+
25
32
  * `-f`, `--epic-fail` <TAGS>:
26
33
  Exit non-zero if any of the specified tags are matched.
27
34
  Use the pseudo-tag `any` to fail if any tag is matched.
@@ -0,0 +1,150 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ grammar Lucene
20
+
21
+ rule body
22
+ (expression / space)* <Body>
23
+ end
24
+
25
+ rule expression
26
+ operation / group / field / field_range / term / string
27
+ end
28
+
29
+ rule term
30
+ keyword valid_letter+ <Term> / !keyword !"?" valid_letter <Term>
31
+ end
32
+
33
+ rule field
34
+ field_name ":" (term/string/group) <Field>
35
+ end
36
+
37
+ rule field_range
38
+ field_name ":" "[" range_value " TO " range_value "]" <InclFieldRange>
39
+ /
40
+ field_name ":" "{" range_value " TO " range_value "}" <ExclFieldRange>
41
+ end
42
+
43
+ rule field_name
44
+ !keyword valid_letter+ <FieldName>
45
+ end
46
+
47
+ rule range_value
48
+ valid_letter+ <RangeValue> / "*" <RangeValue>
49
+ end
50
+
51
+ rule group
52
+ space? '(' body ')' space? <Group>
53
+ end
54
+
55
+ rule operation
56
+ binary_op / unary_op / fuzzy_op / boost_op
57
+ end
58
+
59
+ rule unary_op
60
+ not_op / required_op / prohibited_op
61
+ end
62
+
63
+ rule binary_op
64
+ (group / field / field_range / term) space? boolean_operator space+ body <BinaryOp>
65
+ end
66
+
67
+ rule boolean_operator
68
+ and_operator / or_operator
69
+ end
70
+
71
+ rule and_operator
72
+ 'AND' <AndOperator> / '&&' <AndOperator>
73
+ end
74
+
75
+ rule or_operator
76
+ 'OR' <OrOperator> / '||' <OrOperator>
77
+ end
78
+
79
+ rule not_op
80
+ not_operator space (group / field / field_range / term / string) <UnaryOp>
81
+ /
82
+ bang_operator space? (group / field / field_range / term / string) <UnaryOp>
83
+ end
84
+
85
+ rule not_operator
86
+ 'NOT' <NotOperator>
87
+ end
88
+
89
+ rule bang_operator
90
+ '!' <NotOperator>
91
+ end
92
+
93
+ rule required_op
94
+ !valid_letter required_operator (term/string) <UnaryOp>
95
+ /
96
+ required_operator (term/string) <UnaryOp>
97
+ end
98
+
99
+ rule required_operator
100
+ '+' <RequiredOperator>
101
+ end
102
+
103
+ rule prohibited_op
104
+ !valid_letter prohibited_operator (field/field_range/term/string) <UnaryOp>
105
+ end
106
+
107
+ rule prohibited_operator
108
+ '-' <ProhibitedOperator>
109
+ end
110
+
111
+ rule boost_op
112
+ (term/string) '^' fuzzy_param <BoostOp>
113
+ end
114
+
115
+ rule fuzzy_op
116
+ (term/string) '~' fuzzy_param? (space / !valid_letter) <FuzzyOp>
117
+ end
118
+
119
+ rule fuzzy_param
120
+ [0-9] '.'? [0-9] <FuzzyParam> / [0-9]+ <FuzzyParam>
121
+ end
122
+
123
+ rule string
124
+ '"' term (space term)* '"' <Phrase>
125
+ end
126
+
127
+ rule keyword
128
+ 'AND' / 'OR' / 'NOT'
129
+ end
130
+
131
+ rule valid_letter
132
+ start_letter+ ([a-zA-Z0-9@*?_.-] / '\\' special_char)*
133
+ end
134
+
135
+ rule start_letter
136
+ [a-zA-Z0-9@._*] / '\\' special_char
137
+ end
138
+
139
+ rule end_letter
140
+ [a-zA-Z0-9*?_.] / '\\' special_char
141
+ end
142
+
143
+ rule special_char
144
+ [-+&|!(){}\[\]^"~*?:\\]
145
+ end
146
+
147
+ rule space
148
+ [\s]+
149
+ end
150
+ end
@@ -61,4 +61,14 @@ describe FoodCritic::CommandLine do
61
61
  refute FoodCritic::CommandLine.new(["lib", "lib2"]).valid_paths?
62
62
  end
63
63
  end
64
+
65
+ describe "#list_rules?" do
66
+ it "returns false if ---list is not specified" do
67
+ refute FoodCritic::CommandLine.new([]).list_rules?
68
+ end
69
+
70
+ it "returns true if --list is specified" do
71
+ assert FoodCritic::CommandLine.new(['--list']).list_rules?
72
+ end
73
+ end
64
74
  end
@@ -23,6 +23,25 @@ describe FoodCritic::Review do
23
23
  end
24
24
  end
25
25
 
26
+ describe FoodCritic::RuleList do
27
+ it "is instantiable with no warnings" do
28
+ FoodCritic::RuleList.new([])
29
+ end
30
+
31
+ let(:rule) { FoodCritic::Rule.new('FCTEST001', 'Test rule') }
32
+
33
+ describe "#rules" do
34
+
35
+ it 'is empty when instantiated with an empty rule list' do
36
+ assert FoodCritic::RuleList.new([]).rules.empty?
37
+ end
38
+
39
+ it 'contains the given rule' do
40
+ assert FoodCritic::RuleList.new([rule]).rules.include?(rule)
41
+ end
42
+ end
43
+ end
44
+
26
45
  describe FoodCritic::Rule do
27
46
  let(:rule) { FoodCritic::Rule.new('FCTEST001', 'Test rule') }
28
47
 
@@ -11,7 +11,7 @@ describe FoodCritic::Linter do
11
11
 
12
12
  describe "chef version" do
13
13
  it "should be the latest stable version of Chef" do
14
- FoodCritic::Linter::DEFAULT_CHEF_VERSION.must_equal "11.10.4"
14
+ FoodCritic::Linter::DEFAULT_CHEF_VERSION.must_equal "12.4.1"
15
15
  end
16
16
  end
17
17
 
@@ -42,6 +42,18 @@ describe FoodCritic::Linter do
42
42
 
43
43
  end
44
44
 
45
+ describe "#list_rules" do
46
+
47
+ it "does not require cookbook_path, role_path or environment_path to be specified" do
48
+ linter.list(:list => true)
49
+ end
50
+
51
+ it "returns a rule listing" do
52
+ linter.list(:list => true).must_respond_to(:rules)
53
+ end
54
+ end
55
+
56
+
45
57
  describe "#load_files!" do
46
58
  let(:default_rules_file) do
47
59
  File.expand_path(File.join(File.dirname(__FILE__), '../../lib/foodcritic/rules.rb'))
@@ -1,16 +1,6 @@
1
- 7-zip:5dad0850d7c8ad5e63a0ae655f1ee2b17adfcd12
2
1
  activemq:5dce4ca5283d2a6252130a2d800b9387a57d6e01
3
- ant:2bd97f4bb7c8bcd37ea3bb3615a5f306e65d80a0
4
- apache2:29056c1a0a04cb718651ff0f522204ec651f94f0
5
2
  apparmor:fd09a6fda4f6fc722d4c8d5b8a5c815feda280c0
6
- application:da3eb5ac8fc20e9db7213c3b22f0a7856a73778c
7
- application_java:8aff84b60fb27c8fc228d86c6eca5949ba5a93a8
8
- application_nginx:a67bc25b95d33565d2c368b41c46f7366fb2a1e4
9
- application_php:08de9c64cd01b67e411f14f407254a36fed273c6
10
- application_python:b738476bd7d37a0a1e10094da32c6a5f4759cdb6
11
- application_ruby:812efe31df6c3c1607ed73f45e0adca7723b6c64
12
3
  apt:ea834265247cc8b507ac37ab3a34a9b44ed27a11
13
- ark:aa82cb6d9d83f12c3f4fa5969f56ce809529bf72
14
4
  aws:a9530561bf559c6db2cb40a93b125607c5ef3efa
15
5
  bluepill:1d6422afcbc910e587c9639e4e0a28c72727c90b
16
6
  boost:14f30e36040a4fcd038f030d9ee1c7fb29b08b68
@@ -19,117 +9,67 @@ chef:dac09eea9fa0d611b7b010160d6b8fa7f4d6ae1e
19
9
  chef-client:7fc4472c9913c9cb1762f979e05047a674318ef5
20
10
  chef-server:d98b96d69962c7988b9640fe5bee09f771ba8977
21
11
  chef_handler:d147ca9644f146b97a2d53324ca344321799b45f
22
- cloudkick:3f48cee9dc854914d002ea7e21380f60528583bd
23
- couchdb:cad1afe6cb51e31f6ad8f289a761d638fbfee8c2
24
12
  cron:dce04363b6a02d36f8da88f202cedfae2daa6a2c
25
- daemontools:7ff23d4884138e957bef04a1e63e8c240020fcc1
26
13
  database:1ab3822ca50824fbdc14f7c89341faa7ae1e90cb
27
- djbdns:d3b2dd6e0fe1faf6193d44b794685b59acaf2da2
28
14
  dmg:11caf56f57a1168a891f01f0614a01b879aff624
29
15
  drbd:e65b60894b48855163c3a13ead40fb897d66c4b8
30
16
  dynect:5ef2328cc612cc4c36882742367af0e2bdbd0367
31
- emacs:96d1026a6a6cdab979c7ef54fc27fe49b1f5d8ca
32
17
  erlang:58290537b49b495bc18e7a06d9d7560b4d239582
33
18
  fail2ban:7b1939c9bc345f3a449545cb8e7ddb8190a6fe5f
34
19
  firewall:81a8db5a868f9f486ba694a7fe8eb969a2ae99d1
35
20
  freebsd:f7a4457507caab966448f4e37709370df05d6167
36
21
  gecode:87dc9114bf79e67b8eea9f2a0c42929040d08e4b
37
22
  gems:6f8c222cf8326b5266ca3c68344accbbf8d5c468
38
- getting-started:ec6b8de327daa43403560a1204a2ac7645a3b959
39
- git:f971753d7bac72c4decf2dddda8f9be5289ae324
40
- glance:ce4ee4fbc75309e1f7eae8eda1841d8bd1a2d8ec
41
- gnu_parallel:ad31c1d7411686b8b54ce726d9cf8d864a33fcaf
42
- god:2e1691b7d9383a7f3fc6fe0ad285801a3397decb
43
23
  gunicorn:89be74c6b47bdb980ee1d98f9aae6b747f1d11e8
44
- hadoop:eab8f63f9a47714a6ca05821285db6043dc7be5e
45
- haproxy:6b7a212d1c82ac420cba3335a31e32f346d149fa
46
24
  heartbeat:da496afa31286512a9b977974bec5ff51d6de9d8
47
25
  homebrew:f42d8d09d8ae3d45f5bdb680dd52da351cb80e2e
48
- horizon:736422cecad62a939f1721df66b6388e9bc489de
49
26
  iis:ab7e4823d375e8eb4f927dee5b7ab0591301cb0e
50
- imagemagick:20aec29c45ee3c04616bb3fa3cd5ddf4baf48f00
51
27
  iptables:da126cf900af3cc36bf212973bb8d0be69fa2b9f
52
- java:81d7d7f8f831405af1f42c8bb4230e6456b493be
53
28
  jetty:d165775c2c7ce3cc484cbe8c7aadf6649505d078
54
- jira:328b662dbf07078fa5841035260ade016f3dd1f1
55
29
  jpackage:23e6f4b717620455ee9d29cbf82d9a7ab7fa6e5b
56
30
  keepalived:629c8e4c5251f6125be9f6eacecb1369fcb1cd4c
57
- keystone:7d54242ac6edfffd1ed017914018a02d07ef5194
58
31
  kickstart:6523fca008362ed72f8fbb25f0c7af70d563b96d
59
- logrotate:e1b6ee784954218652f817211e22fea9baf042f6
60
32
  logwatch:706174796a3bc1d85d57d3aee792e78cb13570ac
61
33
  lvm:57bd5291fbaa41e7a13f25c4553cdacbfc3ad3dd
62
- man:f52cfeaa6a8ca0979eee235e6d9c7243104af2f5
63
34
  maradns:e975ded4303432629ad37234cb7a05c9d6edcf73
64
35
  maven:e486321f1e89f7ad2b9700c08fcbc68c32daa599
65
36
  memcached:db13b6c4088e93faf995441df4aa856adc84c565
66
- mercurial:5b8f95e1a8b74bc92d6b2e119e2cf31bc76ad059
67
37
  motd-tail:e01096b73c387a46302f63ae6f838fac94e0ca81
68
- munin:ac753f2ff5be33473a36c9b22625d0d7a47f485a
69
38
  mysql:1709b1ea22339a0c829cf5ced8c5a7ed4a186615
70
- nagios:a21ac7b3ee2384b31ffdee7986ba2891235bd845
71
- nginx:638280b3125e68d0903a60b167206f9be5bc2cca
72
- nova:04417ae3bca444b6870f3551ad3528c3ba661d0c
73
39
  nscd:28f37aaf70228c0f5b55c36b78bf3fbd56cb3112
74
- ntp:288935754b2c25017e3e0890ffb1a35b2a9f4668
75
40
  ohai:8ad8c92b14d5198ffa5ebd094acd83ba0c5c828c
76
41
  openldap:2f21ae90544b4f938e554f914955e3fac1a885de
77
42
  openssh:a61b47fb0efbdab731e7929506bb1dc6902f0091
78
43
  openssl:7f5b84a942f015191ade6badf65a49f1fe7b05b1
79
- openvpn:1d9838ca3cec981e1ab78d1160821d77f26978b3
80
- ossec:44dddb496e595d200c802b515adfd4ac2e497647
81
- pacman:77efa35dca9e53bc6c67773b217df645429e53f4
82
44
  partial_search:9a96d68a4af2eff1cf5d3e8ed7ff2ede723a09c8
83
45
  passenger_apache2:793f7bbaac7a883d5f9ef1414260718e33958ae8
84
- pdns:bf14786602b43a15025275c1acf73a52eac9d577
85
46
  perl:bd6f978aea0ad7e65a8e6266951476b717a9a074
86
47
  php:f3f5db8d823db821ac696f7b52b2a613c1e2f167
87
48
  postfix:d7d149e7a7235b2733455e524d86e3a984b9b97c
88
- postgresql:cdeb1ccca7cfd5564706315a8d95986658b5c300
89
49
  powershell:4b175affe1a8a7d091a8ca905a580bf975af5edc
90
- pxe_dust:8f2e8ebd9f41086fe1033a613197da357aa075b5
91
- python:34cb929504f9972d9d0ce66cad70254d3ab36f21
92
- rabbitmq:b297e3137c37d3ed9a4e4fc17f9fc6a56e9a98f4
93
- radiant:5bc888a4dfa3cc5f397a196706434bae12ff61b3
94
- reprepro:30bc7be95a03f16dc042de3b5605a0e8b5153a4e
95
50
  resolver:105ad0a2fc9c065a7c4455cfc07ab7771b8e0da0
96
51
  rsync:41756f404fc39f3ce407cce9fe03294dd907c0fe
97
52
  rsyslog:8830d558d2ee3126fef56ea3a25a4f0253ce269f
98
- runit:378c918b78a7e5f0819211fc8bce034ee071dcc9
99
- samba:c68e51b0bfaf8770a3e89224858aa0a095dd725a
100
- sbuild:ce41bcfdf06baf35c6e0c254c6f39a823d350b05
101
- screen:ba61c6529958decb2ebcc133c198cf37b16b8aaa
102
- selinux:7a1b10b4f3191272c07bc3a8efcd7f50dda52d18
103
- snort:e829f5e2a8d7c5dd8799216371692b07fd6f636f
104
53
  sql_server:d9702f8fc29f208c9e712627cda64ccae2d71321
105
54
  sqlite:3efb50f4166f04f1afefa21f7f8fe7e9082b37ed
106
55
  ssh_known_hosts:a89f0c32e8e2c408a2e153153cc703f1184c6b72
107
56
  stompserver:bf81830bb7783f4198565201c825c23267e1d515
108
57
  subversion:cad4c069deca1fbbfb6b8f4d21b6c341cc9c6b55
109
58
  sudo:00d024f293afb9df4fea23ba127529d67c1daf14
110
- supervisor:83d4e59560cf35050819b12a6625b4c43753fbd3
111
- swift:73c8bf74330a07850645c9e2115596781681e6fc
112
59
  tftp:f4016b14eae2c0fe7fb48020bf28039c2de043a4
113
- thrift:f7e0f2ec87b1e7bf382870b785cf74973bdbc9f8
114
- tmux:d023930b19325d3366a12174f9df227a95ca5fcd
115
60
  tomcat:8934392833cef89b7b779b4cd36ad46d088b643b
116
- trac:7c5d613102701a88c51af80b9f492a9adc5c8f93
117
61
  transmission:c3d62aa4741a55b693630d9cc48b012ff22d2e7b
118
62
  ubuntu:7d21b626873ee397755d59aa222cf7fa681f6e90
119
- ucspi-tcp:6140c33bbffdce20c94409485de3f42de4861a09
120
63
  ufw:6bc6de62a84f6fa6f172edf0a490f1a332e89e29
121
64
  unicorn:bacbb2400dcb476dd53784aa965fa9329e8c3869
122
65
  users:c51c96afca83b382678dc21b8deb25677e6a3d8a
123
- varnish:359ce3329f576884815b4146dc889970c8908e40
124
66
  vim:88e8d018267d2cd5cfa3260ce55a0025f52dae6f
125
67
  webpi:6cb4fde9dedf2abc980fa49880753512baa26b23
126
68
  whitelist-node-attrs:2d76a2d179096e3ab048547d0d7849238ac2a5d3
127
69
  windows:1601558f5fce30bed47bfc6d458a80891e127c61
128
70
  wix:422b8da1dcf706bb4742d83abc44a649522afe83
129
- wordpress:e159cf1147107c7dffdccf676b8dda4faa507259
130
71
  xfs:7f1033820459324a863b2955e774cfa366fbc70f
131
72
  xml:0b538834aa26c4df5918aa193029d285d7b1d4de
132
73
  yum:b1191511b011790b2fc5c35cfbc78d0cc7bbc5b8
133
- zenoss:d2bbe7fc3d4fdade89b324ab856b156c0c3cf8cc
134
74
  zlib:45342f78d2866c3b2f443e693df562317e37963d
135
75
  zsh:3bff82836677564478ffc90dfb487ffc986702f3