gltail 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data.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