gltail 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig ADDED
@@ -0,0 +1 @@
1
+ Y�3L��z�#���� 6�2z�V6a�\��8�i�U, ֩��WE�_��{o�a~4!�Ĵ��B�L�{|�O�M�K�0��?Z �l5�H�h��f����M�����p��k�/��� ҌYG��n��2�� �׶k�n~+dφj��^PP�
data/History.txt CHANGED
@@ -1,4 +1,11 @@
1
- == 0.0.7 / 2007-10-..
1
+ == 0.1.0 / 2008-02-??
2
+
3
+ * Only sort needed Elements when needed
4
+ * Keep Element List mostly sorted
5
+ * Show Events from Elements not shown on screen
6
+ * Show bars representing rate behind the element texts
7
+
8
+ == 0.0.7 / 2007-10-27
2
9
 
3
10
  * Make textures from BitmapCharacter font
4
11
  * Use textured quads instead of BitmapCharacter
data/lib/gl_tail.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  #
6
6
 
7
7
  module GlTail
8
- VERSION = '0.0.7'
8
+ VERSION = '0.1.0'
9
9
  end
10
10
 
11
11
  begin
@@ -11,14 +11,15 @@ class Activity
11
11
  def initialize(message, x, y, z, color, size, type = 0)
12
12
  @message = message
13
13
  @x, @y, @z = x, y, z
14
- @xi, @yi, @zi = 0.012 + (rand(100)/100.0 ) * 0.0012 , 0.002 + (rand(1000)/1000.0 ) * 0.002, 0
15
- # @xi, @yi, @zi = 0.015 , 0.0025, 0
14
+ # @xi, @yi, @zi = 0.012 + (rand(100)/100.0 ) * 0.0012 , 0.002 + (rand(1000)/1000.0 ) * 0.002, 0
15
+ @xi, @yi, @zi = 0.006 , 0.0013, 0
16
16
 
17
17
  if @x >= 0.0
18
18
  @xi = -@xi
19
19
  end
20
20
 
21
- @xi = (rand(100)/100.0 * 0.02) - 0.01 if type == 2
21
+ @xi = (rand(100)/100.0 * 0.002) - 0.001 if type == 2
22
+ @yi = (rand(100)/100.0 * 0.002) - 0.001 if type == 2
22
23
 
23
24
  @color = color
24
25
  @size = size
@@ -30,14 +31,14 @@ class Activity
30
31
  def render(engine)
31
32
  if @type != 5
32
33
  if engine.screen.wanted_fps == 0
33
- @x += @xi/2
34
- @y += @yi/2
35
- @yi = @yi - 0.0005/2
34
+ @x += @xi
35
+ @y += @yi
36
+ @yi = @yi - 0.00008
36
37
  else
37
38
  @fps_mod ||= (60.0 / engine.screen.wanted_fps)
38
- @x += (@xi/2) * @fps_mod
39
- @y += (@yi/2) * @fps_mod
40
- @yi = @yi - (0.0005/2) * @fps_mod
39
+ @x += @xi * @fps_mod
40
+ @y += @yi * @fps_mod
41
+ @yi = @yi - 0.00008 * @fps_mod
41
42
  end
42
43
 
43
44
  # @yi = @yi * 1.01
@@ -98,14 +99,10 @@ class Activity
98
99
 
99
100
  list = glGenLists(1)
100
101
  glNewList(list, GL_COMPILE)
101
-
102
+
102
103
  tmp = 10 + 10 * ((@size-engine.screen.min_blob_size)/engine.screen.max_blob_size)
103
- if not tmp
104
- puts "THIS KEEPS CRASHING FOR ME WITH tmp == NaN -- cant figure out why"
105
- tmp = 2
106
- end
107
-
108
104
  glutSolidSphere(@size, tmp, 2)
105
+
109
106
  glEndList()
110
107
  BlobStore.put(@size,list)
111
108
  end
data/lib/gl_tail/block.rb CHANGED
@@ -12,10 +12,12 @@ class Block
12
12
  config_attribute :color, "FIXME: add description", :type => :color
13
13
  config_attribute :order, "FIXME"
14
14
  config_attribute :size, "FIXME"
15
- config_attribute :auto_clean
15
+ config_attribute :auto_clean, "FIXME"
16
+ config_attribute :activity_type, "FIXME"
16
17
 
17
18
  attr_accessor :column
18
- attr_reader :config
19
+ attr_reader :config
20
+ attr_reader :max_rate
19
21
 
20
22
  def initialize(config, name)
21
23
  @config = config
@@ -23,16 +25,19 @@ class Block
23
25
 
24
26
  @size = 10
25
27
  @auto_clean = true
28
+ @activity_type = "blobs"
26
29
  @order = 100
27
- # @color = [1.0, 1.0, 1.0, 1.0]
28
30
 
29
31
  @show = 0
30
32
 
31
- @header = Element.new(self, @name.upcase)
32
- @header.color = [1.0, 1.0, 1.0, 1.0]
33
+ @header = Element.new(self, @name.upcase, [1.0, 1.0, 1.0, 1.0])
33
34
 
34
35
  @elements = { }
35
36
  @bottom_position = -@config.screen.top
37
+ @max_rate = 1.0/599
38
+
39
+ @sorted = []
40
+ @updated = false
36
41
  end
37
42
 
38
43
  def show=(value)
@@ -72,59 +77,122 @@ class Block
72
77
  end
73
78
 
74
79
  def render(engine, num)
75
- return num if @elements.size == 0
80
+ return num if @elements.size == 0 || @sorted.size == 0
76
81
 
77
82
  @header.wy = top - (num * line_size)
78
83
  # @header.y = @header.wy if @header.y == -$CONFIG.top
79
84
  @header.render(engine)
80
85
  num += 1
81
86
 
82
- sorted = case @show
83
- when 0: @elements.values.sort { |k,v| v.rate <=> k.rate}[0..@size-1]
84
- when 1: @elements.values.sort { |k,v| v.total <=> k.total}[0..@size-1]
85
- when 2: @elements.values.sort { |k,v| v.average <=> k.average}[0..@size-1]
86
- end
87
+ count = 0
87
88
 
88
- sorted.each do |e|
89
- e.wy = top - (num * line_size)
90
- e.render(engine)
89
+ @sorted.each do |e|
91
90
  engine.stats[0] += 1
92
- if e.rate <= 0.0001 && e.active && e.updates > 59 && @auto_clean
93
- @elements.delete(e.name)
91
+ if count < @size
92
+ e.wy = top - (num * line_size)
93
+ e.render(engine)
94
+ num += 1
95
+ @max_rate = e.rate if e.rate > @max_rate
96
+ else
97
+ e.render_events(engine)
94
98
  end
95
- num += 1
96
- end
97
99
 
98
- (@elements.values - sorted).each do |e|
99
- engine.stats[0] += 1
100
- e.activities.each do |a|
101
- a.render(engine)
102
- if a.x > 1.0 || a.x < -1.0 || a.y > @config.screen.aspect
103
- e.activities.delete a
104
- end
105
- end
106
- if e.activities.size == 0 && @auto_clean && e.updates > 59
100
+ if e.activities.size == 0 && (e.rate <= 0.001 || count > 100) && @auto_clean
107
101
  @elements.delete(e.name)
102
+ @sorted.delete(e)
108
103
  end
104
+ count += 1
109
105
  end
110
- @elements.delete_if { |k,v| (!sorted.include? v) && v.active && v.activities.size == 0 && v.updates > 29} if @auto_clean
111
- @bottom_position = top - ((sorted.size > 0 ? (num-1) : num) * line_size)
106
+
107
+ @bottom_position = top - ((@sorted.size > 0 ? (num-1) : num) * line_size)
112
108
  num + 1
113
109
  end
114
110
 
115
111
  def add_activity(options = { })
116
- x = @elements[options[:name]] ||= Element.new(self, options[:name])
117
- x.add_activity(options[:message], @color || options[:color] , options[:size] || 0.01, options[:type] || 0 )
112
+ return unless options[:name]
113
+ x = nil
114
+ unless @elements[options[:name]]
115
+ x = Element.new(self, options[:name], @color || options[:color] )
116
+ @elements[options[:name]] = x
117
+ if @sorted.size > @size
118
+ @sorted.insert(@size,x)
119
+ else
120
+ @sorted << x
121
+ end
122
+ else
123
+ x = @elements[options[:name]]
124
+ end
125
+ x.add_activity(options[:message], @color || options[:color], options[:size] || 0.01, options[:type] || 0 )
126
+ @updated = true
118
127
  end
119
128
 
120
129
  def add_event(options = { })
121
- x = @elements[options[:name]] ||= Element.new(self, options[:name])
130
+ return unless options[:name]
131
+ x = nil
132
+ unless @elements[options[:name]]
133
+ x = Element.new(self, options[:name], @color || options[:color] )
134
+ @elements[options[:name]] = x
135
+ if @sorted.size > @size
136
+ @sorted.insert(@size,x)
137
+ else
138
+ @sorted << x
139
+ end
140
+ else
141
+ x = @elements[options[:name]]
142
+ end
143
+
122
144
  x.add_event(options[:message], options[:color] || @color, options[:update_stats] || false)
145
+ @updated = true
123
146
  end
124
147
 
125
148
  def update
126
- @elements.each_value do |e|
127
- e.update
149
+ return if @sorted.size == 0
150
+
151
+ @max_rate = @max_rate * 0.9999
152
+
153
+ startTime = Time.now
154
+
155
+ i = 1
156
+ @ordered = [@sorted[0]]
157
+ min = @sorted[0].update
158
+ size = @sorted.size
159
+
160
+ while i < size
161
+ rate = @sorted[i].update
162
+ if rate > min
163
+ j = i - 1
164
+ while @ordered[j-1].rate < rate && j > 0
165
+ j -= 1
166
+ end
167
+ @ordered.insert(j, @sorted[i])
168
+ else
169
+ @ordered << @sorted[i]
170
+ min = rate if i < @size
171
+ end
172
+ i += 1
128
173
  end
174
+
175
+ @sorted = @ordered
176
+
177
+ # puts "#{@name} [#{@sorted.size}]: [#{Time.now - startTime}]" if @name == "urls"
178
+
179
+ return
180
+
181
+ return unless @updated
182
+
183
+ sortTime = Time.now
184
+ # iSort( @sorted )
185
+
186
+ # @sorted = case @show
187
+ # when 0: @sorted.insertionSort
188
+ # when 1: @sorted.sort! { |k,v| "#{sprintf('%05d',v.total)} #{v.rate}" <=> "#{sprintf('%05d',k.total)} #{k.rate}" }
189
+ # when 2: @sorted.sort! { |k,v| "#{v.average} #{v.name}" <=> "#{k.average} #{k.name}" }
190
+ # end
191
+
192
+ puts "#{@name} [#{@sorted.size}]: [#{sortTime - startTime}] [#{Time.now - sortTime}]"
193
+
194
+ @updated = false
195
+
129
196
  end
197
+
130
198
  end
@@ -8,9 +8,13 @@ class Element
8
8
  attr_accessor :wy, :y, :active, :average_size, :right, :color, :name
9
9
  attr_reader :rate, :messages, :activities, :queue, :updates, :average, :total
10
10
 
11
- def initialize(block, name, start_position = nil)
11
+ def initialize(block, name, color, start_position = nil)
12
12
  @block = block
13
13
 
14
+ if name.nil?
15
+ name = ''
16
+ end
17
+
14
18
  if name =~ /^\d+.\d+.\d+.\d+$/
15
19
  @name = Resolver.resolv(name, self)
16
20
  else
@@ -30,11 +34,20 @@ class Element
30
34
  @last_time = 0
31
35
  @step = 0, @updates = 0
32
36
  @active = false
37
+ @color = color
38
+ @type = (@block.activity_type == "blobs" ? :blobs : :bars)
39
+ @bar_color ||= @color.dup
40
+
33
41
  end
34
42
 
35
43
  def add_activity(message, color, size, type)
44
+ @bar_color[0] = @bar_color[0] + (@color[0] - @bar_color[0]) / 5
45
+ @bar_color[1] = @bar_color[1] + (@color[1] - @bar_color[1]) / 5
46
+ @bar_color[2] = @bar_color[2] + (@color[2] - @bar_color[2]) / 5
47
+
36
48
  @pending.push Item.new(message, size, color, type) if(type != 3)
37
49
  @messages += 1
50
+ @total += 1
38
51
  @sum += size
39
52
  @color = color
40
53
 
@@ -48,6 +61,7 @@ class Element
48
61
  @pending.push Item.new(message, 0.01, color, 2)
49
62
  if update_stats
50
63
  @messages += 1
64
+ @total += 1
51
65
  if @rate == 0
52
66
  @rate = 1.0 / 60
53
67
  @messages = 0
@@ -57,17 +71,16 @@ class Element
57
71
 
58
72
 
59
73
  def update
60
- @active = true if @total > 0
74
+ @rate = (@rate * 299.0 + @messages) / 300.0
61
75
  @updates += 1
62
- @rate = (@rate.to_f * 299 + @messages) / 300
63
76
  @messages = 0
64
- if @pending.size + @queue.size > 0
65
- @total += @pending.size
77
+ size = @pending.size
78
+ if size > 0
66
79
  @average = @sum / @total
67
80
 
68
- @step = 1.0 / (@queue.size + @pending.size) * 1000.0
69
- @queue = @queue + @pending
70
- if @queue.size == 1
81
+ @step = 1.0 / size * 1000.0
82
+ @queue = @pending
83
+ if size == 1
71
84
  @step = rand(1000) * 1.0
72
85
  end
73
86
  @pending = []
@@ -76,8 +89,36 @@ class Element
76
89
  end
77
90
  @last_time = glutGet(GLUT_ELAPSED_TIME)
78
91
  @last_time += @step if @queue.size == 1
79
- # @last_time -= @step if @queue.size != 1
92
+ @rate
93
+ end
94
+
95
+ def render_events(engine)
96
+ @color ||= [1.0, 1.0, 1.0, 1.0]
97
+
98
+ t = glutGet(GLUT_ELAPSED_TIME)
99
+ while( (@queue.size > 0) && (@last_time < t ) )
80
100
 
101
+ @last_time += @step
102
+ item = @queue.pop
103
+ url = item.message
104
+ color = item.color
105
+ size = item.size
106
+ type = item.type
107
+
108
+ if type == 2
109
+ @activities.push Activity.new(url, 0.0 - (0.008 * url.length), engine.screen.top, 0.0, color, size, type)
110
+ end
111
+ end
112
+
113
+ @activities.each do |a|
114
+ if a.x > 1.0 || a.x < -1.0 || a.y < -(engine.screen.aspect*1.5)
115
+ @activities.delete a
116
+ else
117
+ a.wy = @wy + 0.005 if(a.type == 5 && @wy != a.wy)
118
+ a.render(engine)
119
+ engine.stats[1] += 1
120
+ end
121
+ end
81
122
 
82
123
  end
83
124
 
@@ -116,9 +157,67 @@ class Element
116
157
  end
117
158
 
118
159
  glPushMatrix()
119
-
120
160
  glTranslate(@x, @y, @z)
121
161
 
162
+
163
+ if( rate > 0.0 )
164
+ glBegin(GL_QUADS)
165
+
166
+ if @x >= 0
167
+ y2 = 0.0
168
+ @x1 = 7*8.0 / (engine.screen.window_width / 2.0)
169
+ y1 = engine.screen.line_size * 0.9
170
+ x2 = @x1 + ((@block.width+1) * 8.0 / (engine.screen.window_width / 2.0) ) * (rate / @block.max_rate)
171
+
172
+ @x2 ||= @x1
173
+ d = (@x2 - x2)
174
+ if d.abs < 0.001
175
+ @x2 = x2
176
+ else
177
+ @x2 -= d / 40
178
+ end
179
+ glColor(@bar_color)
180
+ glVertex3f(@x1, y1, @z)
181
+ glColor(@bar_color)
182
+ glVertex3f(@x2, y1, @z)
183
+ glColor([0.0, 0.0, 0.0, 0.0])
184
+ glVertex3f(@x2, y2, @z)
185
+ glColor(@bar_color)
186
+ glVertex3f(@x1, y2, @z)
187
+
188
+ else
189
+ @x2 = (@block.width+1)*8.0 / (engine.screen.window_width / 2.0)
190
+ y2 = 0.0
191
+ y1 = engine.screen.line_size * 0.9
192
+ x1 = ((@block.width * 8.0) / (engine.screen.window_width / 2.0) ) * (1.0 - rate / @block.max_rate)
193
+
194
+ @x1 ||= @x2
195
+ d = (@x1 - x1)
196
+ if d.abs < 0.001
197
+ @x1 = x1
198
+ else
199
+ @x1 -= d / 20
200
+ end
201
+
202
+ glColor(@bar_color)
203
+ glVertex3f(@x1, y1, @z)
204
+ glColor(@bar_color)
205
+ glVertex3f(@x2, y1, @z)
206
+ glColor(@bar_color)
207
+ glVertex3f(@x2, y2, @z)
208
+ glColor([0.0, 0.0, 0.0, 0.0])
209
+ glVertex3f(@x1, y2, @z)
210
+
211
+ end
212
+
213
+
214
+ glEnd
215
+
216
+ end
217
+
218
+
219
+ # glTranslate(@x, @y, @z)
220
+
122
221
  glColor( (@queue.size > 0 ? (engine.screen.highlight_color || [1.0, 0.0, 0.0, 1.0]) : @color ) )
123
222
 
124
223
  case @block.show
@@ -144,10 +243,10 @@ class Element
144
243
  raise "unknown block type #{self.inspect}"
145
244
  end
146
245
 
147
- if @x < 0
246
+ if @x < 0
148
247
  str = sprintf("%#{@block.width}s %s", @name.length > @block.width ? @name[-@block.width..-1] : @name, txt)
149
248
  else
150
- str = sprintf("%s %s", txt, @name[0..@block.width-1])
249
+ str = sprintf("%s%s", txt, @name[0..@block.width-1])
151
250
  end
152
251
 
153
252
  engine.render_string(str)
@@ -165,7 +264,7 @@ class Element
165
264
  type = item.type
166
265
 
167
266
  if type == 2
168
- @activities.push Activity.new(url, 0.0 - (0.013 * url.length), engine.screen.top, 0.0, color, size, type)
267
+ @activities.push Activity.new(url, 0.0 - (0.008 * url.length), engine.screen.top, 0.0, color, size, type)
169
268
  elsif type == 5
170
269
  a = Activity.new(url, 0.0, engine.screen.top, 0.0, color, size, type)
171
270
  a.wx = @wx
@@ -190,5 +289,30 @@ class Element
190
289
  end
191
290
  end
192
291
 
292
+ @bar_color[0] = @bar_color[0] + (0.15 - @bar_color[0]) / 100
293
+ @bar_color[1] = @bar_color[1] + (0.15 - @bar_color[1]) / 100
294
+ @bar_color[2] = @bar_color[2] + (0.15 - @bar_color[2]) / 100
295
+
296
+ end
297
+
298
+ def <=>(b)
299
+ b.rate <=> self.rate
300
+ end
301
+
302
+ def > (b)
303
+ b.rate > self.rate
193
304
  end
305
+
306
+ def < (b)
307
+ b.rate < self.rate
308
+ end
309
+
310
+ def <= (b)
311
+ b.rate <= self.rate
312
+ end
313
+
314
+ def >= (b)
315
+ b.rate >= self.rate
316
+ end
317
+
194
318
  end
@@ -76,7 +76,7 @@ module GlTail
76
76
 
77
77
  @frames += 1
78
78
  t = glutGet(GLUT_ELAPSED_TIME)
79
- if t - @t0 >= 5000
79
+ if t - @t0 >= 10000
80
80
  seconds = (t - @t0) / 1000.0
81
81
  $FPS = @frames / seconds
82
82
  printf("%d frames in %6.3f seconds = %6.3f FPS\n",
@@ -226,14 +226,19 @@ module GlTail
226
226
 
227
227
  glLightfv(GL_LIGHT0, GL_POSITION, [5.0, 5.0, 0.0, 0.0])
228
228
  glLightfv(GL_LIGHT0, GL_AMBIENT, [0,0,0,1])
229
+
230
+ glLightModel(GL_LIGHT_MODEL_AMBIENT, [0.1,0.1,0.1,1]);
231
+ # glLightModel(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
232
+ # glLightModel(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
233
+
229
234
  glDisable(GL_CULL_FACE)
230
235
  glEnable(GL_LIGHTING)
231
236
  glEnable(GL_LIGHT0)
232
237
  glEnable(GL_TEXTURE_2D)
233
- # glShadeModel(GL_FLAT)
238
+ # glShadeModel(GL_FLAT)
234
239
  glDisable(GL_DEPTH_TEST)
235
- glDisable(GL_NORMALIZE)
236
- # glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
240
+ # glDisable(GL_NORMALIZE)
241
+ # glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
237
242
  glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST )
238
243
 
239
244
  glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
metadata CHANGED
@@ -1,33 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: gltail
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.0.7
7
- date: 2007-10-27 00:00:00 +02:00
8
- summary: View real-time data and statistics from any logfile on any server with SSH, in an intuitive and entertaining way.
9
- require_paths:
10
- - lib
11
- email: mr@fudgie.org
12
- homepage: " by Erlend Simonsen <mr@fudgie.org>"
13
- rubyforge_project: gltail
14
- description: "== FEATURES: * Real-Time OpenGL view * Multiple logfiles on multiple servers * Configurable layout * Multiple logfile parsers (Apache Combined, Rails, IIS, Postfix/spamd/clamd, Nginx, Squid, PostgreSQL, PureFTPD, MySQL, TShark, qmail/vmpop3d) * Custom events * Show rate, total or average * If you can 'tail' it, you can visualize it * Written in Ruby using net-ssh & libopengl-ruby * Free! == RUNNING: gl_tail --help gl_tail --new gl_tail.yaml gl_tail You can press 'f' while running to toggle the attempted frames per second. Or 'b' to change default blob type, and space to toggle bouncing. == REQUIREMENTS: * rubygems 0.9.4 * ruby-opengl 0.40.1 * net-ssh 1.1.2 * opengl/ruby development packages (ruby1.8-dev libgl1-mesa-dev libglu1-mesa-dev libglut3-dev)"
4
+ version: 0.1.0
5
+ platform: ""
6
+ authors:
7
+ - Erlend Simonsen
15
8
  autorequire:
16
- default_executable:
17
9
  bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
25
- platform: ruby
26
- signing_key:
27
10
  cert_chain:
28
- post_install_message:
29
- authors:
30
- - Erlend Simonsen
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDKDCCAhCgAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQDDAJtcjEW
14
+ MBQGCgmSJomT8ixkARkWBmZ1ZGdpZTETMBEGCgmSJomT8ixkARkWA29yZzAeFw0w
15
+ ODAyMTYxOTI0MTVaFw0wOTAyMTUxOTI0MTVaMDoxCzAJBgNVBAMMAm1yMRYwFAYK
16
+ CZImiZPyLGQBGRYGZnVkZ2llMRMwEQYKCZImiZPyLGQBGRYDb3JnMIIBIjANBgkq
17
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunROdBC/P8hDzoEPF/1DoFyy8/d1U2gS
18
+ +qIibjnBitTgkClXr7Baooc8wGDPcL6WsMXzoqSpXrfG5i/tXceQdg1SeOYf82op
19
+ CfQpdZeAQQ0HESBpoQOcH/d2+DPLDH+yvNKK97KdJxnmrQynNPOr2fI3Big3mV8P
20
+ YTL+ohXBwbKcDaJtauxMePxIlOFVZncl96E4Zu/EEPv2adrW6pWjesojm5cjc4ir
21
+ axVRe/+4qneDDq9+SgqU/Z+jLnzefjeBrLWMW0SxoLVJCdIKVKFdrrOQEZwNYl+E
22
+ 1+A0lnlr154Bm+DgmK+TlTxTTzyO7vmOYPB58rNbgLX6o8TrseHudQIDAQABozkw
23
+ NzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUpDfGkU5i7Uvw++aE
24
+ YzErXMFKzLwwDQYJKoZIhvcNAQEFBQADggEBAD8kyK4L9DS9l8ZoHzP3U4DlW2NG
25
+ 9AW1oBZBKEptHYIii9jUGUM2Xj/iqwBsByN47qO1Cx482/EGQaBOGv2MJ8MxzLSI
26
+ A0yOtWz26STMfn/oIrmONltE922/R+HCN8Z1mrNPomGA+YMobuRmifUtMPA41dVq
27
+ e5h0l+oAgALX5bN6TloBZnoVc2heBGD5uNgFnRmMy8t/bOVSWihIBQxnO5SUZ7T5
28
+ QMetoJWnCIH+d9yCfOQXAwkTpQYCY61mbWu262Yg2OcItoE3DrjJfPZ0eiDFHQYy
29
+ /UfNqVgtDGy57Xw9DBNRbUm92FVILwpudQs3SX1z2Gik08RrKReELwpRciY=
30
+ -----END CERTIFICATE-----
31
+
32
+ date: 2008-02-16 00:00:00 +01:00
33
+ default_executable:
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: ruby-opengl
37
+ version_requirement:
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.40.1
43
+ version:
44
+ - !ruby/object:Gem::Dependency
45
+ name: net-ssh
46
+ version_requirement:
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 1.1.2
52
+ version:
53
+ - !ruby/object:Gem::Dependency
54
+ name: hoe
55
+ version_requirement:
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.5.0
61
+ version:
62
+ description: "== FEATURES: * Real-Time OpenGL view * Multiple logfiles on multiple servers * Configurable layout * Multiple logfile parsers (Apache Combined, Rails, IIS, Postfix/spamd/clamd, Nginx, Squid, PostgreSQL, PureFTPD, MySQL, TShark, qmail/vmpop3d) * Custom events * Show rate, total or average * If you can 'tail' it, you can visualize it * Written in Ruby using net-ssh & libopengl-ruby * Free! == RUNNING: gl_tail --help gl_tail --new gl_tail.yaml gl_tail You can press 'f' while running to toggle the attempted frames per second. Or 'b' to change default blob type, and space to toggle bouncing. == REQUIREMENTS: * rubygems 0.9.4 * ruby-opengl 0.40.1 * net-ssh 1.1.2 * opengl/ruby development packages (ruby1.8-dev libgl1-mesa-dev libglu1-mesa-dev libglut3-dev)"
63
+ email: mr@fudgie.org
64
+ executables:
65
+ - gl_tail
66
+ extensions: []
67
+
68
+ extra_rdoc_files:
69
+ - History.txt
70
+ - Manifest.txt
71
+ - README.txt
31
72
  files:
32
73
  - History.txt
33
74
  - Manifest.txt
@@ -69,46 +110,32 @@ files:
69
110
  - lib/gl_tail/sources/local.rb
70
111
  - lib/gl_tail/sources/ssh.rb
71
112
  - test/test_gl_tail.rb
72
- test_files:
73
- - test/test_gl_tail.rb
113
+ has_rdoc: true
114
+ homepage: " by Erlend Simonsen <mr@fudgie.org>"
115
+ post_install_message:
74
116
  rdoc_options:
75
117
  - --main
76
118
  - README.txt
77
- extra_rdoc_files:
78
- - History.txt
79
- - Manifest.txt
80
- - README.txt
81
- executables:
82
- - gl_tail
83
- extensions: []
84
-
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: "0"
126
+ version:
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: "0"
132
+ version:
85
133
  requirements: []
86
134
 
87
- dependencies:
88
- - !ruby/object:Gem::Dependency
89
- name: ruby-opengl
90
- version_requirement:
91
- version_requirements: !ruby/object:Gem::Version::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: 0.40.1
96
- version:
97
- - !ruby/object:Gem::Dependency
98
- name: net-ssh
99
- version_requirement:
100
- version_requirements: !ruby/object:Gem::Version::Requirement
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: 1.1.2
105
- version:
106
- - !ruby/object:Gem::Dependency
107
- name: hoe
108
- version_requirement:
109
- version_requirements: !ruby/object:Gem::Version::Requirement
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- version: 1.3.0
114
- version:
135
+ rubyforge_project: gltail
136
+ rubygems_version: 0.9.5
137
+ signing_key:
138
+ specification_version: 2
139
+ summary: View real-time data and statistics from any logfile on any server with SSH, in an intuitive and entertaining way.
140
+ test_files:
141
+ - test/test_gl_tail.rb
metadata.gz.sig ADDED
Binary file