logstash-lib 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. data/.gitignore +24 -0
  2. data/.tailor +8 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG +1185 -0
  5. data/CONTRIBUTING.md +61 -0
  6. data/CONTRIBUTORS +79 -0
  7. data/LICENSE +14 -0
  8. data/Makefile +460 -0
  9. data/README.md +120 -0
  10. data/STYLE.md +96 -0
  11. data/bin/logstash +37 -0
  12. data/bin/logstash-test +4 -0
  13. data/bin/logstash-web +4 -0
  14. data/bin/logstash.lib.sh +78 -0
  15. data/bot/check_pull_changelog.rb +89 -0
  16. data/docs/configuration.md +260 -0
  17. data/docs/docgen.rb +242 -0
  18. data/docs/extending/example-add-a-new-filter.md +121 -0
  19. data/docs/extending/index.md +91 -0
  20. data/docs/flags.md +43 -0
  21. data/docs/generate_index.rb +28 -0
  22. data/docs/index.html.erb +56 -0
  23. data/docs/learn.md +46 -0
  24. data/docs/life-of-an-event.md +109 -0
  25. data/docs/logging-tool-comparisons.md +60 -0
  26. data/docs/plugin-doc.html.erb +91 -0
  27. data/docs/plugin-milestones.md +41 -0
  28. data/docs/plugin-synopsis.html.erb +24 -0
  29. data/docs/release-engineering.md +46 -0
  30. data/docs/release-test-results.md +14 -0
  31. data/docs/repositories.md +35 -0
  32. data/docs/tutorials/10-minute-walkthrough/apache-elasticsearch.conf +35 -0
  33. data/docs/tutorials/10-minute-walkthrough/apache-parse.conf +33 -0
  34. data/docs/tutorials/10-minute-walkthrough/apache_log.1 +1 -0
  35. data/docs/tutorials/10-minute-walkthrough/apache_log.2.bz2 +0 -0
  36. data/docs/tutorials/10-minute-walkthrough/hello-search.conf +25 -0
  37. data/docs/tutorials/10-minute-walkthrough/hello.conf +16 -0
  38. data/docs/tutorials/10-minute-walkthrough/index.md +124 -0
  39. data/docs/tutorials/10-minute-walkthrough/step-5-output.txt +17 -0
  40. data/docs/tutorials/getting-started-centralized-overview-diagram.png +0 -0
  41. data/docs/tutorials/getting-started-centralized-overview-diagram.xml +1 -0
  42. data/docs/tutorials/getting-started-centralized.md +217 -0
  43. data/docs/tutorials/getting-started-simple.md +200 -0
  44. data/docs/tutorials/just-enough-rabbitmq-for-logstash.md +201 -0
  45. data/docs/tutorials/media/frontend-response-codes.png +0 -0
  46. data/docs/tutorials/metrics-from-logs.md +84 -0
  47. data/docs/tutorials/zeromq.md +118 -0
  48. data/extract_services.rb +29 -0
  49. data/gembag.rb +64 -0
  50. data/lib/logstash-event.rb +2 -0
  51. data/lib/logstash.rb +4 -0
  52. data/lib/logstash/JRUBY-6970-openssl.rb +22 -0
  53. data/lib/logstash/JRUBY-6970.rb +102 -0
  54. data/lib/logstash/agent.rb +305 -0
  55. data/lib/logstash/certs/cacert.pem +3895 -0
  56. data/lib/logstash/codecs/base.rb +49 -0
  57. data/lib/logstash/codecs/compress_spooler.rb +50 -0
  58. data/lib/logstash/codecs/dots.rb +18 -0
  59. data/lib/logstash/codecs/edn.rb +28 -0
  60. data/lib/logstash/codecs/edn_lines.rb +36 -0
  61. data/lib/logstash/codecs/fluent.rb +55 -0
  62. data/lib/logstash/codecs/graphite.rb +114 -0
  63. data/lib/logstash/codecs/json.rb +41 -0
  64. data/lib/logstash/codecs/json_lines.rb +52 -0
  65. data/lib/logstash/codecs/json_spooler.rb +22 -0
  66. data/lib/logstash/codecs/line.rb +58 -0
  67. data/lib/logstash/codecs/msgpack.rb +43 -0
  68. data/lib/logstash/codecs/multiline.rb +189 -0
  69. data/lib/logstash/codecs/netflow.rb +342 -0
  70. data/lib/logstash/codecs/netflow/util.rb +212 -0
  71. data/lib/logstash/codecs/noop.rb +19 -0
  72. data/lib/logstash/codecs/oldlogstashjson.rb +56 -0
  73. data/lib/logstash/codecs/plain.rb +48 -0
  74. data/lib/logstash/codecs/rubydebug.rb +22 -0
  75. data/lib/logstash/codecs/spool.rb +38 -0
  76. data/lib/logstash/config/Makefile +4 -0
  77. data/lib/logstash/config/config_ast.rb +380 -0
  78. data/lib/logstash/config/file.rb +39 -0
  79. data/lib/logstash/config/grammar.rb +3504 -0
  80. data/lib/logstash/config/grammar.treetop +241 -0
  81. data/lib/logstash/config/mixin.rb +464 -0
  82. data/lib/logstash/config/registry.rb +13 -0
  83. data/lib/logstash/config/test.conf +18 -0
  84. data/lib/logstash/errors.rb +10 -0
  85. data/lib/logstash/event.rb +262 -0
  86. data/lib/logstash/filters/advisor.rb +178 -0
  87. data/lib/logstash/filters/alter.rb +173 -0
  88. data/lib/logstash/filters/anonymize.rb +93 -0
  89. data/lib/logstash/filters/base.rb +190 -0
  90. data/lib/logstash/filters/checksum.rb +50 -0
  91. data/lib/logstash/filters/cidr.rb +76 -0
  92. data/lib/logstash/filters/cipher.rb +145 -0
  93. data/lib/logstash/filters/clone.rb +35 -0
  94. data/lib/logstash/filters/collate.rb +114 -0
  95. data/lib/logstash/filters/csv.rb +94 -0
  96. data/lib/logstash/filters/date.rb +244 -0
  97. data/lib/logstash/filters/dns.rb +201 -0
  98. data/lib/logstash/filters/drop.rb +32 -0
  99. data/lib/logstash/filters/elapsed.rb +256 -0
  100. data/lib/logstash/filters/elasticsearch.rb +73 -0
  101. data/lib/logstash/filters/environment.rb +27 -0
  102. data/lib/logstash/filters/extractnumbers.rb +84 -0
  103. data/lib/logstash/filters/gelfify.rb +52 -0
  104. data/lib/logstash/filters/geoip.rb +145 -0
  105. data/lib/logstash/filters/grep.rb +153 -0
  106. data/lib/logstash/filters/grok.rb +425 -0
  107. data/lib/logstash/filters/grokdiscovery.rb +75 -0
  108. data/lib/logstash/filters/i18n.rb +51 -0
  109. data/lib/logstash/filters/json.rb +90 -0
  110. data/lib/logstash/filters/json_encode.rb +52 -0
  111. data/lib/logstash/filters/kv.rb +232 -0
  112. data/lib/logstash/filters/metaevent.rb +68 -0
  113. data/lib/logstash/filters/metrics.rb +237 -0
  114. data/lib/logstash/filters/multiline.rb +241 -0
  115. data/lib/logstash/filters/mutate.rb +399 -0
  116. data/lib/logstash/filters/noop.rb +21 -0
  117. data/lib/logstash/filters/prune.rb +149 -0
  118. data/lib/logstash/filters/punct.rb +32 -0
  119. data/lib/logstash/filters/railsparallelrequest.rb +86 -0
  120. data/lib/logstash/filters/range.rb +142 -0
  121. data/lib/logstash/filters/ruby.rb +42 -0
  122. data/lib/logstash/filters/sleep.rb +111 -0
  123. data/lib/logstash/filters/split.rb +64 -0
  124. data/lib/logstash/filters/sumnumbers.rb +73 -0
  125. data/lib/logstash/filters/syslog_pri.rb +107 -0
  126. data/lib/logstash/filters/translate.rb +121 -0
  127. data/lib/logstash/filters/unique.rb +29 -0
  128. data/lib/logstash/filters/urldecode.rb +57 -0
  129. data/lib/logstash/filters/useragent.rb +112 -0
  130. data/lib/logstash/filters/uuid.rb +58 -0
  131. data/lib/logstash/filters/xml.rb +139 -0
  132. data/lib/logstash/filters/zeromq.rb +123 -0
  133. data/lib/logstash/filterworker.rb +122 -0
  134. data/lib/logstash/inputs/base.rb +125 -0
  135. data/lib/logstash/inputs/collectd.rb +306 -0
  136. data/lib/logstash/inputs/drupal_dblog.rb +323 -0
  137. data/lib/logstash/inputs/drupal_dblog/jdbcconnection.rb +66 -0
  138. data/lib/logstash/inputs/elasticsearch.rb +140 -0
  139. data/lib/logstash/inputs/eventlog.rb +129 -0
  140. data/lib/logstash/inputs/eventlog/racob_fix.rb +44 -0
  141. data/lib/logstash/inputs/exec.rb +69 -0
  142. data/lib/logstash/inputs/file.rb +146 -0
  143. data/lib/logstash/inputs/ganglia.rb +127 -0
  144. data/lib/logstash/inputs/ganglia/gmondpacket.rb +146 -0
  145. data/lib/logstash/inputs/ganglia/xdr.rb +327 -0
  146. data/lib/logstash/inputs/gelf.rb +138 -0
  147. data/lib/logstash/inputs/gemfire.rb +222 -0
  148. data/lib/logstash/inputs/generator.rb +97 -0
  149. data/lib/logstash/inputs/graphite.rb +41 -0
  150. data/lib/logstash/inputs/heroku.rb +51 -0
  151. data/lib/logstash/inputs/imap.rb +136 -0
  152. data/lib/logstash/inputs/irc.rb +84 -0
  153. data/lib/logstash/inputs/log4j.rb +136 -0
  154. data/lib/logstash/inputs/lumberjack.rb +53 -0
  155. data/lib/logstash/inputs/pipe.rb +57 -0
  156. data/lib/logstash/inputs/rabbitmq.rb +126 -0
  157. data/lib/logstash/inputs/rabbitmq/bunny.rb +118 -0
  158. data/lib/logstash/inputs/rabbitmq/hot_bunnies.rb +1 -0
  159. data/lib/logstash/inputs/rabbitmq/march_hare.rb +129 -0
  160. data/lib/logstash/inputs/redis.rb +263 -0
  161. data/lib/logstash/inputs/relp.rb +106 -0
  162. data/lib/logstash/inputs/s3.rb +279 -0
  163. data/lib/logstash/inputs/snmptrap.rb +87 -0
  164. data/lib/logstash/inputs/sqlite.rb +185 -0
  165. data/lib/logstash/inputs/sqs.rb +172 -0
  166. data/lib/logstash/inputs/stdin.rb +46 -0
  167. data/lib/logstash/inputs/stomp.rb +84 -0
  168. data/lib/logstash/inputs/syslog.rb +237 -0
  169. data/lib/logstash/inputs/tcp.rb +231 -0
  170. data/lib/logstash/inputs/threadable.rb +18 -0
  171. data/lib/logstash/inputs/twitter.rb +82 -0
  172. data/lib/logstash/inputs/udp.rb +81 -0
  173. data/lib/logstash/inputs/unix.rb +163 -0
  174. data/lib/logstash/inputs/varnishlog.rb +48 -0
  175. data/lib/logstash/inputs/websocket.rb +50 -0
  176. data/lib/logstash/inputs/wmi.rb +72 -0
  177. data/lib/logstash/inputs/xmpp.rb +81 -0
  178. data/lib/logstash/inputs/zenoss.rb +143 -0
  179. data/lib/logstash/inputs/zeromq.rb +165 -0
  180. data/lib/logstash/kibana.rb +113 -0
  181. data/lib/logstash/loadlibs.rb +9 -0
  182. data/lib/logstash/logging.rb +89 -0
  183. data/lib/logstash/monkeypatches-for-bugs.rb +2 -0
  184. data/lib/logstash/monkeypatches-for-debugging.rb +47 -0
  185. data/lib/logstash/monkeypatches-for-performance.rb +66 -0
  186. data/lib/logstash/multiqueue.rb +53 -0
  187. data/lib/logstash/namespace.rb +16 -0
  188. data/lib/logstash/outputs/base.rb +120 -0
  189. data/lib/logstash/outputs/boundary.rb +116 -0
  190. data/lib/logstash/outputs/circonus.rb +78 -0
  191. data/lib/logstash/outputs/cloudwatch.rb +351 -0
  192. data/lib/logstash/outputs/csv.rb +55 -0
  193. data/lib/logstash/outputs/datadog.rb +93 -0
  194. data/lib/logstash/outputs/datadog_metrics.rb +123 -0
  195. data/lib/logstash/outputs/elasticsearch.rb +332 -0
  196. data/lib/logstash/outputs/elasticsearch/elasticsearch-template.json +44 -0
  197. data/lib/logstash/outputs/elasticsearch_http.rb +256 -0
  198. data/lib/logstash/outputs/elasticsearch_river.rb +214 -0
  199. data/lib/logstash/outputs/email.rb +299 -0
  200. data/lib/logstash/outputs/exec.rb +40 -0
  201. data/lib/logstash/outputs/file.rb +180 -0
  202. data/lib/logstash/outputs/ganglia.rb +75 -0
  203. data/lib/logstash/outputs/gelf.rb +208 -0
  204. data/lib/logstash/outputs/gemfire.rb +103 -0
  205. data/lib/logstash/outputs/google_bigquery.rb +570 -0
  206. data/lib/logstash/outputs/google_cloud_storage.rb +431 -0
  207. data/lib/logstash/outputs/graphite.rb +143 -0
  208. data/lib/logstash/outputs/graphtastic.rb +185 -0
  209. data/lib/logstash/outputs/hipchat.rb +80 -0
  210. data/lib/logstash/outputs/http.rb +142 -0
  211. data/lib/logstash/outputs/irc.rb +80 -0
  212. data/lib/logstash/outputs/jira.rb +109 -0
  213. data/lib/logstash/outputs/juggernaut.rb +105 -0
  214. data/lib/logstash/outputs/librato.rb +146 -0
  215. data/lib/logstash/outputs/loggly.rb +93 -0
  216. data/lib/logstash/outputs/lumberjack.rb +51 -0
  217. data/lib/logstash/outputs/metriccatcher.rb +103 -0
  218. data/lib/logstash/outputs/mongodb.rb +81 -0
  219. data/lib/logstash/outputs/nagios.rb +119 -0
  220. data/lib/logstash/outputs/nagios_nsca.rb +123 -0
  221. data/lib/logstash/outputs/null.rb +18 -0
  222. data/lib/logstash/outputs/opentsdb.rb +101 -0
  223. data/lib/logstash/outputs/pagerduty.rb +79 -0
  224. data/lib/logstash/outputs/pipe.rb +132 -0
  225. data/lib/logstash/outputs/rabbitmq.rb +96 -0
  226. data/lib/logstash/outputs/rabbitmq/bunny.rb +135 -0
  227. data/lib/logstash/outputs/rabbitmq/hot_bunnies.rb +1 -0
  228. data/lib/logstash/outputs/rabbitmq/march_hare.rb +143 -0
  229. data/lib/logstash/outputs/redis.rb +245 -0
  230. data/lib/logstash/outputs/riak.rb +152 -0
  231. data/lib/logstash/outputs/riemann.rb +109 -0
  232. data/lib/logstash/outputs/s3.rb +356 -0
  233. data/lib/logstash/outputs/sns.rb +124 -0
  234. data/lib/logstash/outputs/solr_http.rb +78 -0
  235. data/lib/logstash/outputs/sqs.rb +141 -0
  236. data/lib/logstash/outputs/statsd.rb +116 -0
  237. data/lib/logstash/outputs/stdout.rb +53 -0
  238. data/lib/logstash/outputs/stomp.rb +67 -0
  239. data/lib/logstash/outputs/syslog.rb +145 -0
  240. data/lib/logstash/outputs/tcp.rb +145 -0
  241. data/lib/logstash/outputs/udp.rb +38 -0
  242. data/lib/logstash/outputs/websocket.rb +46 -0
  243. data/lib/logstash/outputs/websocket/app.rb +29 -0
  244. data/lib/logstash/outputs/websocket/pubsub.rb +45 -0
  245. data/lib/logstash/outputs/xmpp.rb +78 -0
  246. data/lib/logstash/outputs/zabbix.rb +108 -0
  247. data/lib/logstash/outputs/zeromq.rb +125 -0
  248. data/lib/logstash/pipeline.rb +286 -0
  249. data/lib/logstash/plugin.rb +150 -0
  250. data/lib/logstash/plugin_mixins/aws_config.rb +93 -0
  251. data/lib/logstash/program.rb +15 -0
  252. data/lib/logstash/runner.rb +238 -0
  253. data/lib/logstash/sized_queue.rb +8 -0
  254. data/lib/logstash/test.rb +183 -0
  255. data/lib/logstash/threadwatchdog.rb +37 -0
  256. data/lib/logstash/time_addon.rb +33 -0
  257. data/lib/logstash/util.rb +106 -0
  258. data/lib/logstash/util/buftok.rb +139 -0
  259. data/lib/logstash/util/charset.rb +39 -0
  260. data/lib/logstash/util/fieldreference.rb +50 -0
  261. data/lib/logstash/util/password.rb +25 -0
  262. data/lib/logstash/util/prctl.rb +11 -0
  263. data/lib/logstash/util/relp.rb +326 -0
  264. data/lib/logstash/util/require-helper.rb +18 -0
  265. data/lib/logstash/util/socket_peer.rb +7 -0
  266. data/lib/logstash/util/zenoss.rb +566 -0
  267. data/lib/logstash/util/zeromq.rb +47 -0
  268. data/lib/logstash/version.rb +6 -0
  269. data/locales/en.yml +170 -0
  270. data/logstash-event.gemspec +29 -0
  271. data/logstash.gemspec +128 -0
  272. data/patterns/firewalls +60 -0
  273. data/patterns/grok-patterns +91 -0
  274. data/patterns/haproxy +37 -0
  275. data/patterns/java +3 -0
  276. data/patterns/linux-syslog +14 -0
  277. data/patterns/mcollective +1 -0
  278. data/patterns/mcollective-patterns +4 -0
  279. data/patterns/nagios +108 -0
  280. data/patterns/postgresql +3 -0
  281. data/patterns/redis +3 -0
  282. data/patterns/ruby +2 -0
  283. data/pkg/build.sh +135 -0
  284. data/pkg/centos/after-install.sh +1 -0
  285. data/pkg/centos/before-install.sh +10 -0
  286. data/pkg/centos/before-remove.sh +11 -0
  287. data/pkg/centos/sysconfig +15 -0
  288. data/pkg/debian/after-install.sh +5 -0
  289. data/pkg/debian/before-install.sh +13 -0
  290. data/pkg/debian/before-remove.sh +13 -0
  291. data/pkg/debian/build.sh +34 -0
  292. data/pkg/debian/debian/README +6 -0
  293. data/pkg/debian/debian/changelog +17 -0
  294. data/pkg/debian/debian/compat +1 -0
  295. data/pkg/debian/debian/control +16 -0
  296. data/pkg/debian/debian/copyright +27 -0
  297. data/pkg/debian/debian/dirs +19 -0
  298. data/pkg/debian/debian/docs +0 -0
  299. data/pkg/debian/debian/logstash.default +39 -0
  300. data/pkg/debian/debian/logstash.init +201 -0
  301. data/pkg/debian/debian/logstash.install +1 -0
  302. data/pkg/debian/debian/logstash.logrotate +9 -0
  303. data/pkg/debian/debian/logstash.postinst +68 -0
  304. data/pkg/debian/debian/logstash.postrm +23 -0
  305. data/pkg/debian/debian/manpage.1.ex +59 -0
  306. data/pkg/debian/debian/preinst.ex +37 -0
  307. data/pkg/debian/debian/prerm.ex +40 -0
  308. data/pkg/debian/debian/release.conf +5 -0
  309. data/pkg/debian/debian/rules +80 -0
  310. data/pkg/debian/debian/watch.ex +22 -0
  311. data/pkg/logrotate.conf +8 -0
  312. data/pkg/logstash-web.default +41 -0
  313. data/pkg/logstash-web.sysv.debian +201 -0
  314. data/pkg/logstash-web.upstart.ubuntu +18 -0
  315. data/pkg/logstash.default +45 -0
  316. data/pkg/logstash.sysv.debian +202 -0
  317. data/pkg/logstash.sysv.redhat +158 -0
  318. data/pkg/logstash.upstart.ubuntu +20 -0
  319. data/pkg/rpm/SOURCES/logstash.conf +26 -0
  320. data/pkg/rpm/SOURCES/logstash.init +80 -0
  321. data/pkg/rpm/SOURCES/logstash.logrotate +8 -0
  322. data/pkg/rpm/SOURCES/logstash.sysconfig +3 -0
  323. data/pkg/rpm/SOURCES/logstash.wrapper +105 -0
  324. data/pkg/rpm/SPECS/logstash.spec +180 -0
  325. data/pkg/rpm/readme.md +4 -0
  326. data/pkg/ubuntu/after-install.sh +7 -0
  327. data/pkg/ubuntu/before-install.sh +12 -0
  328. data/pkg/ubuntu/before-remove.sh +13 -0
  329. data/pull_release_note.rb +25 -0
  330. data/require-analyze.rb +22 -0
  331. data/spec/README.md +14 -0
  332. data/spec/codecs/edn.rb +40 -0
  333. data/spec/codecs/edn_lines.rb +53 -0
  334. data/spec/codecs/graphite.rb +96 -0
  335. data/spec/codecs/json.rb +57 -0
  336. data/spec/codecs/json_lines.rb +51 -0
  337. data/spec/codecs/json_spooler.rb +43 -0
  338. data/spec/codecs/msgpack.rb +39 -0
  339. data/spec/codecs/multiline.rb +60 -0
  340. data/spec/codecs/oldlogstashjson.rb +55 -0
  341. data/spec/codecs/plain.rb +35 -0
  342. data/spec/codecs/spool.rb +35 -0
  343. data/spec/conditionals/test.rb +323 -0
  344. data/spec/config.rb +31 -0
  345. data/spec/event.rb +165 -0
  346. data/spec/examples/fail2ban.rb +28 -0
  347. data/spec/examples/graphite-input.rb +41 -0
  348. data/spec/examples/mysql-slow-query.rb +70 -0
  349. data/spec/examples/parse-apache-logs.rb +66 -0
  350. data/spec/examples/parse-haproxy-logs.rb +115 -0
  351. data/spec/examples/syslog.rb +48 -0
  352. data/spec/filters/alter.rb +96 -0
  353. data/spec/filters/anonymize.rb +189 -0
  354. data/spec/filters/checksum.rb +41 -0
  355. data/spec/filters/clone.rb +67 -0
  356. data/spec/filters/collate.rb +122 -0
  357. data/spec/filters/csv.rb +174 -0
  358. data/spec/filters/date.rb +285 -0
  359. data/spec/filters/date_performance.rb +31 -0
  360. data/spec/filters/dns.rb +159 -0
  361. data/spec/filters/drop.rb +19 -0
  362. data/spec/filters/elapsed.rb +294 -0
  363. data/spec/filters/environment.rb +43 -0
  364. data/spec/filters/geoip.rb +62 -0
  365. data/spec/filters/grep.rb +342 -0
  366. data/spec/filters/grok.rb +473 -0
  367. data/spec/filters/grok/timeout2.rb +56 -0
  368. data/spec/filters/grok/timeouts.rb +39 -0
  369. data/spec/filters/i18n.rb +25 -0
  370. data/spec/filters/json.rb +72 -0
  371. data/spec/filters/json_encode.rb +37 -0
  372. data/spec/filters/kv.rb +403 -0
  373. data/spec/filters/metrics.rb +212 -0
  374. data/spec/filters/multiline.rb +119 -0
  375. data/spec/filters/mutate.rb +180 -0
  376. data/spec/filters/noop.rb +221 -0
  377. data/spec/filters/prune.rb +441 -0
  378. data/spec/filters/punct.rb +18 -0
  379. data/spec/filters/railsparallelrequest.rb +112 -0
  380. data/spec/filters/range.rb +169 -0
  381. data/spec/filters/split.rb +58 -0
  382. data/spec/filters/translate.rb +70 -0
  383. data/spec/filters/unique.rb +25 -0
  384. data/spec/filters/useragent.rb +42 -0
  385. data/spec/filters/xml.rb +157 -0
  386. data/spec/inputs/file.rb +107 -0
  387. data/spec/inputs/gelf.rb +52 -0
  388. data/spec/inputs/generator.rb +30 -0
  389. data/spec/inputs/imap.rb +60 -0
  390. data/spec/inputs/redis.rb +63 -0
  391. data/spec/inputs/relp.rb +70 -0
  392. data/spec/inputs/tcp.rb +101 -0
  393. data/spec/jar.rb +21 -0
  394. data/spec/outputs/csv.rb +266 -0
  395. data/spec/outputs/elasticsearch.rb +161 -0
  396. data/spec/outputs/elasticsearch_http.rb +240 -0
  397. data/spec/outputs/email.rb +173 -0
  398. data/spec/outputs/file.rb +82 -0
  399. data/spec/outputs/graphite.rb +236 -0
  400. data/spec/outputs/redis.rb +127 -0
  401. data/spec/speed.rb +20 -0
  402. data/spec/sqlite-test.rb +81 -0
  403. data/spec/support/LOGSTASH-733.rb +21 -0
  404. data/spec/support/LOGSTASH-820.rb +25 -0
  405. data/spec/support/akamai-grok.rb +26 -0
  406. data/spec/support/date-http.rb +17 -0
  407. data/spec/support/postwait1.rb +26 -0
  408. data/spec/support/pull375.rb +21 -0
  409. data/spec/test_utils.rb +125 -0
  410. data/spec/util/fieldeval_spec.rb +44 -0
  411. data/test/jenkins/config.xml.erb +74 -0
  412. data/test/jenkins/create-jobs.rb +23 -0
  413. data/test/jenkins/generatorjob.config.xml +66 -0
  414. data/tools/Gemfile +14 -0
  415. data/tools/Gemfile.jruby-1.9.lock +322 -0
  416. data/tools/Gemfile.rbx-2.1.lock +516 -0
  417. data/tools/Gemfile.ruby-1.9.1.lock +310 -0
  418. data/tools/Gemfile.ruby-2.0.0.lock +310 -0
  419. metadata +629 -0
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/util"
4
+
5
+ class LogStash::Util::Charset
6
+ attr_accessor :logger
7
+ def initialize(charset)
8
+ @charset = charset
9
+ end
10
+
11
+ def convert(data)
12
+ data.force_encoding(@charset)
13
+ if @charset == "UTF-8"
14
+ # Some users don't know the charset of their logs or just don't know they
15
+ # can set the charset setting.
16
+ if !data.valid_encoding?
17
+ @logger.warn("Received an event that has a different character encoding than you configured.", :text => data.inspect[1..-2], :expected_charset => @charset)
18
+ #if @force_lossy_charset_conversion
19
+ ## Janky hack to force ruby to re-encode UTF-8 with replacement chars.
20
+ #data.force_encoding("CP65001")
21
+ #data = data.encode("UTF-8", :invalid => :replace, :undef => :replace)
22
+ #else
23
+ #end
24
+
25
+ # A silly hack to help convert some of the unknown bytes to
26
+ # somewhat-readable escape codes. The [1..-2] is to trim the quotes
27
+ # ruby puts on the value.
28
+ data = data.inspect[1..-2]
29
+ else
30
+ # The user has declared the character encoding of this data is
31
+ # something other than UTF-8. Let's convert it (as cleanly as possible)
32
+ # into UTF-8 so we can use it with JSON, etc.
33
+ data = data.encode("UTF-8", :invalid => :replace, :undef => :replace)
34
+ end
35
+ end
36
+ return data
37
+ end # def convert
38
+ end # class LogStash::Util::Charset
39
+
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/util"
4
+
5
+ module LogStash::Util::FieldReference
6
+ def compile(str)
7
+ if str[0,1] != '['
8
+ return <<-"CODE"
9
+ lambda do |e, &block|
10
+ return block.call(e, #{str.inspect}) unless block.nil?
11
+ return e[#{str.inspect}]
12
+ end
13
+ CODE
14
+ end
15
+
16
+ code = "lambda do |e, &block|\n"
17
+ selectors = str.scan(/(?<=\[).+?(?=\])/)
18
+ selectors.each_with_index do |tok, i|
19
+ last = (i == selectors.count() - 1)
20
+ code << " # [#{tok}]#{ last ? " (last selector)" : "" }\n"
21
+
22
+ if last
23
+ code << <<-"CODE"
24
+ return block.call(e, #{tok.inspect}) unless block.nil?
25
+ CODE
26
+ end
27
+
28
+ code << <<-"CODE"
29
+ if e.is_a?(Array)
30
+ e = e[#{tok.to_i}]
31
+ else
32
+ e = e[#{tok.inspect}]
33
+ end
34
+ return e if e.nil?
35
+ CODE
36
+
37
+ end
38
+ code << "return e\nend"
39
+ #puts code
40
+ return code
41
+ end # def compile
42
+
43
+ def exec(str, obj, &block)
44
+ @__fieldeval_cache ||= {}
45
+ @__fieldeval_cache[str] ||= eval(compile(str))
46
+ return @__fieldeval_cache[str].call(obj, &block)
47
+ end
48
+
49
+ extend self
50
+ end # module LogStash::Util::FieldReference
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/util"
4
+
5
+ # This class exists to quietly wrap a password string so that, when printed or
6
+ # logged, you don't accidentally print the password itself.
7
+ class LogStash::Util::Password
8
+ attr_reader :value
9
+
10
+ public
11
+ def initialize(password)
12
+ @value = password
13
+ end # def initialize
14
+
15
+ public
16
+ def to_s
17
+ return "<password>"
18
+ end # def to_s
19
+
20
+ public
21
+ def inspect
22
+ return to_s
23
+ end # def inspect
24
+ end # class LogStash::Util::Password
25
+
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module LibC
4
+ require "ffi"
5
+ extend FFI::Library
6
+ ffi_lib 'c'
7
+
8
+ # Ok so the 2nd arg isn't really a string... but whaatever
9
+ attach_function :prctl, [:int, :string, :long, :long, :long], :int
10
+ end
11
+
@@ -0,0 +1,326 @@
1
+ # encoding: utf-8
2
+ require "socket"
3
+
4
+ class Relp#This isn't much use on its own, but gives RelpServer and RelpClient things
5
+
6
+ RelpVersion = '0'#TODO: spec says this is experimental, but rsyslog still seems to exclusively use it
7
+ RelpSoftware = 'logstash,1.1.1,http://logstash.net'
8
+
9
+ class RelpError < StandardError; end
10
+ class InvalidCommand < RelpError; end
11
+ class InappropriateCommand < RelpError; end
12
+ class ConnectionClosed < RelpError; end
13
+ class InsufficientCommands < RelpError; end
14
+
15
+ def valid_command?(command)
16
+ valid_commands = Array.new
17
+
18
+ #Allow anything in the basic protocol for both directions
19
+ valid_commands << 'open'
20
+ valid_commands << 'close'
21
+
22
+ #These are things that are part of the basic protocol, but only valid in one direction (rsp, close etc.) TODO: would they be invalid or just innapropriate?
23
+ valid_commands += @basic_relp_commands
24
+
25
+ #These are extra commands that we require, otherwise refuse the connection TODO: some of these are only valid on one direction
26
+ valid_commands += @required_relp_commands
27
+
28
+ #TODO: optional_relp_commands
29
+
30
+ #TODO: vague mentions of abort and starttls commands in spec need looking into
31
+ return valid_commands.include?(command)
32
+ end
33
+
34
+ def frame_write(socket, frame)
35
+ unless self.server? #I think we have to trust a server to be using the correct txnr
36
+ #Only allow txnr to be 0 or be determined automatically
37
+ frame['txnr'] = self.nexttxnr() unless frame['txnr']==0
38
+ end
39
+ frame['txnr'] = frame['txnr'].to_s
40
+ frame['message'] = '' if frame['message'].nil?
41
+ frame['datalen'] = frame['message'].length.to_s
42
+ wiredata=[
43
+ frame['txnr'],
44
+ frame['command'],
45
+ frame['datalen'],
46
+ frame['message']
47
+ ].join(' ').strip
48
+ begin
49
+ @logger.debug? and @logger.debug("Writing to socket", :data => wiredata)
50
+ socket.write(wiredata)
51
+ #Ending each frame with a newline is required in the specifications
52
+ #Doing it a separately is useful (but a bit of a bodge) because
53
+ #for some reason it seems to take 2 writes after the server closes the
54
+ #connection before we get an exception
55
+ socket.write("\n")
56
+ rescue Errno::EPIPE,IOError,Errno::ECONNRESET#TODO: is this sufficient to catch all broken connections?
57
+ raise ConnectionClosed
58
+ end
59
+ return frame['txnr'].to_i
60
+ end
61
+
62
+ def frame_read(socket)
63
+ begin
64
+ frame = Hash.new
65
+ frame['txnr'] = socket.readline(' ').strip.to_i
66
+ frame['command'] = socket.readline(' ').strip
67
+
68
+ #Things get a little tricky here because if the length is 0 it is not followed by a space.
69
+ leading_digit=socket.read(1)
70
+ if leading_digit=='0' then
71
+ frame['datalen'] = 0
72
+ frame['message'] = ''
73
+ else
74
+ frame['datalen'] = (leading_digit + socket.readline(' ')).strip.to_i
75
+ frame['message'] = socket.read(frame['datalen'])
76
+ end
77
+ @logger.debug? and @logger.debug("Read frame", :frame => frame)
78
+ rescue EOFError,Errno::ECONNRESET,IOError
79
+ raise ConnectionClosed
80
+ end
81
+ if ! self.valid_command?(frame['command'])#TODO: is this enough to catch framing errors?
82
+ if self.server?
83
+ self.serverclose
84
+ else
85
+ self.close
86
+ end
87
+ raise InvalidCommand,frame['command']
88
+ end
89
+ return frame
90
+ end
91
+
92
+ def server?
93
+ @server
94
+ end
95
+
96
+ end
97
+
98
+ class RelpServer < Relp
99
+
100
+ def initialize(host,port,required_commands=[])
101
+ @logger = Cabin::Channel.get(LogStash)
102
+
103
+ @server=true
104
+
105
+ #These are things that are part of the basic protocol, but only valid in one direction (rsp, close etc.)
106
+ @basic_relp_commands = ['close']#TODO: check for others
107
+
108
+ #These are extra commands that we require, otherwise refuse the connection
109
+ @required_relp_commands = required_commands
110
+
111
+ begin
112
+ @server = TCPServer.new(host, port)
113
+ rescue Errno::EADDRINUSE
114
+ @logger.error("Could not start RELP server: Address in use",
115
+ :host => host, :port => port)
116
+ raise
117
+ end
118
+ @logger.info? and @logger.info("Started RELP Server", :host => host, :port => port)
119
+ end
120
+
121
+ def accept
122
+ socket = @server.accept
123
+ frame=self.frame_read(socket)
124
+ if frame['command'] == 'open'
125
+ offer=Hash[*frame['message'].scan(/^(.*)=(.*)$/).flatten]
126
+ if offer['relp_version'].nil?
127
+ @logger.warn("No relp version specified")
128
+ #if no version specified, relp spec says we must close connection
129
+ self.serverclose(socket)
130
+ raise RelpError, 'No relp_version specified'
131
+ #subtracting one array from the other checks to see if all elements in @required_relp_commands are present in the offer
132
+ elsif ! (@required_relp_commands - offer['commands'].split(',')).empty?
133
+ @logger.warn("Not all required commands are available", :required => @required_relp_commands, :offer => offer['commands'])
134
+ #Tell them why we're closing the connection:
135
+ response_frame = Hash.new
136
+ response_frame['txnr'] = frame['txnr']
137
+ response_frame['command'] = 'rsp'
138
+ response_frame['message'] = '500 Required command(s) '
139
+ + (@required_relp_commands - offer['commands'].split(',')).join(',')
140
+ + ' not offered'
141
+ self.frame_write(socket,response_frame)
142
+ self.serverclose(socket)
143
+ raise InsufficientCommands, offer['commands']
144
+ + ' offered, require ' + @required_relp_commands.join(',')
145
+ else
146
+ #attempt to set up connection
147
+ response_frame = Hash.new
148
+ response_frame['txnr'] = frame['txnr']
149
+ response_frame['command'] = 'rsp'
150
+
151
+ response_frame['message'] = '200 OK '
152
+ response_frame['message'] += 'relp_version=' + RelpVersion + "\n"
153
+ response_frame['message'] += 'relp_software=' + RelpSoftware + "\n"
154
+ response_frame['message'] += 'commands=' + @required_relp_commands.join(',')#TODO: optional ones
155
+ self.frame_write(socket, response_frame)
156
+ return self, socket
157
+ end
158
+ else
159
+ self.serverclose(socket)
160
+ raise InappropriateCommand, frame['command'] + ' expecting open'
161
+ end
162
+ end
163
+
164
+ #This does not ack the frame, just reads it
165
+ def syslog_read(socket)
166
+ frame = self.frame_read(socket)
167
+ if frame['command'] == 'syslog'
168
+ return frame
169
+ elsif frame['command'] == 'close'
170
+ #the client is closing the connection, acknowledge the close and act on it
171
+ response_frame = Hash.new
172
+ response_frame['txnr'] = frame['txnr']
173
+ response_frame['command'] = 'rsp'
174
+ self.frame_write(socket,response_frame)
175
+ self.serverclose(socket)
176
+ raise ConnectionClosed
177
+ else
178
+ #the client is trying to do something unexpected
179
+ self.serverclose(socket)
180
+ raise InappropriateCommand, frame['command'] + ' expecting syslog'
181
+ end
182
+ end
183
+
184
+ def serverclose(socket)
185
+ frame = Hash.new
186
+ frame['txnr'] = 0
187
+ frame['command'] = 'serverclose'
188
+ begin
189
+ self.frame_write(socket,frame)
190
+ socket.close
191
+ rescue ConnectionClosed
192
+ end
193
+ end
194
+
195
+ def shutdown
196
+ @server.close
197
+ rescue Exception#@server might already be down
198
+ end
199
+
200
+ def ack(socket, txnr)
201
+ frame = Hash.new
202
+ frame['txnr'] = txnr
203
+ frame['command'] = 'rsp'
204
+ frame['message'] = '200 OK'
205
+ self.frame_write(socket, frame)
206
+ end
207
+
208
+ end
209
+
210
+ #This is only used by the tests; any problems here are not as important as elsewhere
211
+ class RelpClient < Relp
212
+
213
+ def initialize(host,port,required_commands = [],buffer_size = 128,
214
+ retransmission_timeout=10)
215
+ @logger = Cabin::Channel.get(LogStash)
216
+ @logger.info? and @logger.info("Starting RELP client", :host => host, :port => port)
217
+ @server = false
218
+ @buffer = Hash.new
219
+
220
+ @buffer_size = buffer_size
221
+ @retransmission_timeout = retransmission_timeout
222
+
223
+ #These are things that are part of the basic protocol, but only valid in one direction (rsp, close etc.)
224
+ @basic_relp_commands = ['serverclose','rsp']#TODO: check for others
225
+
226
+ #These are extra commands that we require, otherwise refuse the connection
227
+ @required_relp_commands = required_commands
228
+
229
+ @socket=TCPSocket.new(host,port)
230
+
231
+ #This'll start the automatic frame numbering
232
+ @lasttxnr = 0
233
+
234
+ offer=Hash.new
235
+ offer['command'] = 'open'
236
+ offer['message'] = 'relp_version=' + RelpVersion + "\n"
237
+ offer['message'] += 'relp_software=' + RelpSoftware + "\n"
238
+ offer['message'] += 'commands=' + @required_relp_commands.join(',')#TODO: add optional ones
239
+ self.frame_write(@socket, offer)
240
+ response_frame = self.frame_read(@socket)
241
+ if response_frame['message'][0,3] != '200'
242
+ raise RelpError,response_frame['message']
243
+ end
244
+
245
+ response=Hash[*response_frame['message'][7..-1].scan(/^(.*)=(.*)$/).flatten]
246
+ if response['relp_version'].nil?
247
+ #if no version specified, relp spec says we must close connection
248
+ self.close()
249
+ raise RelpError, 'No relp_version specified; offer: '
250
+ + response_frame['message'][6..-1].scan(/^(.*)=(.*)$/).flatten
251
+
252
+ #subtracting one array from the other checks to see if all elements in @required_relp_commands are present in the offer
253
+ elsif ! (@required_relp_commands - response['commands'].split(',')).empty?
254
+ #if it can't receive syslog it's useless to us; close the connection
255
+ self.close()
256
+ raise InsufficientCommands, response['commands'] + ' offered, require '
257
+ + @required_relp_commands.join(',')
258
+ end
259
+ #If we've got this far with no problems, we're good to go
260
+ @logger.info? and @logger.info("Connection establish with server")
261
+
262
+ #This thread deals with responses that come back
263
+ reader = Thread.start do
264
+ loop do
265
+ f = self.frame_read(@socket)
266
+ if f['command'] == 'rsp' && f['message'] == '200 OK'
267
+ @buffer.delete(f['txnr'])
268
+ elsif f['command'] == 'rsp' && f['message'][0,1] == '5'
269
+ #TODO: What if we get an error for something we're already retransmitted due to timeout?
270
+ new_txnr = self.frame_write(@socket, @buffer[f['txnr']])
271
+ @buffer[new_txnr] = @buffer[f['txnr']]
272
+ @buffer.delete(f['txnr'])
273
+ elsif f['command'] == 'serverclose' || f['txnr'] == @close_txnr
274
+ break
275
+ else
276
+ #Don't know what's going on if we get here, but it can't be good
277
+ raise RelpError#TODO: raising errors like this makes no sense
278
+ end
279
+ end
280
+ end
281
+
282
+ #While this one deals with frames for which we get no reply
283
+ Thread.start do
284
+ old_buffer = Hash.new
285
+ loop do
286
+ #This returns old txnrs that are still present
287
+ (@buffer.keys & old_buffer.keys).each do |txnr|
288
+ new_txnr = self.frame_write(@socket, @buffer[txnr])
289
+ @buffer[new_txnr] = @buffer[txnr]
290
+ @buffer.delete(txnr)
291
+ end
292
+ old_buffer = @buffer
293
+ sleep @retransmission_timeout
294
+ end
295
+ end
296
+ end
297
+
298
+ #TODO: have a way to get back unacked messages on close
299
+ def close
300
+ frame = Hash.new
301
+ frame['command'] = 'close'
302
+ @close_txnr=self.frame_write(@socket, frame)
303
+ #TODO: ought to properly wait for a reply etc. The serverclose will make it work though
304
+ sleep @retransmission_timeout
305
+ @socket.close#TODO: shutdown?
306
+ return @buffer
307
+ end
308
+
309
+ def syslog_write(logline)
310
+
311
+ #If the buffer is already full, wait until a gap opens up
312
+ sleep 0.1 until @buffer.length<@buffer_size
313
+
314
+ frame = Hash.new
315
+ frame['command'] = 'syslog'
316
+ frame['message'] = logline
317
+
318
+ txnr = self.frame_write(@socket, frame)
319
+ @buffer[txnr] = frame
320
+ end
321
+
322
+ def nexttxnr
323
+ @lasttxnr += 1
324
+ end
325
+
326
+ end