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.
- data/.gitignore +24 -0
- data/.tailor +8 -0
- data/.travis.yml +12 -0
- data/CHANGELOG +1185 -0
- data/CONTRIBUTING.md +61 -0
- data/CONTRIBUTORS +79 -0
- data/LICENSE +14 -0
- data/Makefile +460 -0
- data/README.md +120 -0
- data/STYLE.md +96 -0
- data/bin/logstash +37 -0
- data/bin/logstash-test +4 -0
- data/bin/logstash-web +4 -0
- data/bin/logstash.lib.sh +78 -0
- data/bot/check_pull_changelog.rb +89 -0
- data/docs/configuration.md +260 -0
- data/docs/docgen.rb +242 -0
- data/docs/extending/example-add-a-new-filter.md +121 -0
- data/docs/extending/index.md +91 -0
- data/docs/flags.md +43 -0
- data/docs/generate_index.rb +28 -0
- data/docs/index.html.erb +56 -0
- data/docs/learn.md +46 -0
- data/docs/life-of-an-event.md +109 -0
- data/docs/logging-tool-comparisons.md +60 -0
- data/docs/plugin-doc.html.erb +91 -0
- data/docs/plugin-milestones.md +41 -0
- data/docs/plugin-synopsis.html.erb +24 -0
- data/docs/release-engineering.md +46 -0
- data/docs/release-test-results.md +14 -0
- data/docs/repositories.md +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-elasticsearch.conf +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-parse.conf +33 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.1 +1 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.2.bz2 +0 -0
- data/docs/tutorials/10-minute-walkthrough/hello-search.conf +25 -0
- data/docs/tutorials/10-minute-walkthrough/hello.conf +16 -0
- data/docs/tutorials/10-minute-walkthrough/index.md +124 -0
- data/docs/tutorials/10-minute-walkthrough/step-5-output.txt +17 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.png +0 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.xml +1 -0
- data/docs/tutorials/getting-started-centralized.md +217 -0
- data/docs/tutorials/getting-started-simple.md +200 -0
- data/docs/tutorials/just-enough-rabbitmq-for-logstash.md +201 -0
- data/docs/tutorials/media/frontend-response-codes.png +0 -0
- data/docs/tutorials/metrics-from-logs.md +84 -0
- data/docs/tutorials/zeromq.md +118 -0
- data/extract_services.rb +29 -0
- data/gembag.rb +64 -0
- data/lib/logstash-event.rb +2 -0
- data/lib/logstash.rb +4 -0
- data/lib/logstash/JRUBY-6970-openssl.rb +22 -0
- data/lib/logstash/JRUBY-6970.rb +102 -0
- data/lib/logstash/agent.rb +305 -0
- data/lib/logstash/certs/cacert.pem +3895 -0
- data/lib/logstash/codecs/base.rb +49 -0
- data/lib/logstash/codecs/compress_spooler.rb +50 -0
- data/lib/logstash/codecs/dots.rb +18 -0
- data/lib/logstash/codecs/edn.rb +28 -0
- data/lib/logstash/codecs/edn_lines.rb +36 -0
- data/lib/logstash/codecs/fluent.rb +55 -0
- data/lib/logstash/codecs/graphite.rb +114 -0
- data/lib/logstash/codecs/json.rb +41 -0
- data/lib/logstash/codecs/json_lines.rb +52 -0
- data/lib/logstash/codecs/json_spooler.rb +22 -0
- data/lib/logstash/codecs/line.rb +58 -0
- data/lib/logstash/codecs/msgpack.rb +43 -0
- data/lib/logstash/codecs/multiline.rb +189 -0
- data/lib/logstash/codecs/netflow.rb +342 -0
- data/lib/logstash/codecs/netflow/util.rb +212 -0
- data/lib/logstash/codecs/noop.rb +19 -0
- data/lib/logstash/codecs/oldlogstashjson.rb +56 -0
- data/lib/logstash/codecs/plain.rb +48 -0
- data/lib/logstash/codecs/rubydebug.rb +22 -0
- data/lib/logstash/codecs/spool.rb +38 -0
- data/lib/logstash/config/Makefile +4 -0
- data/lib/logstash/config/config_ast.rb +380 -0
- data/lib/logstash/config/file.rb +39 -0
- data/lib/logstash/config/grammar.rb +3504 -0
- data/lib/logstash/config/grammar.treetop +241 -0
- data/lib/logstash/config/mixin.rb +464 -0
- data/lib/logstash/config/registry.rb +13 -0
- data/lib/logstash/config/test.conf +18 -0
- data/lib/logstash/errors.rb +10 -0
- data/lib/logstash/event.rb +262 -0
- data/lib/logstash/filters/advisor.rb +178 -0
- data/lib/logstash/filters/alter.rb +173 -0
- data/lib/logstash/filters/anonymize.rb +93 -0
- data/lib/logstash/filters/base.rb +190 -0
- data/lib/logstash/filters/checksum.rb +50 -0
- data/lib/logstash/filters/cidr.rb +76 -0
- data/lib/logstash/filters/cipher.rb +145 -0
- data/lib/logstash/filters/clone.rb +35 -0
- data/lib/logstash/filters/collate.rb +114 -0
- data/lib/logstash/filters/csv.rb +94 -0
- data/lib/logstash/filters/date.rb +244 -0
- data/lib/logstash/filters/dns.rb +201 -0
- data/lib/logstash/filters/drop.rb +32 -0
- data/lib/logstash/filters/elapsed.rb +256 -0
- data/lib/logstash/filters/elasticsearch.rb +73 -0
- data/lib/logstash/filters/environment.rb +27 -0
- data/lib/logstash/filters/extractnumbers.rb +84 -0
- data/lib/logstash/filters/gelfify.rb +52 -0
- data/lib/logstash/filters/geoip.rb +145 -0
- data/lib/logstash/filters/grep.rb +153 -0
- data/lib/logstash/filters/grok.rb +425 -0
- data/lib/logstash/filters/grokdiscovery.rb +75 -0
- data/lib/logstash/filters/i18n.rb +51 -0
- data/lib/logstash/filters/json.rb +90 -0
- data/lib/logstash/filters/json_encode.rb +52 -0
- data/lib/logstash/filters/kv.rb +232 -0
- data/lib/logstash/filters/metaevent.rb +68 -0
- data/lib/logstash/filters/metrics.rb +237 -0
- data/lib/logstash/filters/multiline.rb +241 -0
- data/lib/logstash/filters/mutate.rb +399 -0
- data/lib/logstash/filters/noop.rb +21 -0
- data/lib/logstash/filters/prune.rb +149 -0
- data/lib/logstash/filters/punct.rb +32 -0
- data/lib/logstash/filters/railsparallelrequest.rb +86 -0
- data/lib/logstash/filters/range.rb +142 -0
- data/lib/logstash/filters/ruby.rb +42 -0
- data/lib/logstash/filters/sleep.rb +111 -0
- data/lib/logstash/filters/split.rb +64 -0
- data/lib/logstash/filters/sumnumbers.rb +73 -0
- data/lib/logstash/filters/syslog_pri.rb +107 -0
- data/lib/logstash/filters/translate.rb +121 -0
- data/lib/logstash/filters/unique.rb +29 -0
- data/lib/logstash/filters/urldecode.rb +57 -0
- data/lib/logstash/filters/useragent.rb +112 -0
- data/lib/logstash/filters/uuid.rb +58 -0
- data/lib/logstash/filters/xml.rb +139 -0
- data/lib/logstash/filters/zeromq.rb +123 -0
- data/lib/logstash/filterworker.rb +122 -0
- data/lib/logstash/inputs/base.rb +125 -0
- data/lib/logstash/inputs/collectd.rb +306 -0
- data/lib/logstash/inputs/drupal_dblog.rb +323 -0
- data/lib/logstash/inputs/drupal_dblog/jdbcconnection.rb +66 -0
- data/lib/logstash/inputs/elasticsearch.rb +140 -0
- data/lib/logstash/inputs/eventlog.rb +129 -0
- data/lib/logstash/inputs/eventlog/racob_fix.rb +44 -0
- data/lib/logstash/inputs/exec.rb +69 -0
- data/lib/logstash/inputs/file.rb +146 -0
- data/lib/logstash/inputs/ganglia.rb +127 -0
- data/lib/logstash/inputs/ganglia/gmondpacket.rb +146 -0
- data/lib/logstash/inputs/ganglia/xdr.rb +327 -0
- data/lib/logstash/inputs/gelf.rb +138 -0
- data/lib/logstash/inputs/gemfire.rb +222 -0
- data/lib/logstash/inputs/generator.rb +97 -0
- data/lib/logstash/inputs/graphite.rb +41 -0
- data/lib/logstash/inputs/heroku.rb +51 -0
- data/lib/logstash/inputs/imap.rb +136 -0
- data/lib/logstash/inputs/irc.rb +84 -0
- data/lib/logstash/inputs/log4j.rb +136 -0
- data/lib/logstash/inputs/lumberjack.rb +53 -0
- data/lib/logstash/inputs/pipe.rb +57 -0
- data/lib/logstash/inputs/rabbitmq.rb +126 -0
- data/lib/logstash/inputs/rabbitmq/bunny.rb +118 -0
- data/lib/logstash/inputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/inputs/rabbitmq/march_hare.rb +129 -0
- data/lib/logstash/inputs/redis.rb +263 -0
- data/lib/logstash/inputs/relp.rb +106 -0
- data/lib/logstash/inputs/s3.rb +279 -0
- data/lib/logstash/inputs/snmptrap.rb +87 -0
- data/lib/logstash/inputs/sqlite.rb +185 -0
- data/lib/logstash/inputs/sqs.rb +172 -0
- data/lib/logstash/inputs/stdin.rb +46 -0
- data/lib/logstash/inputs/stomp.rb +84 -0
- data/lib/logstash/inputs/syslog.rb +237 -0
- data/lib/logstash/inputs/tcp.rb +231 -0
- data/lib/logstash/inputs/threadable.rb +18 -0
- data/lib/logstash/inputs/twitter.rb +82 -0
- data/lib/logstash/inputs/udp.rb +81 -0
- data/lib/logstash/inputs/unix.rb +163 -0
- data/lib/logstash/inputs/varnishlog.rb +48 -0
- data/lib/logstash/inputs/websocket.rb +50 -0
- data/lib/logstash/inputs/wmi.rb +72 -0
- data/lib/logstash/inputs/xmpp.rb +81 -0
- data/lib/logstash/inputs/zenoss.rb +143 -0
- data/lib/logstash/inputs/zeromq.rb +165 -0
- data/lib/logstash/kibana.rb +113 -0
- data/lib/logstash/loadlibs.rb +9 -0
- data/lib/logstash/logging.rb +89 -0
- data/lib/logstash/monkeypatches-for-bugs.rb +2 -0
- data/lib/logstash/monkeypatches-for-debugging.rb +47 -0
- data/lib/logstash/monkeypatches-for-performance.rb +66 -0
- data/lib/logstash/multiqueue.rb +53 -0
- data/lib/logstash/namespace.rb +16 -0
- data/lib/logstash/outputs/base.rb +120 -0
- data/lib/logstash/outputs/boundary.rb +116 -0
- data/lib/logstash/outputs/circonus.rb +78 -0
- data/lib/logstash/outputs/cloudwatch.rb +351 -0
- data/lib/logstash/outputs/csv.rb +55 -0
- data/lib/logstash/outputs/datadog.rb +93 -0
- data/lib/logstash/outputs/datadog_metrics.rb +123 -0
- data/lib/logstash/outputs/elasticsearch.rb +332 -0
- data/lib/logstash/outputs/elasticsearch/elasticsearch-template.json +44 -0
- data/lib/logstash/outputs/elasticsearch_http.rb +256 -0
- data/lib/logstash/outputs/elasticsearch_river.rb +214 -0
- data/lib/logstash/outputs/email.rb +299 -0
- data/lib/logstash/outputs/exec.rb +40 -0
- data/lib/logstash/outputs/file.rb +180 -0
- data/lib/logstash/outputs/ganglia.rb +75 -0
- data/lib/logstash/outputs/gelf.rb +208 -0
- data/lib/logstash/outputs/gemfire.rb +103 -0
- data/lib/logstash/outputs/google_bigquery.rb +570 -0
- data/lib/logstash/outputs/google_cloud_storage.rb +431 -0
- data/lib/logstash/outputs/graphite.rb +143 -0
- data/lib/logstash/outputs/graphtastic.rb +185 -0
- data/lib/logstash/outputs/hipchat.rb +80 -0
- data/lib/logstash/outputs/http.rb +142 -0
- data/lib/logstash/outputs/irc.rb +80 -0
- data/lib/logstash/outputs/jira.rb +109 -0
- data/lib/logstash/outputs/juggernaut.rb +105 -0
- data/lib/logstash/outputs/librato.rb +146 -0
- data/lib/logstash/outputs/loggly.rb +93 -0
- data/lib/logstash/outputs/lumberjack.rb +51 -0
- data/lib/logstash/outputs/metriccatcher.rb +103 -0
- data/lib/logstash/outputs/mongodb.rb +81 -0
- data/lib/logstash/outputs/nagios.rb +119 -0
- data/lib/logstash/outputs/nagios_nsca.rb +123 -0
- data/lib/logstash/outputs/null.rb +18 -0
- data/lib/logstash/outputs/opentsdb.rb +101 -0
- data/lib/logstash/outputs/pagerduty.rb +79 -0
- data/lib/logstash/outputs/pipe.rb +132 -0
- data/lib/logstash/outputs/rabbitmq.rb +96 -0
- data/lib/logstash/outputs/rabbitmq/bunny.rb +135 -0
- data/lib/logstash/outputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/outputs/rabbitmq/march_hare.rb +143 -0
- data/lib/logstash/outputs/redis.rb +245 -0
- data/lib/logstash/outputs/riak.rb +152 -0
- data/lib/logstash/outputs/riemann.rb +109 -0
- data/lib/logstash/outputs/s3.rb +356 -0
- data/lib/logstash/outputs/sns.rb +124 -0
- data/lib/logstash/outputs/solr_http.rb +78 -0
- data/lib/logstash/outputs/sqs.rb +141 -0
- data/lib/logstash/outputs/statsd.rb +116 -0
- data/lib/logstash/outputs/stdout.rb +53 -0
- data/lib/logstash/outputs/stomp.rb +67 -0
- data/lib/logstash/outputs/syslog.rb +145 -0
- data/lib/logstash/outputs/tcp.rb +145 -0
- data/lib/logstash/outputs/udp.rb +38 -0
- data/lib/logstash/outputs/websocket.rb +46 -0
- data/lib/logstash/outputs/websocket/app.rb +29 -0
- data/lib/logstash/outputs/websocket/pubsub.rb +45 -0
- data/lib/logstash/outputs/xmpp.rb +78 -0
- data/lib/logstash/outputs/zabbix.rb +108 -0
- data/lib/logstash/outputs/zeromq.rb +125 -0
- data/lib/logstash/pipeline.rb +286 -0
- data/lib/logstash/plugin.rb +150 -0
- data/lib/logstash/plugin_mixins/aws_config.rb +93 -0
- data/lib/logstash/program.rb +15 -0
- data/lib/logstash/runner.rb +238 -0
- data/lib/logstash/sized_queue.rb +8 -0
- data/lib/logstash/test.rb +183 -0
- data/lib/logstash/threadwatchdog.rb +37 -0
- data/lib/logstash/time_addon.rb +33 -0
- data/lib/logstash/util.rb +106 -0
- data/lib/logstash/util/buftok.rb +139 -0
- data/lib/logstash/util/charset.rb +39 -0
- data/lib/logstash/util/fieldreference.rb +50 -0
- data/lib/logstash/util/password.rb +25 -0
- data/lib/logstash/util/prctl.rb +11 -0
- data/lib/logstash/util/relp.rb +326 -0
- data/lib/logstash/util/require-helper.rb +18 -0
- data/lib/logstash/util/socket_peer.rb +7 -0
- data/lib/logstash/util/zenoss.rb +566 -0
- data/lib/logstash/util/zeromq.rb +47 -0
- data/lib/logstash/version.rb +6 -0
- data/locales/en.yml +170 -0
- data/logstash-event.gemspec +29 -0
- data/logstash.gemspec +128 -0
- data/patterns/firewalls +60 -0
- data/patterns/grok-patterns +91 -0
- data/patterns/haproxy +37 -0
- data/patterns/java +3 -0
- data/patterns/linux-syslog +14 -0
- data/patterns/mcollective +1 -0
- data/patterns/mcollective-patterns +4 -0
- data/patterns/nagios +108 -0
- data/patterns/postgresql +3 -0
- data/patterns/redis +3 -0
- data/patterns/ruby +2 -0
- data/pkg/build.sh +135 -0
- data/pkg/centos/after-install.sh +1 -0
- data/pkg/centos/before-install.sh +10 -0
- data/pkg/centos/before-remove.sh +11 -0
- data/pkg/centos/sysconfig +15 -0
- data/pkg/debian/after-install.sh +5 -0
- data/pkg/debian/before-install.sh +13 -0
- data/pkg/debian/before-remove.sh +13 -0
- data/pkg/debian/build.sh +34 -0
- data/pkg/debian/debian/README +6 -0
- data/pkg/debian/debian/changelog +17 -0
- data/pkg/debian/debian/compat +1 -0
- data/pkg/debian/debian/control +16 -0
- data/pkg/debian/debian/copyright +27 -0
- data/pkg/debian/debian/dirs +19 -0
- data/pkg/debian/debian/docs +0 -0
- data/pkg/debian/debian/logstash.default +39 -0
- data/pkg/debian/debian/logstash.init +201 -0
- data/pkg/debian/debian/logstash.install +1 -0
- data/pkg/debian/debian/logstash.logrotate +9 -0
- data/pkg/debian/debian/logstash.postinst +68 -0
- data/pkg/debian/debian/logstash.postrm +23 -0
- data/pkg/debian/debian/manpage.1.ex +59 -0
- data/pkg/debian/debian/preinst.ex +37 -0
- data/pkg/debian/debian/prerm.ex +40 -0
- data/pkg/debian/debian/release.conf +5 -0
- data/pkg/debian/debian/rules +80 -0
- data/pkg/debian/debian/watch.ex +22 -0
- data/pkg/logrotate.conf +8 -0
- data/pkg/logstash-web.default +41 -0
- data/pkg/logstash-web.sysv.debian +201 -0
- data/pkg/logstash-web.upstart.ubuntu +18 -0
- data/pkg/logstash.default +45 -0
- data/pkg/logstash.sysv.debian +202 -0
- data/pkg/logstash.sysv.redhat +158 -0
- data/pkg/logstash.upstart.ubuntu +20 -0
- data/pkg/rpm/SOURCES/logstash.conf +26 -0
- data/pkg/rpm/SOURCES/logstash.init +80 -0
- data/pkg/rpm/SOURCES/logstash.logrotate +8 -0
- data/pkg/rpm/SOURCES/logstash.sysconfig +3 -0
- data/pkg/rpm/SOURCES/logstash.wrapper +105 -0
- data/pkg/rpm/SPECS/logstash.spec +180 -0
- data/pkg/rpm/readme.md +4 -0
- data/pkg/ubuntu/after-install.sh +7 -0
- data/pkg/ubuntu/before-install.sh +12 -0
- data/pkg/ubuntu/before-remove.sh +13 -0
- data/pull_release_note.rb +25 -0
- data/require-analyze.rb +22 -0
- data/spec/README.md +14 -0
- data/spec/codecs/edn.rb +40 -0
- data/spec/codecs/edn_lines.rb +53 -0
- data/spec/codecs/graphite.rb +96 -0
- data/spec/codecs/json.rb +57 -0
- data/spec/codecs/json_lines.rb +51 -0
- data/spec/codecs/json_spooler.rb +43 -0
- data/spec/codecs/msgpack.rb +39 -0
- data/spec/codecs/multiline.rb +60 -0
- data/spec/codecs/oldlogstashjson.rb +55 -0
- data/spec/codecs/plain.rb +35 -0
- data/spec/codecs/spool.rb +35 -0
- data/spec/conditionals/test.rb +323 -0
- data/spec/config.rb +31 -0
- data/spec/event.rb +165 -0
- data/spec/examples/fail2ban.rb +28 -0
- data/spec/examples/graphite-input.rb +41 -0
- data/spec/examples/mysql-slow-query.rb +70 -0
- data/spec/examples/parse-apache-logs.rb +66 -0
- data/spec/examples/parse-haproxy-logs.rb +115 -0
- data/spec/examples/syslog.rb +48 -0
- data/spec/filters/alter.rb +96 -0
- data/spec/filters/anonymize.rb +189 -0
- data/spec/filters/checksum.rb +41 -0
- data/spec/filters/clone.rb +67 -0
- data/spec/filters/collate.rb +122 -0
- data/spec/filters/csv.rb +174 -0
- data/spec/filters/date.rb +285 -0
- data/spec/filters/date_performance.rb +31 -0
- data/spec/filters/dns.rb +159 -0
- data/spec/filters/drop.rb +19 -0
- data/spec/filters/elapsed.rb +294 -0
- data/spec/filters/environment.rb +43 -0
- data/spec/filters/geoip.rb +62 -0
- data/spec/filters/grep.rb +342 -0
- data/spec/filters/grok.rb +473 -0
- data/spec/filters/grok/timeout2.rb +56 -0
- data/spec/filters/grok/timeouts.rb +39 -0
- data/spec/filters/i18n.rb +25 -0
- data/spec/filters/json.rb +72 -0
- data/spec/filters/json_encode.rb +37 -0
- data/spec/filters/kv.rb +403 -0
- data/spec/filters/metrics.rb +212 -0
- data/spec/filters/multiline.rb +119 -0
- data/spec/filters/mutate.rb +180 -0
- data/spec/filters/noop.rb +221 -0
- data/spec/filters/prune.rb +441 -0
- data/spec/filters/punct.rb +18 -0
- data/spec/filters/railsparallelrequest.rb +112 -0
- data/spec/filters/range.rb +169 -0
- data/spec/filters/split.rb +58 -0
- data/spec/filters/translate.rb +70 -0
- data/spec/filters/unique.rb +25 -0
- data/spec/filters/useragent.rb +42 -0
- data/spec/filters/xml.rb +157 -0
- data/spec/inputs/file.rb +107 -0
- data/spec/inputs/gelf.rb +52 -0
- data/spec/inputs/generator.rb +30 -0
- data/spec/inputs/imap.rb +60 -0
- data/spec/inputs/redis.rb +63 -0
- data/spec/inputs/relp.rb +70 -0
- data/spec/inputs/tcp.rb +101 -0
- data/spec/jar.rb +21 -0
- data/spec/outputs/csv.rb +266 -0
- data/spec/outputs/elasticsearch.rb +161 -0
- data/spec/outputs/elasticsearch_http.rb +240 -0
- data/spec/outputs/email.rb +173 -0
- data/spec/outputs/file.rb +82 -0
- data/spec/outputs/graphite.rb +236 -0
- data/spec/outputs/redis.rb +127 -0
- data/spec/speed.rb +20 -0
- data/spec/sqlite-test.rb +81 -0
- data/spec/support/LOGSTASH-733.rb +21 -0
- data/spec/support/LOGSTASH-820.rb +25 -0
- data/spec/support/akamai-grok.rb +26 -0
- data/spec/support/date-http.rb +17 -0
- data/spec/support/postwait1.rb +26 -0
- data/spec/support/pull375.rb +21 -0
- data/spec/test_utils.rb +125 -0
- data/spec/util/fieldeval_spec.rb +44 -0
- data/test/jenkins/config.xml.erb +74 -0
- data/test/jenkins/create-jobs.rb +23 -0
- data/test/jenkins/generatorjob.config.xml +66 -0
- data/tools/Gemfile +14 -0
- data/tools/Gemfile.jruby-1.9.lock +322 -0
- data/tools/Gemfile.rbx-2.1.lock +516 -0
- data/tools/Gemfile.ruby-1.9.1.lock +310 -0
- data/tools/Gemfile.ruby-2.0.0.lock +310 -0
- 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,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
|