tailog 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 416d865f7f5f53cb6df3b7b7ebca932defe1fdf2
4
- data.tar.gz: 7351b02573c0371d02f2d0fe87500e51ca9f4f10
3
+ metadata.gz: c991598a6429b679173bc6cbbc0ca3ebc715cc1a
4
+ data.tar.gz: 4fdacb9590e666904a46bd87eda40a6e10023ca5
5
5
  SHA512:
6
- metadata.gz: 44327da397ae3ad9df7b8698832df1702b48f89364a9297409ef1132876fcea875700c9aeceab1a0fcbf644b7afe2d7a664fb99a993fc443a6a85264d468bcc5
7
- data.tar.gz: e2a43294cc467fb187a57729134ed45eae92d7cf7255539dab12ed09cd88ca87e1558f42c7330aeb45d5fe5f9da6c2c30c99f63ceaaa21c8ee7ae90b37331de3
6
+ metadata.gz: 505f2991c831834238d6706d144a0cdef0ebcf4e5aee40fa7114ae33ce3af366963cb15c0baa1ab73eee6608873b38e32c700f4418010ed3a70fd3524d97c0cd
7
+ data.tar.gz: 0ab82aeda9b8222c09323590365382edc11a83937c7a86453e09f046ad7188277c80f76380a7e011ab58fcd50a90ffe44ba0792dbf554f8e3c2a3b142095b0fd
data/app/views/env.erb CHANGED
@@ -1,4 +1,4 @@
1
- <dl class="dl-horizontal">
1
+ <dl class="dl-horizontal dl-hover">
2
2
  <% ENV.each do |key, value| %>
3
3
  <dt><%= key %></dt>
4
4
  <dd><%= value %></dd>
data/app/views/layout.erb CHANGED
@@ -3,6 +3,7 @@
3
3
  <head>
4
4
  <title>TAILOG</title>
5
5
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
6
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/3.51/jquery.form.js"></script>
6
7
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css">
7
8
  <style type="text/css">
8
9
  body {
@@ -16,12 +17,26 @@
16
17
  margin: 0;
17
18
  }
18
19
 
19
- p:hover {
20
+ .content-hover p:hover {
20
21
  background: #EEE;
21
22
  }
22
23
 
23
- a {
24
- display: block;
24
+ .dl-horizontal dt {
25
+ width: 320px;
26
+ padding-right: 20px;
27
+ }
28
+
29
+ .dl-horizontal dd {
30
+ margin-left: 320px;
31
+ }
32
+
33
+ .dl-hover dt:hover + dd, .dl-hover dd:hover {
34
+ background: #EEE;
35
+ }
36
+
37
+ .script select.form-control {
38
+ display: inline-block;
39
+ width: 100px;
25
40
  }
26
41
  </style>
27
42
  </head>
@@ -40,16 +55,9 @@
40
55
  <ul class="nav navbar-nav">
41
56
  <li<%= ' class="active"' if path_info == "/logs" %>><a href="logs">Logs</a></li>
42
57
  <li<%= ' class="active"' if path_info == "/env" %>><a href="env">Env</a></li>
58
+ <li<%= ' class="active"' if path_info == "/script" %>><a href="script">Script</a></li>
43
59
  </ul>
44
60
  <ul class="nav navbar-nav navbar-right">
45
- <form class="navbar-form navbar-left" method="get">
46
- <div class="input-group">
47
- <input name="file" type="text" class="form-control" placeholder="<%= params[:file] || 'File Name...' %>">
48
- <span class="input-group-btn">
49
- <button class="btn btn-default" type="button">Go!</button>
50
- </span>
51
- </div>
52
- </form>
53
61
  </ul>
54
62
  </div><!--/.nav-collapse -->
55
63
  </div><!--/.container-fluid -->
@@ -7,7 +7,7 @@
7
7
  <h3 class="page-header"><%= file_path %></h3>
8
8
 
9
9
  <% File.open file_path do |file| %>
10
- <div id="content"></div>
10
+ <div id="content" class="content-hover"></div>
11
11
  <% end %>
12
12
 
13
13
  <script type="text/javascript">
@@ -30,7 +30,7 @@
30
30
  if (!data.content) return;
31
31
  var shouldScrollToBottom = $window.scrollTop() + $window.height() == $document.height();
32
32
  $content
33
- .append('<p class="text-info">' + data.server_uuid + '</p>')
33
+ .append('<span class="text-info">' + data.server_uuid + '</span>')
34
34
  .append(data.content);
35
35
 
36
36
  if (shouldScrollToBottom) {
@@ -50,7 +50,7 @@
50
50
  <% else %>
51
51
  <% Dir[File.join Tailog.log_path, '**/*.log'].each do |file| %>
52
52
  <% relative_file = Pathname.new(file).relative_path_from(Pathname.new(Tailog.log_path)) %>
53
- <a href="?file=<%= relative_file %>"><%= file %></a>
53
+ <p><a href="?file=<%= relative_file %>"><%= file %></a></p>
54
54
  <% end %>
55
55
  <% end %>
56
56
 
@@ -0,0 +1,23 @@
1
+ <% begin %>
2
+ <% Open3.popen3("bash -x -e") do |stdin, stdout, stderr, wait_thr| %>
3
+ <% output = [] %>
4
+ <% Thread.new do until (line = stdout.gets).nil? do output << [ :stdout, line ] end end %>
5
+ <% Thread.new do until (line = stderr.gets).nil? do output << [ :stderr, line ] end end %>
6
+
7
+ <% stdin.puts script %>
8
+ <% stdin.puts "exit" %>
9
+ <% wait_thr.join %>
10
+
11
+ <% output.each do |key, line| %>
12
+ <% if key == :stdout %>
13
+ <p><%= h line %></p>
14
+ <% elsif line =~ /^\+ (.*)/ %>
15
+ <p class="text-info">$ <%= h $1 %></p>
16
+ <% else %>
17
+ <p class="text-danger"><%= h line %></p>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
21
+ <% rescue => error %>
22
+ <%= erb :error, locals: { error: error }, layout: false %>
23
+ <% end %>
@@ -0,0 +1,29 @@
1
+ <form id="script" class="clearfix script" method="post">
2
+ <div class="form-group">
3
+ <textarea name="script" class="form-control" placeholder="Your Script..." rows="8"></textarea>
4
+ </div>
5
+ <div class="pull-right">
6
+ <select name="type" class="form-control">
7
+ <option value="ruby">Ruby</option>
8
+ <option value="bash">Bash</option>
9
+ </select>
10
+ <button type="submit" class="btn btn-primary">Submit</button>
11
+ </div>
12
+ </form>
13
+
14
+ <div id="content"></div>
15
+
16
+ <script type="text/javascript">
17
+ var $content = $("#content");
18
+
19
+ $('#script').ajaxForm(function(json) {
20
+ try {
21
+ var data = JSON.parse(json);
22
+ $content
23
+ .html('<hr>')
24
+ .append(data.content);
25
+ } catch (error) {
26
+ console.log(error)
27
+ }
28
+ });
29
+ </script>
@@ -0,0 +1,16 @@
1
+ <% begin %>
2
+ <% b = binding %>
3
+ <% script.each_line do |line| %>
4
+ <% next if line.strip.empty? %>
5
+ <p class="text-info">&gt; <%= h line %></p>
6
+ <% begin %>
7
+ <% result = b.eval(line).inspect %>
8
+ <p>=> <%= h result %></p>
9
+ <% rescue => error %>
10
+ <p class="text-danger"><%= h error.class %>: <%= h error.message %></p>
11
+ <% break %>
12
+ <% end %>
13
+ <% end %>
14
+ <% rescue => error %>
15
+ <%= erb :error, locals: { error: error }, layout: false %>
16
+ <% end %>
@@ -1,3 +1,3 @@
1
1
  module Tailog
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,63 @@
1
+ require 'active_support/core_ext/string'
2
+ require 'logger'
3
+
4
+ module Tailog
5
+ module WatchMethods
6
+ def self.logger
7
+ @logger ||= Logger.new(File.join Tailog.log_path, "watch_methods.log")
8
+ end
9
+
10
+ def inject_methods targets
11
+ targets.each do |target|
12
+ if target.include? "#"
13
+ inject_instance_method target
14
+ else
15
+ inject_class_method target
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def inject_class_method target
23
+ klass, _, method = if target.include? "."
24
+ target.rpartition(".")
25
+ else
26
+ target.rpartition("::")
27
+ end
28
+ klass.constantize.class_eval <<-EOS, __FILE__, __LINE__
29
+ class << self
30
+ #{build_watch_method target, method}
31
+ end
32
+ EOS
33
+ rescue => error
34
+ WatchMethods.logger.error "Inject class method `#{target}' failed: #{error.class}: #{error.message}"
35
+ end
36
+
37
+ def inject_instance_method target
38
+ klass, _, method = target.rpartition("#")
39
+ klass.constantize.class_eval <<-EOS, __FILE__, __LINE__
40
+ #{build_watch_method target, method}
41
+ EOS
42
+ rescue => error
43
+ WatchMethods.logger.error "Inject instance method `#{target}' failed: #{error.class}: #{error.message}"
44
+ end
45
+
46
+ def build_watch_method target, method
47
+ raw_method = "watch_method_raw_#{method}"
48
+ return <<-EOS
49
+ alias_method :#{raw_method}, :#{method}
50
+ def #{method} *args
51
+ Tailog::WatchMethods.logger.info "Method called: #{target} with \#{args}"
52
+ start = Time.now
53
+ result = send :#{raw_method}, *args
54
+ Tailog::WatchMethods.logger.info "Method finished: #{target} with \#{result} in \#{(Time.now - start) * 1000} ms"
55
+ result
56
+ rescue => error
57
+ Tailog::WatchMethods.logger.error "Method failed: #{target} raises \#{error.class}: \#{error.message}\\n\#{error.backtrace.join("\\n")}"
58
+ raise error
59
+ end
60
+ EOS
61
+ end
62
+ end
63
+ end
data/lib/tailog.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  require 'tailog/version'
2
+ require 'tailog/watch_methods'
3
+ require 'tailog/ext/file'
4
+
2
5
  require 'sinatra/base'
3
6
  require 'active_support/configurable'
4
- require 'tailog/ext/file'
7
+
5
8
  require 'securerandom'
9
+ require 'open3'
6
10
  require 'json'
7
11
 
8
12
  module Tailog
9
13
  include ActiveSupport::Configurable
14
+ extend Tailog::WatchMethods
10
15
 
11
16
  config_accessor :log_path do
12
17
  File.expand_path("log", Dir.pwd)
@@ -62,5 +67,17 @@ module Tailog
62
67
  get '/env' do
63
68
  erb :env
64
69
  end
70
+
71
+ get '/script' do
72
+ erb :'script/index'
73
+ end
74
+
75
+ post '/script' do
76
+ content = erb :"script/#{params[:type]}", locals: { script: params[:script] }, layout: false
77
+
78
+ {
79
+ content: content
80
+ }.to_json
81
+ end
65
82
  end
66
83
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tailog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bbtfr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-20 00:00:00.000000000 Z
11
+ date: 2016-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -55,11 +55,15 @@ files:
55
55
  - app/views/layout.erb
56
56
  - app/views/logs/index.erb
57
57
  - app/views/logs/list.erb
58
+ - app/views/script/bash.erb
59
+ - app/views/script/index.erb
60
+ - app/views/script/ruby.erb
58
61
  - bin/console
59
62
  - bin/setup
60
63
  - lib/tailog.rb
61
64
  - lib/tailog/ext/file.rb
62
65
  - lib/tailog/version.rb
66
+ - lib/tailog/watch_methods.rb
63
67
  - tailog.gemspec
64
68
  homepage: https://github.com/bbtfr/tailog
65
69
  licenses: []