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,84 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/inputs/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
require 'pp'
|
|
5
|
+
|
|
6
|
+
class LogStash::Inputs::Stomp < LogStash::Inputs::Base
|
|
7
|
+
config_name "stomp"
|
|
8
|
+
milestone 2
|
|
9
|
+
|
|
10
|
+
default :codec, "plain"
|
|
11
|
+
|
|
12
|
+
# The address of the STOMP server.
|
|
13
|
+
config :host, :validate => :string, :default => "localhost", :required => true
|
|
14
|
+
|
|
15
|
+
# The port to connet to on your STOMP server.
|
|
16
|
+
config :port, :validate => :number, :default => 61613
|
|
17
|
+
|
|
18
|
+
# The username to authenticate with.
|
|
19
|
+
config :user, :validate => :string, :default => ""
|
|
20
|
+
|
|
21
|
+
# The password to authenticate with.
|
|
22
|
+
config :password, :validate => :password, :default => ""
|
|
23
|
+
|
|
24
|
+
# The destination to read events from.
|
|
25
|
+
#
|
|
26
|
+
# Example: "/topic/logstash"
|
|
27
|
+
config :destination, :validate => :string, :required => true
|
|
28
|
+
|
|
29
|
+
# The vhost to use
|
|
30
|
+
config :vhost, :validate => :string, :default => nil
|
|
31
|
+
|
|
32
|
+
# Enable debugging output?
|
|
33
|
+
config :debug, :validate => :boolean, :default => false
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
def connect
|
|
37
|
+
begin
|
|
38
|
+
@client.connect
|
|
39
|
+
@logger.debug("Connected to stomp server") if @client.connected?
|
|
40
|
+
rescue => e
|
|
41
|
+
@logger.debug("Failed to connect to stomp server, will retry", :exception => e, :backtrace => e.backtrace)
|
|
42
|
+
sleep 2
|
|
43
|
+
retry
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
public
|
|
48
|
+
def register
|
|
49
|
+
require "onstomp"
|
|
50
|
+
@client = OnStomp::Client.new("stomp://#{@host}:#{@port}", :login => @user, :passcode => @password.value)
|
|
51
|
+
@client.host = @vhost if @vhost
|
|
52
|
+
@stomp_url = "stomp://#{@user}:#{@password}@#{@host}:#{@port}/#{@destination}"
|
|
53
|
+
|
|
54
|
+
# Handle disconnects
|
|
55
|
+
@client.on_connection_closed {
|
|
56
|
+
connect
|
|
57
|
+
subscription_handler # is required for re-subscribing to the destination
|
|
58
|
+
}
|
|
59
|
+
connect
|
|
60
|
+
end # def register
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
def subscription_handler
|
|
64
|
+
@client.subscribe(@destination) do |msg|
|
|
65
|
+
@codec.decode(msg.body) do |event|
|
|
66
|
+
decorate(event)
|
|
67
|
+
@output_queue << event
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
#In the event that there is only Stomp input plugin instances
|
|
71
|
+
#the process ends prematurely. The above code runs, and return
|
|
72
|
+
#the flow control to the 'run' method below. After that, the
|
|
73
|
+
#method "run_input" from agent.rb marks 'done' as 'true' and calls
|
|
74
|
+
#'finish' over the Stomp plugin instance.
|
|
75
|
+
#'Sleeping' the plugin leves the instance alive.
|
|
76
|
+
sleep
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
public
|
|
80
|
+
def run(output_queue)
|
|
81
|
+
@output_queue = output_queue
|
|
82
|
+
subscription_handler
|
|
83
|
+
end # def run
|
|
84
|
+
end # class LogStash::Inputs::Stomp
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "date"
|
|
3
|
+
require "logstash/filters/grok"
|
|
4
|
+
require "logstash/filters/date"
|
|
5
|
+
require "logstash/inputs/base"
|
|
6
|
+
require "logstash/namespace"
|
|
7
|
+
require "socket"
|
|
8
|
+
require "thread_safe"
|
|
9
|
+
|
|
10
|
+
# Read syslog messages as events over the network.
|
|
11
|
+
#
|
|
12
|
+
# This input is a good choice if you already use syslog today.
|
|
13
|
+
# It is also a good choice if you want to receive logs from
|
|
14
|
+
# appliances and network devices where you cannot run your own
|
|
15
|
+
# log collector.
|
|
16
|
+
#
|
|
17
|
+
# Of course, 'syslog' is a very muddy term. This input only supports RFC3164
|
|
18
|
+
# syslog with some small modifications. The date format is allowed to be
|
|
19
|
+
# RFC3164 style or ISO8601. Otherwise the rest of the RFC3164 must be obeyed.
|
|
20
|
+
# If you do not use RFC3164, do not use this input.
|
|
21
|
+
#
|
|
22
|
+
# Note: this input will start listeners on both TCP and UDP
|
|
23
|
+
class LogStash::Inputs::Syslog < LogStash::Inputs::Base
|
|
24
|
+
config_name "syslog"
|
|
25
|
+
milestone 1
|
|
26
|
+
|
|
27
|
+
default :codec, "plain"
|
|
28
|
+
|
|
29
|
+
# The address to listen on
|
|
30
|
+
config :host, :validate => :string, :default => "0.0.0.0"
|
|
31
|
+
|
|
32
|
+
# The port to listen on. Remember that ports less than 1024 (privileged
|
|
33
|
+
# ports) may require root to use.
|
|
34
|
+
config :port, :validate => :number, :default => 514
|
|
35
|
+
|
|
36
|
+
# Use label parsing for severity and facility levels
|
|
37
|
+
config :use_labels, :validate => :boolean, :default => true
|
|
38
|
+
|
|
39
|
+
# Labels for facility levels
|
|
40
|
+
# This comes from RFC3164.
|
|
41
|
+
config :facility_labels, :validate => :array, :default => [ "kernel", "user-level", "mail", "system", "security/authorization", "syslogd", "line printer", "network news", "UUCP", "clock", "security/authorization", "FTP", "NTP", "log audit", "log alert", "clock", "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7" ]
|
|
42
|
+
|
|
43
|
+
# Labels for severity levels
|
|
44
|
+
# This comes from RFC3164.
|
|
45
|
+
config :severity_labels, :validate => :array, :default => [ "Emergency" , "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debug" ]
|
|
46
|
+
|
|
47
|
+
public
|
|
48
|
+
def initialize(params)
|
|
49
|
+
super
|
|
50
|
+
@shutdown_requested = false
|
|
51
|
+
BasicSocket.do_not_reverse_lookup = true
|
|
52
|
+
end # def initialize
|
|
53
|
+
|
|
54
|
+
public
|
|
55
|
+
def register
|
|
56
|
+
@grok_filter = LogStash::Filters::Grok.new(
|
|
57
|
+
"overwrite" => "message",
|
|
58
|
+
"match" => { "message" => "<%{POSINT:priority}>%{SYSLOGLINE}" },
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
@date_filter = LogStash::Filters::Date.new(
|
|
62
|
+
"match" => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
@grok_filter.register
|
|
66
|
+
@date_filter.register
|
|
67
|
+
|
|
68
|
+
@tcp_clients = ThreadSafe::Array.new
|
|
69
|
+
end # def register
|
|
70
|
+
|
|
71
|
+
public
|
|
72
|
+
def run(output_queue)
|
|
73
|
+
# udp server
|
|
74
|
+
udp_thr = Thread.new do
|
|
75
|
+
begin
|
|
76
|
+
udp_listener(output_queue)
|
|
77
|
+
rescue => e
|
|
78
|
+
break if @shutdown_requested
|
|
79
|
+
@logger.warn("syslog udp listener died",
|
|
80
|
+
:address => "#{@host}:#{@port}", :exception => e,
|
|
81
|
+
:backtrace => e.backtrace)
|
|
82
|
+
sleep(5)
|
|
83
|
+
retry
|
|
84
|
+
end # begin
|
|
85
|
+
end # Thread.new
|
|
86
|
+
|
|
87
|
+
# tcp server
|
|
88
|
+
tcp_thr = Thread.new do
|
|
89
|
+
begin
|
|
90
|
+
tcp_listener(output_queue)
|
|
91
|
+
rescue => e
|
|
92
|
+
break if @shutdown_requested
|
|
93
|
+
@logger.warn("syslog tcp listener died",
|
|
94
|
+
:address => "#{@host}:#{@port}", :exception => e,
|
|
95
|
+
:backtrace => e.backtrace)
|
|
96
|
+
sleep(5)
|
|
97
|
+
retry
|
|
98
|
+
end # begin
|
|
99
|
+
end # Thread.new
|
|
100
|
+
|
|
101
|
+
# If we exit and we're the only input, the agent will think no inputs
|
|
102
|
+
# are running and initiate a shutdown.
|
|
103
|
+
udp_thr.join
|
|
104
|
+
tcp_thr.join
|
|
105
|
+
end # def run
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
def udp_listener(output_queue)
|
|
109
|
+
@logger.info("Starting syslog udp listener", :address => "#{@host}:#{@port}")
|
|
110
|
+
|
|
111
|
+
if @udp
|
|
112
|
+
@udp.close
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
@udp = UDPSocket.new(Socket::AF_INET)
|
|
116
|
+
@udp.bind(@host, @port)
|
|
117
|
+
|
|
118
|
+
loop do
|
|
119
|
+
payload, client = @udp.recvfrom(9000)
|
|
120
|
+
# Ruby uri sucks, so don't use it.
|
|
121
|
+
@codec.decode(payload) do |event|
|
|
122
|
+
decorate(event)
|
|
123
|
+
event["host"] = client[3]
|
|
124
|
+
syslog_relay(event)
|
|
125
|
+
output_queue << event
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
ensure
|
|
129
|
+
close_udp
|
|
130
|
+
end # def udp_listener
|
|
131
|
+
|
|
132
|
+
private
|
|
133
|
+
def tcp_listener(output_queue)
|
|
134
|
+
@logger.info("Starting syslog tcp listener", :address => "#{@host}:#{@port}")
|
|
135
|
+
@tcp = TCPServer.new(@host, @port)
|
|
136
|
+
@tcp_clients = []
|
|
137
|
+
|
|
138
|
+
loop do
|
|
139
|
+
client = @tcp.accept
|
|
140
|
+
@tcp_clients << client
|
|
141
|
+
Thread.new(client) do |client|
|
|
142
|
+
ip, port = client.peeraddr[3], client.peeraddr[1]
|
|
143
|
+
@logger.info("new connection", :client => "#{ip}:#{port}")
|
|
144
|
+
LogStash::Util::set_thread_name("input|syslog|tcp|#{ip}:#{port}}")
|
|
145
|
+
begin
|
|
146
|
+
client.each do |line|
|
|
147
|
+
@codec.decode(line) do |event|
|
|
148
|
+
decorate(event)
|
|
149
|
+
event["host"] = ip
|
|
150
|
+
syslog_relay(event)
|
|
151
|
+
output_queue << event
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
rescue Errno::ECONNRESET
|
|
155
|
+
ensure
|
|
156
|
+
@tcp_clients.delete(client)
|
|
157
|
+
end
|
|
158
|
+
end # Thread.new
|
|
159
|
+
end # loop do
|
|
160
|
+
ensure
|
|
161
|
+
close_tcp
|
|
162
|
+
end # def tcp_listener
|
|
163
|
+
|
|
164
|
+
public
|
|
165
|
+
def teardown
|
|
166
|
+
@shutdown_requested = true
|
|
167
|
+
close_udp
|
|
168
|
+
close_tcp
|
|
169
|
+
finished
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
private
|
|
173
|
+
def close_udp
|
|
174
|
+
if @udp
|
|
175
|
+
@udp.close_read rescue nil
|
|
176
|
+
@udp.close_write rescue nil
|
|
177
|
+
end
|
|
178
|
+
@udp = nil
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
private
|
|
182
|
+
def close_tcp
|
|
183
|
+
# If we somehow have this left open, close it.
|
|
184
|
+
@tcp_clients.each do |client|
|
|
185
|
+
client.close rescue nil
|
|
186
|
+
end
|
|
187
|
+
@tcp.close if @tcp rescue nil
|
|
188
|
+
@tcp = nil
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Following RFC3164 where sane, we'll try to parse a received message
|
|
192
|
+
# as if you were relaying a syslog message to it.
|
|
193
|
+
# If the message cannot be recognized (see @grok_filter), we'll
|
|
194
|
+
# treat it like the whole event["message"] is correct and try to fill
|
|
195
|
+
# the missing pieces (host, priority, etc)
|
|
196
|
+
public
|
|
197
|
+
def syslog_relay(event)
|
|
198
|
+
@grok_filter.filter(event)
|
|
199
|
+
|
|
200
|
+
if event["tags"].nil? || !event["tags"].include?("_grokparsefailure")
|
|
201
|
+
# Per RFC3164, priority = (facility * 8) + severity
|
|
202
|
+
# = (facility << 3) & (severity)
|
|
203
|
+
priority = event["priority"].first.to_i rescue 13
|
|
204
|
+
severity = priority & 7 # 7 is 111 (3 bits)
|
|
205
|
+
facility = priority >> 3
|
|
206
|
+
event["priority"] = priority
|
|
207
|
+
event["severity"] = severity
|
|
208
|
+
event["facility"] = facility
|
|
209
|
+
|
|
210
|
+
event["timestamp"] = event["timestamp8601"] if event.include?("timestamp8601")
|
|
211
|
+
@date_filter.filter(event)
|
|
212
|
+
else
|
|
213
|
+
@logger.info? && @logger.info("NOT SYSLOG", :message => event["message"])
|
|
214
|
+
|
|
215
|
+
# RFC3164 says unknown messages get pri=13
|
|
216
|
+
priority = 13
|
|
217
|
+
event["priority"] = 13
|
|
218
|
+
event["severity"] = 5 # 13 & 7 == 5
|
|
219
|
+
event["facility"] = 1 # 13 >> 3 == 1
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Apply severity and facility metadata if
|
|
223
|
+
# use_labels => true
|
|
224
|
+
if @use_labels
|
|
225
|
+
facility_number = event["facility"]
|
|
226
|
+
severity_number = event["severity"]
|
|
227
|
+
|
|
228
|
+
if @facility_labels[facility_number]
|
|
229
|
+
event["facility_label"] = @facility_labels[facility_number]
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
if @severity_labels[severity_number]
|
|
233
|
+
event["severity_label"] = @severity_labels[severity_number]
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end # def syslog_relay
|
|
237
|
+
end # class LogStash::Inputs::Syslog
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/inputs/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
require "logstash/util/socket_peer"
|
|
5
|
+
|
|
6
|
+
# Read events over a TCP socket.
|
|
7
|
+
#
|
|
8
|
+
# Like stdin and file inputs, each event is assumed to be one line of text.
|
|
9
|
+
#
|
|
10
|
+
# Can either accept connections from clients or connect to a server,
|
|
11
|
+
# depending on `mode`.
|
|
12
|
+
class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
13
|
+
class Interrupted < StandardError; end
|
|
14
|
+
config_name "tcp"
|
|
15
|
+
milestone 2
|
|
16
|
+
|
|
17
|
+
default :codec, "line"
|
|
18
|
+
|
|
19
|
+
# When mode is `server`, the address to listen on.
|
|
20
|
+
# When mode is `client`, the address to connect to.
|
|
21
|
+
config :host, :validate => :string, :default => "0.0.0.0"
|
|
22
|
+
|
|
23
|
+
# When mode is `server`, the port to listen on.
|
|
24
|
+
# When mode is `client`, the port to connect to.
|
|
25
|
+
config :port, :validate => :number, :required => true
|
|
26
|
+
|
|
27
|
+
# The 'read' timeout in seconds. If a particular tcp connection is idle for
|
|
28
|
+
# more than this timeout period, we will assume it is dead and close it.
|
|
29
|
+
#
|
|
30
|
+
# If you never want to timeout, use -1.
|
|
31
|
+
config :data_timeout, :validate => :number, :default => -1
|
|
32
|
+
|
|
33
|
+
# Mode to operate in. `server` listens for client connections,
|
|
34
|
+
# `client` connects to a server.
|
|
35
|
+
config :mode, :validate => ["server", "client"], :default => "server"
|
|
36
|
+
|
|
37
|
+
# Enable ssl (must be set for other `ssl_` options to take effect)
|
|
38
|
+
config :ssl_enable, :validate => :boolean, :default => false
|
|
39
|
+
|
|
40
|
+
# Verify the identity of the other end of the ssl connection against the CA
|
|
41
|
+
# For input, sets the `@field.sslsubject` to that of the client certificate
|
|
42
|
+
config :ssl_verify, :validate => :boolean, :default => false
|
|
43
|
+
|
|
44
|
+
# ssl CA certificate, chainfile or CA path
|
|
45
|
+
# The system CA path is automatically included
|
|
46
|
+
config :ssl_cacert, :validate => :path
|
|
47
|
+
|
|
48
|
+
# ssl certificate
|
|
49
|
+
config :ssl_cert, :validate => :path
|
|
50
|
+
|
|
51
|
+
# ssl key
|
|
52
|
+
config :ssl_key, :validate => :path
|
|
53
|
+
|
|
54
|
+
# ssl key passphrase
|
|
55
|
+
config :ssl_key_passphrase, :validate => :password, :default => nil
|
|
56
|
+
|
|
57
|
+
def initialize(*args)
|
|
58
|
+
super(*args)
|
|
59
|
+
end # def initialize
|
|
60
|
+
|
|
61
|
+
public
|
|
62
|
+
def register
|
|
63
|
+
require "socket"
|
|
64
|
+
require "timeout"
|
|
65
|
+
require "openssl"
|
|
66
|
+
if @ssl_enable
|
|
67
|
+
@ssl_context = OpenSSL::SSL::SSLContext.new
|
|
68
|
+
@ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(@ssl_cert))
|
|
69
|
+
@ssl_context.key = OpenSSL::PKey::RSA.new(File.read(@ssl_key),@ssl_key_passphrase)
|
|
70
|
+
if @ssl_verify
|
|
71
|
+
@cert_store = OpenSSL::X509::Store.new
|
|
72
|
+
# Load the system default certificate path to the store
|
|
73
|
+
@cert_store.set_default_paths
|
|
74
|
+
if File.directory?(@ssl_cacert)
|
|
75
|
+
@cert_store.add_path(@ssl_cacert)
|
|
76
|
+
else
|
|
77
|
+
@cert_store.add_file(@ssl_cacert)
|
|
78
|
+
end
|
|
79
|
+
@ssl_context.cert_store = @cert_store
|
|
80
|
+
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
|
|
81
|
+
end
|
|
82
|
+
end # @ssl_enable
|
|
83
|
+
|
|
84
|
+
if server?
|
|
85
|
+
@logger.info("Starting tcp input listener", :address => "#{@host}:#{@port}")
|
|
86
|
+
begin
|
|
87
|
+
@server_socket = TCPServer.new(@host, @port)
|
|
88
|
+
rescue Errno::EADDRINUSE
|
|
89
|
+
@logger.error("Could not start TCP server: Address in use",
|
|
90
|
+
:host => @host, :port => @port)
|
|
91
|
+
raise
|
|
92
|
+
end
|
|
93
|
+
if @ssl_enable
|
|
94
|
+
@server_socket = OpenSSL::SSL::SSLServer.new(@server_socket, @ssl_context)
|
|
95
|
+
end # @ssl_enable
|
|
96
|
+
end
|
|
97
|
+
end # def register
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
def handle_socket(socket, client_address, output_queue, codec)
|
|
101
|
+
while true
|
|
102
|
+
buf = nil
|
|
103
|
+
# NOTE(petef): the timeout only hits after the line is read
|
|
104
|
+
# or socket dies
|
|
105
|
+
# TODO(sissel): Why do we have a timeout here? What's the point?
|
|
106
|
+
if @data_timeout == -1
|
|
107
|
+
buf = read(socket)
|
|
108
|
+
else
|
|
109
|
+
Timeout::timeout(@data_timeout) do
|
|
110
|
+
buf = read(socket)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
codec.decode(buf) do |event|
|
|
114
|
+
decorate(event)
|
|
115
|
+
event["host"] = client_address
|
|
116
|
+
event["sslsubject"] = socket.peer_cert.subject if @ssl_enable && @ssl_verify
|
|
117
|
+
output_queue << event
|
|
118
|
+
end
|
|
119
|
+
end # loop do
|
|
120
|
+
rescue => e
|
|
121
|
+
codec.respond_to?(:flush) && codec.flush do |event|
|
|
122
|
+
decorate(event)
|
|
123
|
+
event["host"] = client_address
|
|
124
|
+
event["sslsubject"] = socket.peer_cert.subject if @ssl_enable && @ssl_verify
|
|
125
|
+
output_queue << event
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
@logger.debug("An error occurred. Closing connection",
|
|
129
|
+
:client => socket.peer, :exception => e)
|
|
130
|
+
ensure
|
|
131
|
+
begin
|
|
132
|
+
socket.close
|
|
133
|
+
rescue IOError
|
|
134
|
+
#pass
|
|
135
|
+
end # begin
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
private
|
|
139
|
+
def server?
|
|
140
|
+
@mode == "server"
|
|
141
|
+
end # def server?
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
def read(socket)
|
|
145
|
+
return socket.sysread(16384)
|
|
146
|
+
end # def readline
|
|
147
|
+
|
|
148
|
+
public
|
|
149
|
+
def run(output_queue)
|
|
150
|
+
if server?
|
|
151
|
+
run_server(output_queue)
|
|
152
|
+
else
|
|
153
|
+
run_client(output_queue)
|
|
154
|
+
end
|
|
155
|
+
end # def run
|
|
156
|
+
|
|
157
|
+
def run_server(output_queue)
|
|
158
|
+
@thread = Thread.current
|
|
159
|
+
@client_threads = []
|
|
160
|
+
loop do
|
|
161
|
+
# Start a new thread for each connection.
|
|
162
|
+
begin
|
|
163
|
+
@client_threads << Thread.start(@server_socket.accept) do |s|
|
|
164
|
+
# TODO(sissel): put this block in its own method.
|
|
165
|
+
|
|
166
|
+
# monkeypatch a 'peer' method onto the socket.
|
|
167
|
+
s.instance_eval { class << self; include ::LogStash::Util::SocketPeer end }
|
|
168
|
+
@logger.debug("Accepted connection", :client => s.peer,
|
|
169
|
+
:server => "#{@host}:#{@port}")
|
|
170
|
+
begin
|
|
171
|
+
handle_socket(s, s.peer, output_queue, @codec.clone)
|
|
172
|
+
rescue Interrupted
|
|
173
|
+
s.close rescue nil
|
|
174
|
+
end
|
|
175
|
+
end # Thread.start
|
|
176
|
+
rescue OpenSSL::SSL::SSLError => ssle
|
|
177
|
+
# NOTE(mrichar1): This doesn't return a useful error message for some reason
|
|
178
|
+
@logger.error("SSL Error", :exception => ssle,
|
|
179
|
+
:backtrace => ssle.backtrace)
|
|
180
|
+
rescue IOError, LogStash::ShutdownSignal
|
|
181
|
+
if @interrupted
|
|
182
|
+
# Intended shutdown, get out of the loop
|
|
183
|
+
@server_socket.close
|
|
184
|
+
@client_threads.each do |thread|
|
|
185
|
+
thread.raise(LogStash::ShutdownSignal)
|
|
186
|
+
end
|
|
187
|
+
break
|
|
188
|
+
else
|
|
189
|
+
# Else it was a genuine IOError caused by something else, so propagate it up..
|
|
190
|
+
raise
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end # loop
|
|
194
|
+
rescue LogStash::ShutdownSignal
|
|
195
|
+
# nothing to do
|
|
196
|
+
ensure
|
|
197
|
+
@server_socket.close
|
|
198
|
+
end # def run_server
|
|
199
|
+
|
|
200
|
+
def run_client(output_queue)
|
|
201
|
+
@thread = Thread.current
|
|
202
|
+
while true
|
|
203
|
+
client_socket = TCPSocket.new(@host, @port)
|
|
204
|
+
if @ssl_enable
|
|
205
|
+
client_socket = OpenSSL::SSL::SSLSocket.new(client_socket, @ssl_context)
|
|
206
|
+
begin
|
|
207
|
+
client_socket.connect
|
|
208
|
+
rescue OpenSSL::SSL::SSLError => ssle
|
|
209
|
+
@logger.error("SSL Error", :exception => ssle,
|
|
210
|
+
:backtrace => ssle.backtrace)
|
|
211
|
+
# NOTE(mrichar1): Hack to prevent hammering peer
|
|
212
|
+
sleep(5)
|
|
213
|
+
next
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
client_socket.instance_eval { class << self; include ::LogStash::Util::SocketPeer end }
|
|
217
|
+
@logger.debug("Opened connection", :client => "#{client_socket.peer}")
|
|
218
|
+
handle_socket(client_socket, client_socket.peer, output_queue, @codec.clone)
|
|
219
|
+
end # loop
|
|
220
|
+
ensure
|
|
221
|
+
client_socket.close
|
|
222
|
+
end # def run
|
|
223
|
+
|
|
224
|
+
public
|
|
225
|
+
def teardown
|
|
226
|
+
if server?
|
|
227
|
+
@interrupted = true
|
|
228
|
+
@thread.raise(LogStash::ShutdownSignal)
|
|
229
|
+
end
|
|
230
|
+
end # def teardown
|
|
231
|
+
end # class LogStash::Inputs::Tcp
|