clarity 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,6 +17,13 @@ We wrote Clarity to allow our support staff to use a simple interface to look
17
17
  through the various log files in our server farm. The application was such a
18
18
  big success internally that we decided to release it as open source.
19
19
 
20
+ == SECURITY:
21
+
22
+ *Warning*: Clarity takes parameters from URLs and runs them in the shell.
23
+ This is essentially the most insecure thing imaginable. You have to make absolutley sure
24
+ that clarity isn't reachable by the outside world. At the very least use --username and
25
+ --password to put some protection on it.
26
+
20
27
  == USAGE:
21
28
 
22
29
  clarity --username=admin --password=secret --port=8989 /var/log
data/Rakefile CHANGED
@@ -13,7 +13,7 @@ $hoe = Hoe.spec 'clarity' do
13
13
  self.developer 'Tobias Lütke', 'tobi@shopify.com'
14
14
  self.developer 'John Tajima', 'john@shopify.com'
15
15
  self.summary = 'Web interface for grep and tail -f'
16
- #self.post_install_message = 'PostInstall.txt'
16
+ self.post_install_message = 'PostInstall.txt'
17
17
  self.readme_file = 'README.rdoc'
18
18
  self.extra_deps = [['eventmachine','>= 0.12.10'], ['eventmachine_httpserver','>= 0.2.0'], ["json", ">= 1.0.0"]]
19
19
  self.test_globs = ['test/**/*_test.rb']
File without changes
@@ -1,5 +1,10 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
2
 
3
+ begin
4
+ require File.join(File.dirname(__FILE__), *%w[.. vendor gems environment])
5
+ rescue LoadError
6
+ end
7
+
3
8
  require 'eventmachine'
4
9
  require 'evma_httpserver'
5
10
  require 'json'
@@ -11,7 +16,7 @@ require 'clarity/commands/tail_command_builder'
11
16
  require 'clarity/renderers/log_renderer'
12
17
 
13
18
  module Clarity
14
- VERSION = '0.9.7'
19
+ VERSION = '0.9.8'
15
20
 
16
21
  Templates = File.dirname(__FILE__) + '/../views'
17
22
  Public = File.dirname(__FILE__) + '/../public'
@@ -11,7 +11,8 @@ module Clarity
11
11
  :port => 8080,
12
12
  :address => "0.0.0.0",
13
13
  :user => nil,
14
- :group => nil
14
+ :group => nil,
15
+ :relative_root => nil
15
16
  }
16
17
 
17
18
  mandatory_options = %w( )
@@ -37,6 +38,10 @@ module Clarity
37
38
  options[:address] = opt
38
39
  end
39
40
 
41
+ opts.on( "-r", "--relative=ROOT", String, "Run under a relative root" ) do |opt|
42
+ options[:relative_root] = opt
43
+ end
44
+
40
45
  opts.on( "--include=MASK", String, "File mask of logs to add (default: **/*.log*)" ) do |opt|
41
46
  options[:log_files] ||= []
42
47
  options[:log_files] += opt
@@ -39,7 +39,8 @@ class GrepCommandBuilder
39
39
 
40
40
 
41
41
  def gzip_tools
42
- terms.empty? ? ['gzcat filename'] : ['zgrep options -e term filename'] + ['grep options -e term'] * (terms.size-1)
42
+ cat_tool = (ENV["PATH"].split(":").find{|d| File.exists?(File.join(d, "gzcat"))} ? "zcat" : "gzcat")
43
+ terms.empty? ? ["#{cat_tool} filename"] : ['zgrep options -e term filename'] + ['grep options -e term'] * (terms.size-1)
43
44
  end
44
45
 
45
46
  def bzip_tools
@@ -15,7 +15,7 @@ module Clarity
15
15
  include Clarity::BasicAuth
16
16
  include Clarity::ChunkHttp
17
17
 
18
- attr_accessor :required_username, :required_password
18
+ attr_accessor :required_username, :required_password, :relative_root
19
19
  attr_accessor :log_files
20
20
 
21
21
  def self.run(options)
@@ -26,6 +26,7 @@ module Clarity
26
26
  a.log_files = options[:log_files]
27
27
  a.required_username = options[:username]
28
28
  a.required_password = options[:password]
29
+ a.relative_root = options[:relative_root] || ""
29
30
  end
30
31
 
31
32
  STDERR.puts "Clarity #{Clarity::VERSION} starting up."
@@ -37,7 +38,14 @@ module Clarity
37
38
  end
38
39
 
39
40
  STDERR.puts " * Log mask(s): #{options[:log_files].join(', ')}"
41
+
42
+ if options[:username].nil? or options[:password].nil?
43
+ STDERR.puts " * WARNING: No username/password specified. This is VERY insecure."
44
+ end
45
+
40
46
  STDERR.puts
47
+
48
+
41
49
  end
42
50
  end
43
51
 
@@ -73,7 +81,7 @@ module Clarity
73
81
  end
74
82
 
75
83
  when '/test'
76
- response = init_chunk_response
84
+ response = respond_with_chunks
77
85
  EventMachine::add_periodic_timer(1) do
78
86
  response.chunk "Lorem ipsum dolor sit amet<br/>"
79
87
  response.send_chunks
@@ -1,5 +1,5 @@
1
1
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
2
- <title>Clarity ~ A Log Search Tool</title>
3
- <link rel="stylesheet" href="/stylesheets/app.css" type="text/css" media="screen">
2
+ <title>Clarity ~ A Log Search Tool<%= relative_root %></title>
3
+ <link rel="stylesheet" href="<%= relative_root %>/stylesheets/app.css" type="text/css" media="screen">
4
4
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
5
- <script src="/javascripts/app.js" type="text/javascript"></script>
5
+ <script src="<%= relative_root %>/javascripts/app.js" type="text/javascript"></script>
@@ -3,7 +3,7 @@
3
3
  <h1><a href="/">Clarity</a> <span class='small' style='color:#aaa'>Log Search Tool</span></h1>
4
4
  </div>
5
5
 
6
- <form id='search' method='get' action='/perform'>
6
+ <form id='search' method='get' action='<%= relative_root %>/perform'>
7
7
  <table class='actions'>
8
8
  <tr>
9
9
  <th>Action</th>
@@ -55,6 +55,7 @@
55
55
  </div>
56
56
 
57
57
  <script>
58
+ Search.url = "<%= relative_root %>" + Search.url;
58
59
  Search.init({ 'grep': <%= logfiles.map {|f| f }.to_json %>,
59
60
  'tail': <%= logfiles.map {|f| f if f =~ /log$/ }.compact.to_json %> },
60
61
  <%= params.empty? ? 'null' : params.to_json %> );
metadata CHANGED
@@ -1,37 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clarity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Tobias L\xC3\xBCtke"
8
8
  - John Tajima
9
9
  autorequire:
10
10
  bindir: bin
11
- cert_chain:
12
- - |
13
- -----BEGIN CERTIFICATE-----
14
- MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MQ0wCwYDVQQDDAR0b2Jp
15
- MRgwFgYKCZImiZPyLGQBGRYIbGVldHNvZnQxEzARBgoJkiaJk/IsZAEZFgNjb20w
16
- HhcNMDkwNjA4MDAyMjE2WhcNMTAwNjA4MDAyMjE2WjA+MQ0wCwYDVQQDDAR0b2Jp
17
- MRgwFgYKCZImiZPyLGQBGRYIbGVldHNvZnQxEzARBgoJkiaJk/IsZAEZFgNjb20w
18
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9eY669CSPwqcWqdZR28wy
19
- LE6lF1RRS9KX2MEwiQML81UiY/yXz53Z082ISzUEcfzMUfVBwBO7y3NJF2th1/zt
20
- MoEl24Me7ToU1wYfH0TOO6+gT++FmQyaGSuXWgXxEXyvnOP3k2wJ3IIgHvF8AUyW
21
- i8GKFJKDmV/crocqOKu0A82Ugz0QGJbH+3gRk/BG926VffQUwQhcMV3c8+IWh/Ye
22
- mx5mc1Wtykj945+G3XuCQFHcOUi4JKfDp5i/tce39ePNiXk74sn7X04O8aPrYRju
23
- TPJC7yuwM1vOiR2yKutB+cjIG8srZiKN5IgqyECviHIpAOy7nDK5L5CexOYWEFxj
24
- AgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQkWqDl
25
- Oe9BDb/KLIhD4wMtnv8zkDANBgkqhkiG9w0BAQUFAAOCAQEAA6xfeq0PIZtUoz5i
26
- Kr2bYQqgongNY/Mw4NMWN7cYYmIh1BUjWDnuOVffC3w3vnsUGOUUPeeBtQye4Dyy
27
- zleZjlzOiOA4vFOnItldoElAo+gc5xoEmiE/P8AnCaIHEdgroeW+bZj3U3ReY7iu
28
- z6rSwN5jLOnP2BmCdP/AgbAV3rW7hhgaz6nGx7O4hehQ/F1SbYhl115B6RpYF+tN
29
- p9h9ap2kONwGQwBlo6oGQmuatzbfiVQRxhDj7JzyNaYQM4DR0+4vbu59vYFVSFHf
30
- oz7Ippbls3jwI136whTuoiGZi/LDBc1Hw6iw99GGDR0vDGCLmPHyiJLfD6TbzzNo
31
- oB0pMQ==
32
- -----END CERTIFICATE-----
11
+ cert_chain: []
33
12
 
34
- date: 2009-12-05 00:00:00 -05:00
13
+ date: 2009-12-21 00:00:00 -05:00
35
14
  default_executable:
36
15
  dependencies:
37
16
  - !ruby/object:Gem::Dependency
@@ -133,7 +112,7 @@ has_rdoc: true
133
112
  homepage: http://github.com/tobi/clarity
134
113
  licenses: []
135
114
 
136
- post_install_message:
115
+ post_install_message: PostInstall.txt
137
116
  rdoc_options:
138
117
  - --main
139
118
  - README.rdoc
data.tar.gz.sig DELETED
Binary file
metadata.gz.sig DELETED
@@ -1 +0,0 @@
1
- �#�3��koh���P k0�����u�*ضC�8E��o�tLZJҩ%PՌBh]׋��C��|8�a�/�LA0�t��\���ơ�HBR~�����Ii֖4#P�t��hw��';�:���Q��ͭz�n�9��jn��\��k��؂3��:7��&/ޛ 䤆�ވ?d�np��07�F C��;�<���h��Vٟ����Yq��|�vC�<#9��T�\j�����N�����G<��.eCaN�o�ޏ