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,183 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "rubygems"
|
|
3
|
+
require "optparse"
|
|
4
|
+
|
|
5
|
+
# TODO(sissel): Are these necessary anymore?
|
|
6
|
+
#$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
7
|
+
#$:.unshift "#{File.dirname(__FILE__)}/../test"
|
|
8
|
+
|
|
9
|
+
require "logstash/namespace"
|
|
10
|
+
require "logstash/loadlibs"
|
|
11
|
+
require "logstash/logging"
|
|
12
|
+
|
|
13
|
+
class LogStash::Test
|
|
14
|
+
public
|
|
15
|
+
def initialize
|
|
16
|
+
log_to(STDERR)
|
|
17
|
+
|
|
18
|
+
# This is lib/logstash/test.rb, so go up 2 directories for the plugin path
|
|
19
|
+
if jarred?(__FILE__)
|
|
20
|
+
@plugin_paths = [ File.dirname(File.dirname(__FILE__)) ]
|
|
21
|
+
else
|
|
22
|
+
@plugin_paths = [ File.dirname(File.dirname(File.dirname(__FILE__))) ]
|
|
23
|
+
end
|
|
24
|
+
@verbose = 0
|
|
25
|
+
end # def initialize
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
def jarred?(path)
|
|
29
|
+
return path =~ /^file:/
|
|
30
|
+
end # def jarred?
|
|
31
|
+
|
|
32
|
+
public
|
|
33
|
+
def log_to(target)
|
|
34
|
+
@logger = LogStash::Logger.new(target)
|
|
35
|
+
end # def log_to
|
|
36
|
+
|
|
37
|
+
def check_lib(lib, provider, is=:optional, message=nil)
|
|
38
|
+
optional = (is == :optional)
|
|
39
|
+
begin
|
|
40
|
+
require lib
|
|
41
|
+
puts "+ Found #{optional ? "optional" : "required"} library '#{lib}'"
|
|
42
|
+
return { :optional => optional, :found => true }
|
|
43
|
+
rescue LoadError => e
|
|
44
|
+
puts "- Missing #{optional ? "optional" : "required"} library '#{lib}'" \
|
|
45
|
+
"- try 'gem install #{provider}'" \
|
|
46
|
+
"#{optional ? " if you want this library" : ""}. #{message}"
|
|
47
|
+
return { :optional => optional, :found => false }
|
|
48
|
+
end
|
|
49
|
+
end # def check_lib
|
|
50
|
+
|
|
51
|
+
def report_ruby_version
|
|
52
|
+
puts "Running #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} on #{RUBY_PLATFORM}"
|
|
53
|
+
end # def report_ruby_version
|
|
54
|
+
|
|
55
|
+
def check_libraries
|
|
56
|
+
results = [
|
|
57
|
+
# main agent
|
|
58
|
+
check_lib("grok-pure", "jls-grok", :optional, "needed for the grok filter."),
|
|
59
|
+
check_lib("bunny", "bunny", :optional, "needed for AMQP input and output"),
|
|
60
|
+
check_lib("uuidtools", "uuidtools", :required,
|
|
61
|
+
"needed for AMQP input and output"),
|
|
62
|
+
check_lib("ap", "awesome_print", :optional, "improve debug logging output"),
|
|
63
|
+
check_lib("json", "json", :required, "required for logstash to function"),
|
|
64
|
+
check_lib("filewatch/tail", "filewatch", :optional,
|
|
65
|
+
"required for file input"),
|
|
66
|
+
check_lib("jruby-elasticsearch", "jruby-elasticsearch", :optional,
|
|
67
|
+
"required for elasticsearch output and for logstash web"),
|
|
68
|
+
check_lib("stomp", "stomp", :optional,
|
|
69
|
+
"required for stomp input and output"),
|
|
70
|
+
check_lib("mongo", "mongo", :optional, "required for mongo output"),
|
|
71
|
+
check_lib("redis", "redis", :optional,
|
|
72
|
+
"required for stomp input and output"),
|
|
73
|
+
check_lib("gelf", "gelf", :optional, "required for gelf (graylog2) output"),
|
|
74
|
+
check_lib("statsd", "statsd-ruby", :optional, "required for statsd output"),
|
|
75
|
+
|
|
76
|
+
# logstash web
|
|
77
|
+
check_lib("ftw", "ftw", :required, "needed for logstash web"),
|
|
78
|
+
check_lib("rack", "rack", :required, "needed for logstash web"),
|
|
79
|
+
check_lib("sinatra", "sinatra", :required, "needed for logstash web"),
|
|
80
|
+
check_lib("sass", "sass", :required, "needed for logstash web"),
|
|
81
|
+
check_lib("haml", "haml", :required, "needed for logstash web"),
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
missing_required = results.count { |r| !r[:optional] and !r[:found] }
|
|
85
|
+
if missing_required == 0
|
|
86
|
+
puts "All required libraries found :)"
|
|
87
|
+
else
|
|
88
|
+
suffix = (missing_required > 1) ? "ies" : "y"
|
|
89
|
+
puts "FATAL: Missing #{missing_required} required librar#{suffix}"
|
|
90
|
+
return false
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
return true
|
|
94
|
+
end # def check_libraries
|
|
95
|
+
|
|
96
|
+
# Parse options.
|
|
97
|
+
private
|
|
98
|
+
def options(args)
|
|
99
|
+
# strip out the pluginpath argument if it exists and
|
|
100
|
+
# extend the LOAD_PATH for the ruby runtime
|
|
101
|
+
opts = OptionParser.new
|
|
102
|
+
|
|
103
|
+
opts.on("-v", "Increase verbosity") do
|
|
104
|
+
@verbose += 1
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Step one is to add test flags.
|
|
108
|
+
opts.on("--pluginpath PLUGINPATH",
|
|
109
|
+
"Load plugins and test from a pluginpath") do |path|
|
|
110
|
+
@plugin_paths << path
|
|
111
|
+
end # --pluginpath PLUGINPATH
|
|
112
|
+
|
|
113
|
+
begin
|
|
114
|
+
remainder = opts.parse(args)
|
|
115
|
+
rescue OptionParser::InvalidOption => e
|
|
116
|
+
@logger.info("Invalid option", :exception => e)
|
|
117
|
+
raise e
|
|
118
|
+
end
|
|
119
|
+
return remainder
|
|
120
|
+
end # def options
|
|
121
|
+
|
|
122
|
+
public
|
|
123
|
+
def run(args)
|
|
124
|
+
remainder = options(args)
|
|
125
|
+
|
|
126
|
+
if @verbose >= 3 # Uber debugging.
|
|
127
|
+
@logger.level = :debug
|
|
128
|
+
$DEBUG = true
|
|
129
|
+
elsif @verbose == 2 # logstash debug logs
|
|
130
|
+
@logger.level = :debug
|
|
131
|
+
elsif @verbose == 1 # logstash info logs
|
|
132
|
+
@logger.level = :info
|
|
133
|
+
else # Default log level
|
|
134
|
+
@logger.level = :warn
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
@success = true
|
|
138
|
+
@thread = Thread.new do
|
|
139
|
+
report_ruby_version
|
|
140
|
+
|
|
141
|
+
# TODO(sissel): Rewrite this into a proper test?
|
|
142
|
+
#if !check_libraries
|
|
143
|
+
#puts "Library check failed."
|
|
144
|
+
#@success = false
|
|
145
|
+
#end
|
|
146
|
+
|
|
147
|
+
@plugin_paths.each do |path|
|
|
148
|
+
load_tests(path)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
require "minitest/spec"
|
|
152
|
+
@status = MiniTest::Unit.new.run(ARGV)
|
|
153
|
+
end # the runner thread
|
|
154
|
+
return remainder
|
|
155
|
+
end # def run
|
|
156
|
+
|
|
157
|
+
def wait
|
|
158
|
+
@thread.join
|
|
159
|
+
return @status
|
|
160
|
+
end # def wait
|
|
161
|
+
|
|
162
|
+
# Find tests in a given path. Tests must be in the plugin path +
|
|
163
|
+
# "/test/.../test_*.rb"
|
|
164
|
+
def each_test(basepath, &block)
|
|
165
|
+
if jarred?(basepath)
|
|
166
|
+
# No test/logstash/... hierarchy in the jar, not right now anyway.
|
|
167
|
+
glob_path = File.join(basepath, "logstash", "**", "test_*.rb")
|
|
168
|
+
else
|
|
169
|
+
glob_path = File.join(basepath, "test", "**", "test_*.rb")
|
|
170
|
+
end
|
|
171
|
+
@logger.info("Searching for tests", :path => glob_path)
|
|
172
|
+
Dir.glob(glob_path).each do |path|
|
|
173
|
+
block.call(path)
|
|
174
|
+
end
|
|
175
|
+
end # def each_test
|
|
176
|
+
|
|
177
|
+
def load_tests(path)
|
|
178
|
+
each_test(path) do |test|
|
|
179
|
+
@logger.info("Loading test", :test => test)
|
|
180
|
+
require test
|
|
181
|
+
end
|
|
182
|
+
end # def load_tests
|
|
183
|
+
end # class LogStash::Test
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
require "logstash/logging"
|
|
4
|
+
|
|
5
|
+
class LogStash::ThreadWatchdog
|
|
6
|
+
attr_accessor :logger
|
|
7
|
+
attr_accessor :threads
|
|
8
|
+
|
|
9
|
+
class TimeoutError < StandardError; end
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
def initialize(threads, watchdog_timeout=10)
|
|
13
|
+
@threads = threads
|
|
14
|
+
@watchdog_timeout = watchdog_timeout
|
|
15
|
+
end # def initialize
|
|
16
|
+
|
|
17
|
+
public
|
|
18
|
+
def watch
|
|
19
|
+
while sleep(1)
|
|
20
|
+
cutoff = Time.now - @watchdog_timeout
|
|
21
|
+
@threads.each do |t|
|
|
22
|
+
watchdog = t[:watchdog]
|
|
23
|
+
if watchdog and watchdog <= cutoff
|
|
24
|
+
age = Time.now - watchdog
|
|
25
|
+
@logger.fatal("thread watchdog timeout",
|
|
26
|
+
:thread => t,
|
|
27
|
+
:backtrace => t.backtrace,
|
|
28
|
+
:thread_watchdog => watchdog,
|
|
29
|
+
:age => age,
|
|
30
|
+
:cutoff => @watchdog_timeout,
|
|
31
|
+
:state => t[:watchdog_state])
|
|
32
|
+
raise TimeoutError, "watchdog timeout"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end # def watch
|
|
37
|
+
end # class LogStash::ThreadWatchdog
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
|
|
4
|
+
# Provide our own Time wrapper for ISO8601 support
|
|
5
|
+
# Example:
|
|
6
|
+
# >> LogStash::Time.now.to_iso8601
|
|
7
|
+
# => "2010-10-17 00:25:24.619014-0700"
|
|
8
|
+
#
|
|
9
|
+
# >> LogStash::Time.now.utc.to_iso8601
|
|
10
|
+
# => "2010-10-17 07:25:26.788704Z"
|
|
11
|
+
module LogStash::Time
|
|
12
|
+
ISO8601_STRFTIME = "%04d-%02d-%02dT%02d:%02d:%02d.%06d%+03d:00".freeze
|
|
13
|
+
def self.now
|
|
14
|
+
return Time.new.utc
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if RUBY_PLATFORM == "java"
|
|
18
|
+
#JODA_ISO8601_PARSER = org.joda.time.format.ISODateTimeFormat.dateTimeParser
|
|
19
|
+
#JODA_ISO8601_PARSER = org.joda.time.format.ISODateTimeFormat.dateTimeParser
|
|
20
|
+
JODA_ISO8601_PARSER = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
|
|
21
|
+
UTC = org.joda.time.DateTimeZone.forID("UTC")
|
|
22
|
+
def self.parse_iso8601(t)
|
|
23
|
+
millis = JODA_ISO8601_PARSER.parseMillis(t)
|
|
24
|
+
return Time.at(millis / 1000, (millis % 1000) * 1000)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
def self.parse_iso8601(t)
|
|
28
|
+
# Warning, ruby's Time.parse is *really* terrible and slow.
|
|
29
|
+
return unless t.is_a?(String)
|
|
30
|
+
return Time.parse(t).gmtime
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end # module LogStash::Time
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
|
|
4
|
+
module LogStash::Util
|
|
5
|
+
UNAME = case RbConfig::CONFIG["host_os"]
|
|
6
|
+
when /^linux/; "linux"
|
|
7
|
+
else; RbConfig::CONFIG["host_os"]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
PR_SET_NAME = 15
|
|
11
|
+
def self.set_thread_name(name)
|
|
12
|
+
if RUBY_ENGINE == "jruby"
|
|
13
|
+
# Keep java and ruby thread names in sync.
|
|
14
|
+
Java::java.lang.Thread.currentThread.setName(name)
|
|
15
|
+
end
|
|
16
|
+
Thread.current[:name] = name
|
|
17
|
+
|
|
18
|
+
if UNAME == "linux"
|
|
19
|
+
require "logstash/util/prctl"
|
|
20
|
+
# prctl PR_SET_NAME allows up to 16 bytes for a process name
|
|
21
|
+
# since MRI 1.9, JRuby, and Rubinius use system threads for this.
|
|
22
|
+
LibC.prctl(PR_SET_NAME, name[0..16], 0, 0, 0)
|
|
23
|
+
end
|
|
24
|
+
end # def set_thread_name
|
|
25
|
+
|
|
26
|
+
# Merge hash 'src' into 'dst' nondestructively
|
|
27
|
+
#
|
|
28
|
+
# Duplicate keys will become array values
|
|
29
|
+
#
|
|
30
|
+
# [ src["foo"], dst["foo"] ]
|
|
31
|
+
def self.hash_merge(dst, src)
|
|
32
|
+
src.each do |name, svalue|
|
|
33
|
+
if dst.include?(name)
|
|
34
|
+
dvalue = dst[name]
|
|
35
|
+
if dvalue.is_a?(Hash) && svalue.is_a?(Hash)
|
|
36
|
+
dvalue = hash_merge(dvalue, svalue)
|
|
37
|
+
elsif svalue.is_a?(Array)
|
|
38
|
+
if dvalue.is_a?(Array)
|
|
39
|
+
# merge arrays without duplicates.
|
|
40
|
+
dvalue |= svalue
|
|
41
|
+
else
|
|
42
|
+
dvalue = [dvalue] | svalue
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
if dvalue.is_a?(Array)
|
|
46
|
+
dvalue << svalue unless dvalue.include?(svalue)
|
|
47
|
+
else
|
|
48
|
+
dvalue = [dvalue, svalue] unless dvalue == svalue
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
dst[name] = dvalue
|
|
53
|
+
else
|
|
54
|
+
# dst doesn't have this key, just set it.
|
|
55
|
+
dst[name] = svalue
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
return dst
|
|
60
|
+
end # def self.hash_merge
|
|
61
|
+
|
|
62
|
+
# Merge hash 'src' into 'dst' nondestructively
|
|
63
|
+
#
|
|
64
|
+
# Duplicate keys will become array values
|
|
65
|
+
# Arrays merged will simply be appended.
|
|
66
|
+
#
|
|
67
|
+
# [ src["foo"], dst["foo"] ]
|
|
68
|
+
def self.hash_merge_with_dups(dst, src)
|
|
69
|
+
src.each do |name, svalue|
|
|
70
|
+
if dst.include?(name)
|
|
71
|
+
dvalue = dst[name]
|
|
72
|
+
if dvalue.is_a?(Hash) && svalue.is_a?(Hash)
|
|
73
|
+
dvalue = hash_merge(dvalue, svalue)
|
|
74
|
+
elsif svalue.is_a?(Array)
|
|
75
|
+
if dvalue.is_a?(Array)
|
|
76
|
+
# merge arrays without duplicates.
|
|
77
|
+
dvalue += svalue
|
|
78
|
+
else
|
|
79
|
+
dvalue = [dvalue] + svalue
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
if dvalue.is_a?(Array)
|
|
83
|
+
dvalue << svalue unless dvalue.include?(svalue)
|
|
84
|
+
else
|
|
85
|
+
dvalue = [dvalue, svalue] unless dvalue == svalue
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
dst[name] = dvalue
|
|
90
|
+
else
|
|
91
|
+
# dst doesn't have this key, just set it.
|
|
92
|
+
dst[name] = svalue
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
return dst
|
|
97
|
+
end # def self.hash_merge
|
|
98
|
+
|
|
99
|
+
def self.hash_merge_many(*hashes)
|
|
100
|
+
dst = {}
|
|
101
|
+
hashes.each do |hash|
|
|
102
|
+
hash_merge_with_dups(dst, hash)
|
|
103
|
+
end
|
|
104
|
+
return dst
|
|
105
|
+
end # def hash_merge_many
|
|
106
|
+
end # module LogStash::Util
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# BufferedTokenizer - Statefully split input data by a specifiable token
|
|
3
|
+
#
|
|
4
|
+
# Authors:: Tony Arcieri, Martin Emde
|
|
5
|
+
#
|
|
6
|
+
#----------------------------------------------------------------------------
|
|
7
|
+
#
|
|
8
|
+
# Copyright (C) 2006-07 by Tony Arcieri and Martin Emde
|
|
9
|
+
#
|
|
10
|
+
# Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
|
|
11
|
+
#
|
|
12
|
+
#---------------------------------------------------------------------------
|
|
13
|
+
#
|
|
14
|
+
|
|
15
|
+
# (C)2006 Tony Arcieri, Martin Emde
|
|
16
|
+
# Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
|
|
17
|
+
|
|
18
|
+
# BufferedTokenizer takes a delimiter upon instantiation, or acts line-based
|
|
19
|
+
# by default. It allows input to be spoon-fed from some outside source which
|
|
20
|
+
# receives arbitrary length datagrams which may-or-may-not contain the token
|
|
21
|
+
# by which entities are delimited.
|
|
22
|
+
#
|
|
23
|
+
# Commonly used to parse lines out of incoming data:
|
|
24
|
+
#
|
|
25
|
+
# module LineBufferedConnection
|
|
26
|
+
# def receive_data(data)
|
|
27
|
+
# (@buffer ||= BufferedTokenizer.new).extract(data).each do |line|
|
|
28
|
+
# receive_line(line)
|
|
29
|
+
# end
|
|
30
|
+
# end
|
|
31
|
+
# end
|
|
32
|
+
|
|
33
|
+
module FileWatch; class BufferedTokenizer
|
|
34
|
+
# New BufferedTokenizers will operate on lines delimited by "\n" by default
|
|
35
|
+
# or allow you to specify any delimiter token you so choose, which will then
|
|
36
|
+
# be used by String#split to tokenize the input data
|
|
37
|
+
def initialize(delimiter = "\n", size_limit = nil)
|
|
38
|
+
# Store the specified delimiter
|
|
39
|
+
@delimiter = delimiter
|
|
40
|
+
|
|
41
|
+
# Store the specified size limitation
|
|
42
|
+
@size_limit = size_limit
|
|
43
|
+
|
|
44
|
+
# The input buffer is stored as an array. This is by far the most efficient
|
|
45
|
+
# approach given language constraints (in C a linked list would be a more
|
|
46
|
+
# appropriate data structure). Segments of input data are stored in a list
|
|
47
|
+
# which is only joined when a token is reached, substantially reducing the
|
|
48
|
+
# number of objects required for the operation.
|
|
49
|
+
@input = []
|
|
50
|
+
|
|
51
|
+
# Size of the input buffer
|
|
52
|
+
@input_size = 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Extract takes an arbitrary string of input data and returns an array of
|
|
56
|
+
# tokenized entities, provided there were any available to extract. This
|
|
57
|
+
# makes for easy processing of datagrams using a pattern like:
|
|
58
|
+
#
|
|
59
|
+
# tokenizer.extract(data).map { |entity| Decode(entity) }.each do ...
|
|
60
|
+
def extract(data)
|
|
61
|
+
# Extract token-delimited entities from the input string with the split command.
|
|
62
|
+
# There's a bit of craftiness here with the -1 parameter. Normally split would
|
|
63
|
+
# behave no differently regardless of if the token lies at the very end of the
|
|
64
|
+
# input buffer or not (i.e. a literal edge case) Specifying -1 forces split to
|
|
65
|
+
# return "" in this case, meaning that the last entry in the list represents a
|
|
66
|
+
# new segment of data where the token has not been encountered
|
|
67
|
+
entities = data.split @delimiter, -1
|
|
68
|
+
|
|
69
|
+
# Check to see if the buffer has exceeded capacity, if we're imposing a limit
|
|
70
|
+
if @size_limit
|
|
71
|
+
raise 'input buffer full' if @input_size + entities.first.size > @size_limit
|
|
72
|
+
@input_size += entities.first.size
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Move the first entry in the resulting array into the input buffer. It represents
|
|
76
|
+
# the last segment of a token-delimited entity unless it's the only entry in the list.
|
|
77
|
+
@input << entities.shift
|
|
78
|
+
|
|
79
|
+
# If the resulting array from the split is empty, the token was not encountered
|
|
80
|
+
# (not even at the end of the buffer). Since we've encountered no token-delimited
|
|
81
|
+
# entities this go-around, return an empty array.
|
|
82
|
+
return [] if entities.empty?
|
|
83
|
+
|
|
84
|
+
# At this point, we've hit a token, or potentially multiple tokens. Now we can bring
|
|
85
|
+
# together all the data we've buffered from earlier calls without hitting a token,
|
|
86
|
+
# and add it to our list of discovered entities.
|
|
87
|
+
entities.unshift @input.join
|
|
88
|
+
|
|
89
|
+
=begin
|
|
90
|
+
# Note added by FC, 10Jul07. This paragraph contains a regression. It breaks
|
|
91
|
+
# empty tokens. Think of the empty line that delimits an HTTP header. It will have
|
|
92
|
+
# two "\n" delimiters in a row, and this code mishandles the resulting empty token.
|
|
93
|
+
# It someone figures out how to fix the problem, we can re-enable this code branch.
|
|
94
|
+
# Multi-character token support.
|
|
95
|
+
# Split any tokens that were incomplete on the last iteration buf complete now.
|
|
96
|
+
entities.map! do |e|
|
|
97
|
+
e.split @delimiter, -1
|
|
98
|
+
end
|
|
99
|
+
# Flatten the resulting array. This has the side effect of removing the empty
|
|
100
|
+
# entry at the end that was produced by passing -1 to split. Add it again if
|
|
101
|
+
# necessary.
|
|
102
|
+
if (entities[-1] == [])
|
|
103
|
+
entities.flatten! << []
|
|
104
|
+
else
|
|
105
|
+
entities.flatten!
|
|
106
|
+
end
|
|
107
|
+
=end
|
|
108
|
+
|
|
109
|
+
# Now that we've hit a token, joined the input buffer and added it to the entities
|
|
110
|
+
# list, we can go ahead and clear the input buffer. All of the segments that were
|
|
111
|
+
# stored before the join can now be garbage collected.
|
|
112
|
+
@input.clear
|
|
113
|
+
|
|
114
|
+
# The last entity in the list is not token delimited, however, thanks to the -1
|
|
115
|
+
# passed to split. It represents the beginning of a new list of as-yet-untokenized
|
|
116
|
+
# data, so we add it to the start of the list.
|
|
117
|
+
@input << entities.pop
|
|
118
|
+
|
|
119
|
+
# Set the new input buffer size, provided we're keeping track
|
|
120
|
+
@input_size = @input.first.size if @size_limit
|
|
121
|
+
|
|
122
|
+
# Now we're left with the list of extracted token-delimited entities we wanted
|
|
123
|
+
# in the first place. Hooray!
|
|
124
|
+
entities
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Flush the contents of the input buffer, i.e. return the input buffer even though
|
|
128
|
+
# a token has not yet been encountered
|
|
129
|
+
def flush
|
|
130
|
+
buffer = @input.join
|
|
131
|
+
@input.clear
|
|
132
|
+
buffer
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Is the buffer empty?
|
|
136
|
+
def empty?
|
|
137
|
+
@input.empty?
|
|
138
|
+
end
|
|
139
|
+
end; end
|