logstash-lite 0.2.20101118134500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. data/bin/logstash +56 -0
  2. data/bin/logstash-web +6 -0
  3. data/etc/logstash-elasticsearch-rabbitmq-river.yaml +41 -0
  4. data/etc/logstash-mongodb-storage.yaml +5 -0
  5. data/etc/logstash-parser.yaml +20 -0
  6. data/etc/logstash-reader.yaml +8 -0
  7. data/etc/logstash-shipper.yaml +18 -0
  8. data/etc/logstash-standalone.yaml +47 -0
  9. data/etc/prod.yaml +38 -0
  10. data/etc/redhat/logstash +92 -0
  11. data/etc/redhat/logstash-agent +83 -0
  12. data/etc/redhat/logstash-agent.sysconfig +7 -0
  13. data/etc/redhat/logstash.spec +171 -0
  14. data/etc/redhat/logstash.sysconfig +18 -0
  15. data/etc/tograylog.yaml +37 -0
  16. data/examples/test.rb +38 -0
  17. data/lib/logstash.rb +3 -0
  18. data/lib/logstash/agent.rb +116 -0
  19. data/lib/logstash/event.rb +70 -0
  20. data/lib/logstash/filters.rb +17 -0
  21. data/lib/logstash/filters/base.rb +17 -0
  22. data/lib/logstash/filters/date.rb +59 -0
  23. data/lib/logstash/filters/field.rb +29 -0
  24. data/lib/logstash/filters/grok.rb +74 -0
  25. data/lib/logstash/filters/grokdiscovery.rb +60 -0
  26. data/lib/logstash/inputs.rb +18 -0
  27. data/lib/logstash/inputs/amqp.rb +48 -0
  28. data/lib/logstash/inputs/base.rb +32 -0
  29. data/lib/logstash/inputs/file.rb +47 -0
  30. data/lib/logstash/inputs/syslog.rb +123 -0
  31. data/lib/logstash/inputs/tcp.rb +51 -0
  32. data/lib/logstash/logging.rb +82 -0
  33. data/lib/logstash/namespace.rb +6 -0
  34. data/lib/logstash/outputs.rb +15 -0
  35. data/lib/logstash/outputs/amqp.rb +48 -0
  36. data/lib/logstash/outputs/base.rb +29 -0
  37. data/lib/logstash/outputs/elasticsearch.rb +71 -0
  38. data/lib/logstash/outputs/gelf.rb +35 -0
  39. data/lib/logstash/outputs/mongodb.rb +19 -0
  40. data/lib/logstash/outputs/stdout.rb +15 -0
  41. data/lib/logstash/outputs/websocket.rb +35 -0
  42. data/lib/logstash/time.rb +27 -0
  43. data/lib/logstash/web/lib/elasticsearch.rb +79 -0
  44. data/lib/logstash/web/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  45. data/lib/logstash/web/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  46. data/lib/logstash/web/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  47. data/lib/logstash/web/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  48. data/lib/logstash/web/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  49. data/lib/logstash/web/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  50. data/lib/logstash/web/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  51. data/lib/logstash/web/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  52. data/lib/logstash/web/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  53. data/lib/logstash/web/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  54. data/lib/logstash/web/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  55. data/lib/logstash/web/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  56. data/lib/logstash/web/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  57. data/lib/logstash/web/public/css/smoothness/jquery-ui-1.8.5.custom.css +572 -0
  58. data/lib/logstash/web/public/js/flot/API.txt +1024 -0
  59. data/lib/logstash/web/public/js/flot/FAQ.txt +71 -0
  60. data/lib/logstash/web/public/js/flot/LICENSE.txt +22 -0
  61. data/lib/logstash/web/public/js/flot/Makefile +15 -0
  62. data/lib/logstash/web/public/js/flot/NEWS.txt +340 -0
  63. data/lib/logstash/web/public/js/flot/PLUGINS.txt +105 -0
  64. data/lib/logstash/web/public/js/flot/README.txt +81 -0
  65. data/lib/logstash/web/public/js/flot/examples/ajax.html +143 -0
  66. data/lib/logstash/web/public/js/flot/examples/annotating.html +75 -0
  67. data/lib/logstash/web/public/js/flot/examples/arrow-down.gif +0 -0
  68. data/lib/logstash/web/public/js/flot/examples/arrow-left.gif +0 -0
  69. data/lib/logstash/web/public/js/flot/examples/arrow-right.gif +0 -0
  70. data/lib/logstash/web/public/js/flot/examples/arrow-up.gif +0 -0
  71. data/lib/logstash/web/public/js/flot/examples/basic.html +38 -0
  72. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth-1.json +4 -0
  73. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth-2.json +4 -0
  74. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth-3.json +4 -0
  75. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth-4.json +4 -0
  76. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth-5.json +4 -0
  77. data/lib/logstash/web/public/js/flot/examples/data-eu-gdp-growth.json +4 -0
  78. data/lib/logstash/web/public/js/flot/examples/data-japan-gdp-growth.json +4 -0
  79. data/lib/logstash/web/public/js/flot/examples/data-usa-gdp-growth.json +4 -0
  80. data/lib/logstash/web/public/js/flot/examples/dual-axis.html +39 -0
  81. data/lib/logstash/web/public/js/flot/examples/graph-types.html +75 -0
  82. data/lib/logstash/web/public/js/flot/examples/hs-2004-27-a-large_web.jpg +0 -0
  83. data/lib/logstash/web/public/js/flot/examples/image.html +45 -0
  84. data/lib/logstash/web/public/js/flot/examples/index.html +43 -0
  85. data/lib/logstash/web/public/js/flot/examples/interacting.html +93 -0
  86. data/lib/logstash/web/public/js/flot/examples/layout.css +6 -0
  87. data/lib/logstash/web/public/js/flot/examples/navigate.html +118 -0
  88. data/lib/logstash/web/public/js/flot/examples/selection.html +114 -0
  89. data/lib/logstash/web/public/js/flot/examples/setting-options.html +65 -0
  90. data/lib/logstash/web/public/js/flot/examples/stacking.html +77 -0
  91. data/lib/logstash/web/public/js/flot/examples/thresholding.html +54 -0
  92. data/lib/logstash/web/public/js/flot/examples/time.html +71 -0
  93. data/lib/logstash/web/public/js/flot/examples/tracking.html +95 -0
  94. data/lib/logstash/web/public/js/flot/examples/turning-series.html +98 -0
  95. data/lib/logstash/web/public/js/flot/examples/visitors.html +90 -0
  96. data/lib/logstash/web/public/js/flot/examples/zooming.html +98 -0
  97. data/lib/logstash/web/public/js/flot/excanvas.js +1427 -0
  98. data/lib/logstash/web/public/js/flot/excanvas.min.js +1 -0
  99. data/lib/logstash/web/public/js/flot/jquery.colorhelpers.js +174 -0
  100. data/lib/logstash/web/public/js/flot/jquery.colorhelpers.min.js +1 -0
  101. data/lib/logstash/web/public/js/flot/jquery.flot.crosshair.js +156 -0
  102. data/lib/logstash/web/public/js/flot/jquery.flot.crosshair.min.js +1 -0
  103. data/lib/logstash/web/public/js/flot/jquery.flot.image.js +237 -0
  104. data/lib/logstash/web/public/js/flot/jquery.flot.image.min.js +1 -0
  105. data/lib/logstash/web/public/js/flot/jquery.flot.js +2119 -0
  106. data/lib/logstash/web/public/js/flot/jquery.flot.min.js +1 -0
  107. data/lib/logstash/web/public/js/flot/jquery.flot.navigate.js +272 -0
  108. data/lib/logstash/web/public/js/flot/jquery.flot.navigate.min.js +1 -0
  109. data/lib/logstash/web/public/js/flot/jquery.flot.selection.js +299 -0
  110. data/lib/logstash/web/public/js/flot/jquery.flot.selection.min.js +1 -0
  111. data/lib/logstash/web/public/js/flot/jquery.flot.stack.js +152 -0
  112. data/lib/logstash/web/public/js/flot/jquery.flot.stack.min.js +1 -0
  113. data/lib/logstash/web/public/js/flot/jquery.flot.threshold.js +103 -0
  114. data/lib/logstash/web/public/js/flot/jquery.flot.threshold.min.js +1 -0
  115. data/lib/logstash/web/public/js/flot/jquery.js +4376 -0
  116. data/lib/logstash/web/public/js/flot/jquery.min.js +19 -0
  117. data/lib/logstash/web/public/js/jquery-hashchange-1.0.0.js +121 -0
  118. data/lib/logstash/web/public/js/jquery.livequery.js +250 -0
  119. data/lib/logstash/web/public/js/jquery.tmpl.min.js +1 -0
  120. data/lib/logstash/web/public/js/logstash.js +202 -0
  121. data/lib/logstash/web/server.rb +90 -0
  122. data/lib/logstash/web/views/header.haml +8 -0
  123. data/lib/logstash/web/views/layout.haml +21 -0
  124. data/lib/logstash/web/views/main/index.haml +5 -0
  125. data/lib/logstash/web/views/search/ajax.haml +32 -0
  126. data/lib/logstash/web/views/search/results.haml +17 -0
  127. data/lib/logstash/web/views/style.sass +50 -0
  128. data/patterns/firewalls +2 -0
  129. data/patterns/grok-patterns +90 -0
  130. data/patterns/haproxy +5 -0
  131. data/patterns/linux-syslog +7 -0
  132. data/patterns/nagios +7 -0
  133. data/patterns/ruby +2 -0
  134. metadata +228 -0
@@ -0,0 +1,6 @@
1
+
2
+ module LogStash
3
+ module Inputs; end
4
+ module Outputs; end
5
+ module Filters; end
6
+ end # module LogStash
@@ -0,0 +1,15 @@
1
+
2
+ require "logstash/namespace"
3
+ require "uri"
4
+
5
+ module LogStash::Outputs
6
+ def self.from_url(url, &block)
7
+ uri = URI.parse(url)
8
+ # TODO(sissel): Add error handling
9
+ # TODO(sissel): Allow plugin paths
10
+ klass = uri.scheme.capitalize
11
+ file = uri.scheme
12
+ require "logstash/outputs/#{file}"
13
+ LogStash::Outputs.const_get(klass).new(uri, &block)
14
+ end # def from_url
15
+ end # module LogStash::Outputs
@@ -0,0 +1,48 @@
1
+ require "logstash/outputs/base"
2
+ require "amqp" # rubygem 'amqp'
3
+ require "mq" # rubygem 'amqp'
4
+
5
+ class LogStash::Outputs::Amqp < LogStash::Outputs::Base
6
+ MQTYPES = [ "fanout", "queue", "topic" ]
7
+ def initialize(url, config={}, &block)
8
+ super
9
+
10
+ # Handle path /<type>/<name>
11
+ unused, @mqtype, @name = @url.path.split("/", 3)
12
+ if @mqtype == nil or @name == nil
13
+ raise "amqp urls must have a path of /<type>/name where <type> is #{MQTYPES.join(", ")}"
14
+ end
15
+
16
+ if !MQTYPES.include?(@mqtype)
17
+ raise "Invalid type '#{@mqtype}' must be one #{MQTYPES.join(", ")}"
18
+ end
19
+ end # def initialize
20
+
21
+ def register
22
+ @amqp = AMQP.connect(:host => @url.host)
23
+ @mq = MQ.new(@amqp)
24
+ @target = nil
25
+
26
+ case @mqtype
27
+ when "fanout"
28
+ @target = @mq.fanout(@name)
29
+ when "queue"
30
+ @target = @mq.queue(@name, :durable => @urlopts["durable"] ? true : false)
31
+ when "topic"
32
+ @target = @mq.topic(@name)
33
+ end # case @mqtype
34
+ end # def register
35
+
36
+ def receive(event)
37
+ @logger.debug(["Sending event", { :url => @url, :event => event }])
38
+ @target.publish(event.to_json)
39
+ end # def receive
40
+
41
+ def receive_raw(raw)
42
+ if @target == nil
43
+ raise "had trouble registering AMQP URL #{@url.to_s}, @target is nil"
44
+ end
45
+
46
+ @target.publish(raw)
47
+ end # def receive_raw
48
+ end # class LogStash::Outputs::Amqp
@@ -0,0 +1,29 @@
1
+ require "logstash/namespace"
2
+ require "logstash/event"
3
+ require "logstash/logging"
4
+ require "cgi"
5
+ require "uri"
6
+
7
+ class LogStash::Outputs::Base
8
+ def initialize(url, config={}, &block)
9
+ @url = url
10
+ @url = URI.parse(url) if url.is_a? String
11
+ @config = config
12
+ @logger = LogStash::Logger.new(STDOUT)
13
+ @urlopts = {}
14
+ if @url.query
15
+ @urlopts = CGI.parse(@url.query)
16
+ @urlopts.each do |k, v|
17
+ @urlopts[k] = v.last if v.is_a?(Array)
18
+ end
19
+ end
20
+ end
21
+
22
+ def register
23
+ raise "#{self.class}#register must be overidden"
24
+ end # def register
25
+
26
+ def receive(event)
27
+ raise "#{self.class}#receive must be overidden"
28
+ end
29
+ end # class LogStash::Outputs::Base
@@ -0,0 +1,71 @@
1
+ require "logstash/outputs/base"
2
+ require "logstash/outputs/amqp"
3
+ require "em-http-request"
4
+
5
+ class LogStash::Outputs::Elasticsearch < LogStash::Outputs::Base
6
+ def initialize(url, config={}, &block)
7
+ super
8
+ end
9
+
10
+ def register
11
+ # Port?
12
+ # Authentication?
13
+ @httpurl = @url.clone
14
+ @httpurl.scheme = "http"
15
+ defaults = {"method" => "http"}
16
+ params = defaults.merge(@urlopts)
17
+
18
+ case params["method"]
19
+ when "http"
20
+ @logger.debug "ElasticSearch using http with URL #{@httpurl.to_s}"
21
+ @http = EventMachine::HttpRequest.new(@httpurl.to_s)
22
+ @callback = self.method(:receive_http)
23
+ when "river"
24
+ mq_url = URI::parse("amqp://#{params["host"]}/queue/#{params["queue"]}?durable=1")
25
+ @mq = LogStash::Outputs::Amqp.new(mq_url.to_s)
26
+ @mq.register
27
+ @callback = self.method(:receive_river)
28
+ em_url = URI.parse("http://#{@httpurl.host}:#{@httpurl.port}/_river/logstash#{@httpurl.path.tr("/", "_")}/_meta")
29
+ unused, @es_index, @es_type = @httpurl.path.split("/", 3)
30
+
31
+ river_config = {"type" => params["type"],
32
+ params["type"] => {"host" => params["host"],
33
+ "user" => params["user"],
34
+ "pass" => params["pass"],
35
+ "vhost" => params["vhost"],
36
+ "queue" => params["queue"],
37
+ "exchange" => params["queue"],
38
+ },
39
+ "index" => {"bulk_size" => 100,
40
+ "bulk_timeout" => "10ms",
41
+ },
42
+ }
43
+ @logger.debug(["ElasticSearch using river", river_config])
44
+ http_setup = EventMachine::HttpRequest.new(em_url.to_s)
45
+ req = http_setup.put :body => river_config.to_json
46
+ req.errback do
47
+ @logger.warn "Error setting up river: #{req.response}"
48
+ end
49
+ else raise "unknown elasticsearch method #{params["method"].inspect}"
50
+ end
51
+ end # def register
52
+
53
+ def receive(event)
54
+ @callback.call(event)
55
+ end # def receive
56
+
57
+ def receive_http(event)
58
+ req = @http.post :body => event.to_json
59
+ req.errback do
60
+ $stderr.puts "Request to index to #{@httpurl.to_s} failed. Event was #{event.to_s}"
61
+ end
62
+ end # def receive_http
63
+
64
+ def receive_river(event)
65
+ # bulk format; see http://www.elasticsearch.com/docs/elasticsearch/river/rabbitmq/
66
+ index_message = {"index" => {"_index" => @es_index, "_type" => @es_type}}.to_json + "\n"
67
+ #index_message += {@es_type => event.to_hash}.to_json + "\n"
68
+ index_message += event.to_hash.to_json + "\n"
69
+ @mq.receive_raw(index_message)
70
+ end # def receive_river
71
+ end # class LogStash::Outputs::Websocket
@@ -0,0 +1,35 @@
1
+ # GELF output
2
+ # http://www.graylog2.org/about/gelf
3
+ #
4
+ # This class doesn't currently use 'eventmachine'-style code, so it may
5
+ # block things. Whatever, we can fix that later ;)
6
+
7
+ require "gelf"
8
+ require "logstash/outputs/base"
9
+
10
+ class LogStash::Outputs::Gelf < LogStash::Outputs::Base
11
+ def initialize(url, config={}, &block)
12
+ super
13
+ end
14
+
15
+ def register
16
+ # nothing to do
17
+ end # def register
18
+
19
+ def receive(event)
20
+ # TODO(sissel): Use Gelf::Message instead
21
+ gelf = Gelf.new(@url.host, (@url.port or 12201))
22
+ gelf.short_message = (event.fields["message"] or event.message)
23
+ gelf.full_message = (event.message)
24
+ gelf.level = 1
25
+ source = URI.parse(event.source)
26
+ gelf.host = source.host
27
+ gelf.file = source.path
28
+
29
+ event.fields.each do |name, value|
30
+ gelf.add_additional name, value
31
+ end
32
+ gelf.add_additional "@timestamp", event.timestamp
33
+ gelf.send
34
+ end # def event
35
+ end # class LogStash::Outputs::Gelf
@@ -0,0 +1,19 @@
1
+ require "logstash/outputs/base"
2
+ require "em-mongo"
3
+
4
+ class LogStash::Outputs::Mongodb < LogStash::Outputs::Base
5
+ def initialize(url, config={}, &block)
6
+ super
7
+ end
8
+
9
+ def register
10
+ # Port?
11
+ # Authentication?
12
+ db = @url.path[1..-1] # Skip leading '/'
13
+ @mongodb = EventMachine::Mongo::Connection.new(@url.host).db(db)
14
+ end # def register
15
+
16
+ def receive(event)
17
+ @mongodb.collection("events").insert(event.to_hash)
18
+ end # def event
19
+ end # class LogStash::Outputs::Mongodb
@@ -0,0 +1,15 @@
1
+ require "logstash/outputs/base"
2
+
3
+ class LogStash::Outputs::Stdout < LogStash::Outputs::Base
4
+ def initialize(url, config={}, &block)
5
+ super
6
+ end
7
+
8
+ def register
9
+ # nothing to do
10
+ end # def register
11
+
12
+ def receive(event)
13
+ puts event
14
+ end # def event
15
+ end # class LogStash::Outputs::Stdout
@@ -0,0 +1,35 @@
1
+ require "logstash/outputs/base"
2
+ require "em-websocket" # rubygem 'em-websocket'
3
+
4
+ class LogStash::Outputs::Websocket < LogStash::Outputs::Base
5
+ def initialize(url, config={}, &block)
6
+ super
7
+ end
8
+
9
+ def register
10
+ @channel = EventMachine::Channel.new
11
+ @subscribers = 0
12
+ host = (@url.host or "0.0.0.0")
13
+ port = (@url.port or 3000)
14
+ EventMachine::WebSocket.start(:host => host, :port => port) do |ws|
15
+ ws.onopen do
16
+ @subscribers += 1
17
+ sid = @channel.subscribe do |msg|
18
+ ws.send msg
19
+ end
20
+ ws.onclose do
21
+ @channel.unsubscribe(sid)
22
+ @subscribers -= 1
23
+ end # ws.onclose
24
+ end # ws.onopen
25
+ end
26
+ end # def register
27
+
28
+ def receive(event)
29
+ # Only publish the event to websockets if there are subscribers
30
+ # TODO(sissel): send a patch to eventmachine to fix this.
31
+ if @subscribers > 0
32
+ @channel.push event.to_json
33
+ end
34
+ end # def event
35
+ end # class LogStash::Outputs::Websocket
@@ -0,0 +1,27 @@
1
+
2
+ # Provide our own Time wrapper for ISO8601 support
3
+ # Example:
4
+ # >> LogStash::Time.now.to_iso8601
5
+ # => "2010-10-17 00:25:24.619014-0700"
6
+ #
7
+ # >> LogStash::Time.now.utc.to_iso8601
8
+ # => "2010-10-17 07:25:26.788704Z"
9
+ module LogStash; class Time < ::Time
10
+ ISO8601 = "%Y-%m-%dT%H:%M:%S"
11
+
12
+ # Return a string that is this time in ISO8601 format.
13
+ def to_iso8601
14
+ tz = self.utc? ? "Z" : self.strftime("%z")
15
+ # zero-pad tv_usec so the time string is sortable.
16
+ return "%s.%06d%s" % [self.strftime(ISO8601), self.tv_usec, tz]
17
+ end
18
+
19
+ def self.to_iso8601(obj)
20
+ if obj.is_a?(DateTime)
21
+ tz = obj.offset == 0 ? "Z" : obj.strftime("%z")
22
+ return "%s.%06d%s" % [obj.strftime(ISO8601), obj.sec_fraction.to_f, tz]
23
+ else
24
+ raise "Can't convert object of type #{obj.class} (#{obj}) to iso8601."
25
+ end
26
+ end
27
+ end; end # class LogStash::Time
@@ -0,0 +1,79 @@
1
+
2
+ require "em-http-request"
3
+ require "logstash/namespace"
4
+ require "logstash/logging"
5
+ require "logstash/event"
6
+
7
+ module LogStash::Web; end
8
+ class LogStash::Web::ElasticSearch
9
+ def initialize
10
+ @logger = LogStash::Logger.new(STDOUT)
11
+ end
12
+
13
+ def search(params)
14
+ http = EventMachine::HttpRequest.new("http://localhost:9200/_search")
15
+ params[:offset] ||= 0
16
+ params[:count] ||= 20
17
+
18
+ @logger.info(["Query", params])
19
+ esreq = {
20
+ "sort" => [
21
+ { "@timestamp" => "desc" }
22
+ ],
23
+ "query" => {
24
+ "query_string" => {
25
+ "query" => params[:q],
26
+ "default_operator" => "AND"
27
+ } # query_string
28
+ }, # query
29
+ "facets" => {
30
+ "by_hour" => {
31
+ "histogram" => {
32
+ "field" => "@timestamp",
33
+ "time_interval" => "1h",
34
+ }, # histogram
35
+ }, # by_hour
36
+ }, # facets
37
+ "from" => params[:offset],
38
+ "size" => params[:count],
39
+ }
40
+ #@logger.info(["ElasticSearch Query", esreq])
41
+ start_time = Time.now
42
+ req = http.get :body => esreq.to_json
43
+ req.callback do
44
+ #headers req.response_header
45
+ data = JSON.parse(req.response)
46
+ data["duration"] = Time.now - start_time
47
+
48
+ # TODO(sissel): Plugin-ify this (Search filters!)
49
+ require "digest/md5"
50
+ data["hits"]["hits"].each do |hit|
51
+ event = LogStash::Event.new(hit["_source"])
52
+ event.to_hash.each do |key, value|
53
+ next unless value.is_a?(String)
54
+ value.gsub!(/[^ ]+\.loggly\.net/) { |match| "loggly-" + Digest::MD5.hexdigest(match)[0..6] + ".example.com"}
55
+ end
56
+
57
+ event.fields.each do |key, value|
58
+ value = [value] if value.is_a?(String)
59
+ next unless value.is_a?(Array)
60
+ value.each do |v|
61
+ v.gsub!(/[^ ]+\.loggly\.net/) { |match| "loggly-" + Digest::MD5.hexdigest(match)[0..6] + ".example.com"}
62
+ end # value.each
63
+ end # hit._source.@fields.each
64
+ end # data.hits.hits.each
65
+
66
+ @logger.info(["Got search results",
67
+ { :query => params[:q], :duration => data["duration"]}])
68
+ #@logger.info(data)
69
+ if req.response_header.status != 200
70
+ @error = data["error"]
71
+ end
72
+ yield data
73
+ end
74
+ req.errback do
75
+ @logger.warn(["Query failed", params, req.response])
76
+ yield :failure
77
+ end
78
+ end # def search
79
+ end
@@ -0,0 +1,572 @@
1
+ /*
2
+ * jQuery UI CSS Framework @VERSION
3
+ *
4
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Theming/API
9
+ */
10
+
11
+ /* Layout helpers
12
+ ----------------------------------*/
13
+ .ui-helper-hidden { display: none; }
14
+ .ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
15
+ .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
16
+ .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
17
+ .ui-helper-clearfix { display: inline-block; }
18
+ /* required comment for clearfix to work in Opera \*/
19
+ * html .ui-helper-clearfix { height:1%; }
20
+ .ui-helper-clearfix { display:block; }
21
+ /* end clearfix */
22
+ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
23
+
24
+
25
+ /* Interaction Cues
26
+ ----------------------------------*/
27
+ .ui-state-disabled { cursor: default !important; }
28
+
29
+
30
+ /* Icons
31
+ ----------------------------------*/
32
+
33
+ /* states and images */
34
+ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
35
+
36
+
37
+ /* Misc visuals
38
+ ----------------------------------*/
39
+
40
+ /* Overlays */
41
+ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
42
+
43
+
44
+ /*
45
+ * jQuery UI CSS Framework @VERSION
46
+ *
47
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
48
+ * Dual licensed under the MIT or GPL Version 2 licenses.
49
+ * http://jquery.org/license
50
+ *
51
+ * http://docs.jquery.com/UI/Theming/API
52
+ *
53
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
54
+ */
55
+
56
+
57
+ /* Component containers
58
+ ----------------------------------*/
59
+ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
60
+ .ui-widget .ui-widget { font-size: 1em; }
61
+ .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
62
+ .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
63
+ .ui-widget-content a { color: #222222; }
64
+ .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
65
+ .ui-widget-header a { color: #222222; }
66
+
67
+ /* Interaction states
68
+ ----------------------------------*/
69
+ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
70
+ .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
71
+ .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
72
+ .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
73
+ .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
74
+ .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
75
+ .ui-widget :active { outline: none; }
76
+
77
+ /* Interaction Cues
78
+ ----------------------------------*/
79
+ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
80
+ .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
81
+ .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
82
+ .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
83
+ .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
84
+ .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
85
+ .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
86
+ .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
87
+
88
+ /* Icons
89
+ ----------------------------------*/
90
+
91
+ /* states and images */
92
+ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
93
+ .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
94
+ .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
95
+ .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
96
+ .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
97
+ .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
98
+ .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
99
+ .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
100
+
101
+ /* positioning */
102
+ .ui-icon-carat-1-n { background-position: 0 0; }
103
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
104
+ .ui-icon-carat-1-e { background-position: -32px 0; }
105
+ .ui-icon-carat-1-se { background-position: -48px 0; }
106
+ .ui-icon-carat-1-s { background-position: -64px 0; }
107
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
108
+ .ui-icon-carat-1-w { background-position: -96px 0; }
109
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
110
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
111
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
112
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
113
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
114
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
115
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
116
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
117
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
118
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
119
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
120
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
121
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
122
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
123
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
124
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
125
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
126
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
127
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
128
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
129
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
130
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
131
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
132
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
133
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
134
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
135
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
136
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
137
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
138
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
139
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
140
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
141
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
142
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
143
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
144
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
145
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
146
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
147
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
148
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
149
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
150
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
151
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
152
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
153
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
154
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
155
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
156
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
157
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
158
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
159
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
160
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
161
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
162
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
163
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
164
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
165
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
166
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
167
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
168
+ .ui-icon-extlink { background-position: -32px -80px; }
169
+ .ui-icon-newwin { background-position: -48px -80px; }
170
+ .ui-icon-refresh { background-position: -64px -80px; }
171
+ .ui-icon-shuffle { background-position: -80px -80px; }
172
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
173
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
174
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
175
+ .ui-icon-folder-open { background-position: -16px -96px; }
176
+ .ui-icon-document { background-position: -32px -96px; }
177
+ .ui-icon-document-b { background-position: -48px -96px; }
178
+ .ui-icon-note { background-position: -64px -96px; }
179
+ .ui-icon-mail-closed { background-position: -80px -96px; }
180
+ .ui-icon-mail-open { background-position: -96px -96px; }
181
+ .ui-icon-suitcase { background-position: -112px -96px; }
182
+ .ui-icon-comment { background-position: -128px -96px; }
183
+ .ui-icon-person { background-position: -144px -96px; }
184
+ .ui-icon-print { background-position: -160px -96px; }
185
+ .ui-icon-trash { background-position: -176px -96px; }
186
+ .ui-icon-locked { background-position: -192px -96px; }
187
+ .ui-icon-unlocked { background-position: -208px -96px; }
188
+ .ui-icon-bookmark { background-position: -224px -96px; }
189
+ .ui-icon-tag { background-position: -240px -96px; }
190
+ .ui-icon-home { background-position: 0 -112px; }
191
+ .ui-icon-flag { background-position: -16px -112px; }
192
+ .ui-icon-calendar { background-position: -32px -112px; }
193
+ .ui-icon-cart { background-position: -48px -112px; }
194
+ .ui-icon-pencil { background-position: -64px -112px; }
195
+ .ui-icon-clock { background-position: -80px -112px; }
196
+ .ui-icon-disk { background-position: -96px -112px; }
197
+ .ui-icon-calculator { background-position: -112px -112px; }
198
+ .ui-icon-zoomin { background-position: -128px -112px; }
199
+ .ui-icon-zoomout { background-position: -144px -112px; }
200
+ .ui-icon-search { background-position: -160px -112px; }
201
+ .ui-icon-wrench { background-position: -176px -112px; }
202
+ .ui-icon-gear { background-position: -192px -112px; }
203
+ .ui-icon-heart { background-position: -208px -112px; }
204
+ .ui-icon-star { background-position: -224px -112px; }
205
+ .ui-icon-link { background-position: -240px -112px; }
206
+ .ui-icon-cancel { background-position: 0 -128px; }
207
+ .ui-icon-plus { background-position: -16px -128px; }
208
+ .ui-icon-plusthick { background-position: -32px -128px; }
209
+ .ui-icon-minus { background-position: -48px -128px; }
210
+ .ui-icon-minusthick { background-position: -64px -128px; }
211
+ .ui-icon-close { background-position: -80px -128px; }
212
+ .ui-icon-closethick { background-position: -96px -128px; }
213
+ .ui-icon-key { background-position: -112px -128px; }
214
+ .ui-icon-lightbulb { background-position: -128px -128px; }
215
+ .ui-icon-scissors { background-position: -144px -128px; }
216
+ .ui-icon-clipboard { background-position: -160px -128px; }
217
+ .ui-icon-copy { background-position: -176px -128px; }
218
+ .ui-icon-contact { background-position: -192px -128px; }
219
+ .ui-icon-image { background-position: -208px -128px; }
220
+ .ui-icon-video { background-position: -224px -128px; }
221
+ .ui-icon-script { background-position: -240px -128px; }
222
+ .ui-icon-alert { background-position: 0 -144px; }
223
+ .ui-icon-info { background-position: -16px -144px; }
224
+ .ui-icon-notice { background-position: -32px -144px; }
225
+ .ui-icon-help { background-position: -48px -144px; }
226
+ .ui-icon-check { background-position: -64px -144px; }
227
+ .ui-icon-bullet { background-position: -80px -144px; }
228
+ .ui-icon-radio-off { background-position: -96px -144px; }
229
+ .ui-icon-radio-on { background-position: -112px -144px; }
230
+ .ui-icon-pin-w { background-position: -128px -144px; }
231
+ .ui-icon-pin-s { background-position: -144px -144px; }
232
+ .ui-icon-play { background-position: 0 -160px; }
233
+ .ui-icon-pause { background-position: -16px -160px; }
234
+ .ui-icon-seek-next { background-position: -32px -160px; }
235
+ .ui-icon-seek-prev { background-position: -48px -160px; }
236
+ .ui-icon-seek-end { background-position: -64px -160px; }
237
+ .ui-icon-seek-start { background-position: -80px -160px; }
238
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
239
+ .ui-icon-seek-first { background-position: -80px -160px; }
240
+ .ui-icon-stop { background-position: -96px -160px; }
241
+ .ui-icon-eject { background-position: -112px -160px; }
242
+ .ui-icon-volume-off { background-position: -128px -160px; }
243
+ .ui-icon-volume-on { background-position: -144px -160px; }
244
+ .ui-icon-power { background-position: 0 -176px; }
245
+ .ui-icon-signal-diag { background-position: -16px -176px; }
246
+ .ui-icon-signal { background-position: -32px -176px; }
247
+ .ui-icon-battery-0 { background-position: -48px -176px; }
248
+ .ui-icon-battery-1 { background-position: -64px -176px; }
249
+ .ui-icon-battery-2 { background-position: -80px -176px; }
250
+ .ui-icon-battery-3 { background-position: -96px -176px; }
251
+ .ui-icon-circle-plus { background-position: 0 -192px; }
252
+ .ui-icon-circle-minus { background-position: -16px -192px; }
253
+ .ui-icon-circle-close { background-position: -32px -192px; }
254
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
255
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
256
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
257
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
258
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
259
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
260
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
261
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
262
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
263
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
264
+ .ui-icon-circle-check { background-position: -208px -192px; }
265
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
266
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
267
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
268
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
269
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
270
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
271
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
272
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
273
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
274
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
275
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
276
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
277
+
278
+
279
+ /* Misc visuals
280
+ ----------------------------------*/
281
+
282
+ /* Corner radius */
283
+ .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
284
+ .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
285
+ .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
286
+ .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
287
+ .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
288
+ .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
289
+ .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
290
+ .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
291
+ .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
292
+
293
+ /* Overlays */
294
+ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
295
+ .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
296
+ * jQuery UI Resizable @VERSION
297
+ *
298
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
299
+ * Dual licensed under the MIT or GPL Version 2 licenses.
300
+ * http://jquery.org/license
301
+ *
302
+ * http://docs.jquery.com/UI/Resizable#theming
303
+ */
304
+ .ui-resizable { position: relative;}
305
+ .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
306
+ .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
307
+ .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
308
+ .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
309
+ .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
310
+ .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
311
+ .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
312
+ .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
313
+ .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
314
+ .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
315
+ * jQuery UI Selectable @VERSION
316
+ *
317
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
318
+ * Dual licensed under the MIT or GPL Version 2 licenses.
319
+ * http://jquery.org/license
320
+ *
321
+ * http://docs.jquery.com/UI/Selectable#theming
322
+ */
323
+ .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
324
+ /*
325
+ * jQuery UI Accordion @VERSION
326
+ *
327
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
328
+ * Dual licensed under the MIT or GPL Version 2 licenses.
329
+ * http://jquery.org/license
330
+ *
331
+ * http://docs.jquery.com/UI/Accordion#theming
332
+ */
333
+ /* IE/Win - Fix animation bug - #4615 */
334
+ .ui-accordion { width: 100%; }
335
+ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
336
+ .ui-accordion .ui-accordion-li-fix { display: inline; }
337
+ .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
338
+ .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
339
+ .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
340
+ .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
341
+ .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
342
+ .ui-accordion .ui-accordion-content-active { display: block; }/*
343
+ * jQuery UI Autocomplete @VERSION
344
+ *
345
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
346
+ * Dual licensed under the MIT or GPL Version 2 licenses.
347
+ * http://jquery.org/license
348
+ *
349
+ * http://docs.jquery.com/UI/Autocomplete#theming
350
+ */
351
+ .ui-autocomplete { position: absolute; cursor: default; }
352
+
353
+ /* workarounds */
354
+ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
355
+
356
+ /*
357
+ * jQuery UI Menu @VERSION
358
+ *
359
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
360
+ * Dual licensed under the MIT or GPL Version 2 licenses.
361
+ * http://jquery.org/license
362
+ *
363
+ * http://docs.jquery.com/UI/Menu#theming
364
+ */
365
+ .ui-menu {
366
+ list-style:none;
367
+ padding: 2px;
368
+ margin: 0;
369
+ display:block;
370
+ float: left;
371
+ }
372
+ .ui-menu .ui-menu {
373
+ margin-top: -3px;
374
+ }
375
+ .ui-menu .ui-menu-item {
376
+ margin:0;
377
+ padding: 0;
378
+ zoom: 1;
379
+ float: left;
380
+ clear: left;
381
+ width: 100%;
382
+ }
383
+ .ui-menu .ui-menu-item a {
384
+ text-decoration:none;
385
+ display:block;
386
+ padding:.2em .4em;
387
+ line-height:1.5;
388
+ zoom:1;
389
+ }
390
+ .ui-menu .ui-menu-item a.ui-state-hover,
391
+ .ui-menu .ui-menu-item a.ui-state-active {
392
+ font-weight: normal;
393
+ margin: -1px;
394
+ }
395
+ /*
396
+ * jQuery UI Button @VERSION
397
+ *
398
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
399
+ * Dual licensed under the MIT or GPL Version 2 licenses.
400
+ * http://jquery.org/license
401
+ *
402
+ * http://docs.jquery.com/UI/Button#theming
403
+ */
404
+ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
405
+ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
406
+ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
407
+ .ui-button-icons-only { width: 3.4em; }
408
+ button.ui-button-icons-only { width: 3.7em; }
409
+
410
+ /*button text element */
411
+ .ui-button .ui-button-text { display: block; line-height: 1.4; }
412
+ .ui-button-text-only .ui-button-text { padding: .4em 1em; }
413
+ .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
414
+ .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
415
+ .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
416
+ .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
417
+ /* no icon support for input elements, provide padding by default */
418
+ input.ui-button { padding: .4em 1em; }
419
+
420
+ /*button icon element(s) */
421
+ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
422
+ .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
423
+ .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
424
+ .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
425
+ .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
426
+
427
+ /*button sets*/
428
+ .ui-buttonset { margin-right: 7px; }
429
+ .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
430
+
431
+ /* workarounds */
432
+ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
433
+ /*
434
+ * jQuery UI Dialog @VERSION
435
+ *
436
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
437
+ * Dual licensed under the MIT or GPL Version 2 licenses.
438
+ * http://jquery.org/license
439
+ *
440
+ * http://docs.jquery.com/UI/Dialog#theming
441
+ */
442
+ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
443
+ .ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
444
+ .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
445
+ .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
446
+ .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
447
+ .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
448
+ .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
449
+ .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
450
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
451
+ .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
452
+ .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
453
+ .ui-draggable .ui-dialog-titlebar { cursor: move; }
454
+ /*
455
+ * jQuery UI Slider @VERSION
456
+ *
457
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
458
+ * Dual licensed under the MIT or GPL Version 2 licenses.
459
+ * http://jquery.org/license
460
+ *
461
+ * http://docs.jquery.com/UI/Slider#theming
462
+ */
463
+ .ui-slider { position: relative; text-align: left; }
464
+ .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
465
+ .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
466
+
467
+ .ui-slider-horizontal { height: .8em; }
468
+ .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
469
+ .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
470
+ .ui-slider-horizontal .ui-slider-range-min { left: 0; }
471
+ .ui-slider-horizontal .ui-slider-range-max { right: 0; }
472
+
473
+ .ui-slider-vertical { width: .8em; height: 100px; }
474
+ .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
475
+ .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
476
+ .ui-slider-vertical .ui-slider-range-min { bottom: 0; }
477
+ .ui-slider-vertical .ui-slider-range-max { top: 0; }/*
478
+ * jQuery UI Tabs @VERSION
479
+ *
480
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
481
+ * Dual licensed under the MIT or GPL Version 2 licenses.
482
+ * http://jquery.org/license
483
+ *
484
+ * http://docs.jquery.com/UI/Tabs#theming
485
+ */
486
+ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
487
+ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
488
+ .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
489
+ .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
490
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
491
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
492
+ .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
493
+ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
494
+ .ui-tabs .ui-tabs-hide { display: none !important; }
495
+ /*
496
+ * jQuery UI Datepicker @VERSION
497
+ *
498
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
499
+ * Dual licensed under the MIT or GPL Version 2 licenses.
500
+ * http://jquery.org/license
501
+ *
502
+ * http://docs.jquery.com/UI/Datepicker#theming
503
+ */
504
+ .ui-datepicker { width: 17em; padding: .2em .2em 0; }
505
+ .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
506
+ .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
507
+ .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
508
+ .ui-datepicker .ui-datepicker-prev { left:2px; }
509
+ .ui-datepicker .ui-datepicker-next { right:2px; }
510
+ .ui-datepicker .ui-datepicker-prev-hover { left:1px; }
511
+ .ui-datepicker .ui-datepicker-next-hover { right:1px; }
512
+ .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
513
+ .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
514
+ .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
515
+ .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
516
+ .ui-datepicker select.ui-datepicker-month,
517
+ .ui-datepicker select.ui-datepicker-year { width: 49%;}
518
+ .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
519
+ .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
520
+ .ui-datepicker td { border: 0; padding: 1px; }
521
+ .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
522
+ .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
523
+ .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
524
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
525
+
526
+ /* with multiple calendars */
527
+ .ui-datepicker.ui-datepicker-multi { width:auto; }
528
+ .ui-datepicker-multi .ui-datepicker-group { float:left; }
529
+ .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
530
+ .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
531
+ .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
532
+ .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
533
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
534
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
535
+ .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
536
+ .ui-datepicker-row-break { clear:both; width:100%; }
537
+
538
+ /* RTL support */
539
+ .ui-datepicker-rtl { direction: rtl; }
540
+ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
541
+ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
542
+ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
543
+ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
544
+ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
545
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
546
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
547
+ .ui-datepicker-rtl .ui-datepicker-group { float:right; }
548
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
549
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
550
+
551
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
552
+ .ui-datepicker-cover {
553
+ display: none; /*sorry for IE5*/
554
+ display/**/: block; /*sorry for IE5*/
555
+ position: absolute; /*must have*/
556
+ z-index: -1; /*must have*/
557
+ filter: mask(); /*must have*/
558
+ top: -4px; /*must have*/
559
+ left: -4px; /*must have*/
560
+ width: 200px; /*must have*/
561
+ height: 200px; /*must have*/
562
+ }/*
563
+ * jQuery UI Progressbar @VERSION
564
+ *
565
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
566
+ * Dual licensed under the MIT or GPL Version 2 licenses.
567
+ * http://jquery.org/license
568
+ *
569
+ * http://docs.jquery.com/UI/Progressbar#theming
570
+ */
571
+ .ui-progressbar { height:2em; text-align: left; }
572
+ .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }