logpoop 0.1.1 → 1.0.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/Gemfile +0 -5
- data/VERSION +1 -1
- data/bin/logpoop +1 -6
- data/lib/logpoop/runner/context.rb +46 -0
- data/lib/logpoop/runner/multi_tail.rb +22 -0
- data/lib/logpoop/runner/test_run.rb +22 -0
- data/lib/logpoop/simulator/base.rb +23 -0
- data/lib/logpoop/simulator/tail_eff.rb +64 -0
- data/lib/logpoop/simulator/test_run.rb +32 -0
- data/lib/logpoop.rb +38 -63
- data/logpoop.gemspec +9 -3
- data/test/helper.rb +0 -1
- data/test/test_logpoop.rb +3 -2
- metadata +13 -7
data/Gemfile
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
5
2
|
|
6
|
-
# Add dependencies to develop your gem here.
|
7
|
-
# Include everything needed to run rake, tests, features, etc.
|
8
3
|
group :development do
|
9
4
|
gem "jeweler", "~> 1.5.2"
|
10
5
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/bin/logpoop
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Runner
|
2
|
+
class Context
|
3
|
+
# Get an array of open IO objects attached to existing terminal sessions. The current terminal
|
4
|
+
# (the one executing this program) will always be first.
|
5
|
+
def self.ttys(nums=[])
|
6
|
+
this_tty=`tty`.strip
|
7
|
+
# macos
|
8
|
+
if(this_tty =~ /ttys[0-9]{3}/)
|
9
|
+
other_ttys=Dir['/dev/ttys00*']
|
10
|
+
|
11
|
+
# linux
|
12
|
+
elsif(this_tty =~ /\/dev\/pts\/[0-9]{1}/)
|
13
|
+
other_ttys=Dir['/dev/pts/*']
|
14
|
+
end
|
15
|
+
|
16
|
+
other_ttys.reject!{|t| t == this_tty}
|
17
|
+
[this_tty].concat(other_ttys).map{|f| IO.sysopen(f, 'w')}.map{|n| IO.new(n, 'w')}
|
18
|
+
end
|
19
|
+
|
20
|
+
# A list of the currently-running simulators
|
21
|
+
def self.simulators
|
22
|
+
@@simulators ||= []
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.logs
|
26
|
+
dir = @@options[:log_dir] || "/var/log"
|
27
|
+
`ls -S #{dir}/*.log`.split(/\n/)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.run(options={})
|
31
|
+
@@options = options
|
32
|
+
runner(@@options[:type]).new.run
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.stop
|
36
|
+
simulators.each(&:stop)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.runner(opt)
|
40
|
+
{
|
41
|
+
:tail => MultiTail,
|
42
|
+
:test => TestRun
|
43
|
+
}[opt.to_sym]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Runner
|
2
|
+
class MultiTail
|
3
|
+
def run
|
4
|
+
ttys = Context.ttys
|
5
|
+
logs = Context.logs[0..ttys.length-1]
|
6
|
+
run_all(ttys,logs)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def run_all(ttys,logs)
|
11
|
+
threads = []
|
12
|
+
ttys.zip(logs).each do |pair|
|
13
|
+
threads << Thread.new(pair[0], pair[1]) do |mytty, myfile|
|
14
|
+
simulator = Simulator::TailEff.new(mytty, myfile)
|
15
|
+
Context.simulators << simulator
|
16
|
+
simulator.fake_it
|
17
|
+
end
|
18
|
+
end
|
19
|
+
threads.map(&:join)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Runner
|
2
|
+
class TestRun
|
3
|
+
def run
|
4
|
+
stdout, logout = Context.ttys[0..1]
|
5
|
+
log = Context.logs[0]
|
6
|
+
threads=[]
|
7
|
+
threads << Thread.new(stdout) do |myout|
|
8
|
+
sim = Simulator::TestRun.new(myout)
|
9
|
+
Context.simulators << sim
|
10
|
+
sim.fake_it
|
11
|
+
end
|
12
|
+
if(logout)
|
13
|
+
threads << Thread.new(logout, log) do |myout, mylog|
|
14
|
+
sim = Simulator::TailEff.new(myout, mylog)
|
15
|
+
Context.simulators << sim
|
16
|
+
sim.fake_it
|
17
|
+
end
|
18
|
+
end
|
19
|
+
threads.map(&:join)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Simulator
|
2
|
+
module Base
|
3
|
+
# takes an IO instance
|
4
|
+
def clear_screen(tty)
|
5
|
+
tty.write "\e[2J\e[f"
|
6
|
+
end
|
7
|
+
|
8
|
+
def stop
|
9
|
+
@stop = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def simulate
|
13
|
+
fake_it
|
14
|
+
clear_screen(out)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.class_eval do
|
19
|
+
attr_accessor :out
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#
|
2
|
+
# Simulate tail -f in a output stream by spewing chunks of lines
|
3
|
+
# from a given log file into it at semi-random speed.
|
4
|
+
#
|
5
|
+
module Simulator
|
6
|
+
class TailEff
|
7
|
+
include Simulator::Base
|
8
|
+
|
9
|
+
attr_accessor :logfile, :speed, :burst_size
|
10
|
+
|
11
|
+
# The maximum speed of the tailer. The speed will be sampled
|
12
|
+
# randomly in a range from 1/2 second to 1/speed seconds.
|
13
|
+
# higher = faster
|
14
|
+
def speed
|
15
|
+
@speed ||= 500
|
16
|
+
end
|
17
|
+
|
18
|
+
# The number of groups of lines that will be logged at a given
|
19
|
+
# speed before a new speed is calculated
|
20
|
+
def burst_size
|
21
|
+
@burst_size ||= 5
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(out, logfile, speed=nil, burst_size=nil)
|
25
|
+
self.out = out
|
26
|
+
self.logfile = logfile
|
27
|
+
self.speed = speed
|
28
|
+
self.burst_size = burst_size
|
29
|
+
end
|
30
|
+
|
31
|
+
def fake_it
|
32
|
+
while !@stop do
|
33
|
+
print_lines
|
34
|
+
end
|
35
|
+
clear_screen(self.out)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def print_lines
|
40
|
+
bubble_speed, bubble_size = rand_speed, rand_burst
|
41
|
+
while(bubble_size > 0)
|
42
|
+
num_lines = rand(4) + 1
|
43
|
+
rand_pos = rand(loglines.length - 1)
|
44
|
+
range = (rand_pos..(rand_pos + num_lines))
|
45
|
+
line = loglines[range].map{|li| li.gsub(/'/, "\"")}.join("\n")
|
46
|
+
self.out.write(line)
|
47
|
+
sleep(1.0 / bubble_speed)
|
48
|
+
bubble_size -= 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def loglines
|
53
|
+
@loglines ||= File.read(logfile).split(/\n/)
|
54
|
+
end
|
55
|
+
|
56
|
+
def rand_burst
|
57
|
+
rand(burst_size) + 1
|
58
|
+
end
|
59
|
+
|
60
|
+
def rand_speed
|
61
|
+
rand(speed) + 1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Simulator
|
2
|
+
class TestRun
|
3
|
+
EF = %w{ E F }
|
4
|
+
|
5
|
+
include Simulator::Base
|
6
|
+
|
7
|
+
def initialize(out)
|
8
|
+
self.out = out
|
9
|
+
end
|
10
|
+
|
11
|
+
def a_dot_or_an_e_or_an_f
|
12
|
+
if(rand(100) % 10 == 0)
|
13
|
+
EF[rand(EF.length)]
|
14
|
+
else
|
15
|
+
"."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def fake_it
|
20
|
+
clear_screen(self.out)
|
21
|
+
self.out.puts(Dir.pwd.strip + " $ rake test")
|
22
|
+
self.out.puts("(in #{Dir.pwd.strip})")
|
23
|
+
self.out.puts("Started")
|
24
|
+
while !@stop do
|
25
|
+
out.write(a_dot_or_an_e_or_an_f)
|
26
|
+
out.flush
|
27
|
+
sleep(rand(20) / 50.0)
|
28
|
+
end
|
29
|
+
clear_screen(self.out)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/logpoop.rb
CHANGED
@@ -1,82 +1,57 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require 'optparse'
|
2
|
+
require 'logpoop/runner/context'
|
3
|
+
require 'logpoop/runner/multi_tail'
|
4
|
+
require 'logpoop/runner/test_run'
|
5
|
+
require 'logpoop/simulator/base'
|
6
|
+
require 'logpoop/simulator/tail_eff'
|
7
|
+
require 'logpoop/simulator/test_run'
|
8
|
+
|
9
|
+
class LogPoop
|
10
|
+
def self.banner
|
5
11
|
<<-STR
|
6
12
|
Description:
|
7
|
-
|
8
|
-
open terminals.
|
9
|
-
|
10
|
-
Usage: #{$0} [log_dir] [tty_num]
|
11
|
-
log_dir directory to pull log files from, defaults to /var/log
|
12
|
-
tty_num tty number to use (e.g. 1). If blank, all open terminals will get pooped on.
|
13
|
+
Look busy! Tail some stuff in your open terminals, or even simulate running some tests.
|
13
14
|
STR
|
14
15
|
end
|
15
|
-
def self.instance
|
16
|
-
@@instance
|
17
|
-
end
|
18
|
-
|
19
|
-
# takes an IO instance
|
20
|
-
def clear_screen(tty)
|
21
|
-
tty.write "\e[2J\e[f"
|
22
|
-
end
|
23
16
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
num_lines = rand(4) + 1
|
30
|
-
rand_pos = rand(log.length - 1)
|
31
|
-
range = (rand_pos..(rand_pos + num_lines))
|
32
|
-
line = log[range].map{|li| li.gsub(/'/, "\"")}.join("\n")
|
33
|
-
mytty.write(line)
|
34
|
-
sleep(speed / 50.0)
|
35
|
-
speed = rand(20) if iter % 7 == 0
|
36
|
-
end
|
37
|
-
end
|
17
|
+
def self.parse_options
|
18
|
+
options = {
|
19
|
+
:type => :tail,
|
20
|
+
:log_dir => "/var/log"
|
21
|
+
}
|
38
22
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
@go = true
|
45
|
-
threads = []
|
46
|
-
@ttys.each_with_index do |tty, index|
|
47
|
-
threads << Thread.new(tty, f[index]) do |mytty, mylog|
|
48
|
-
loop_some_log_crap(mytty, mylog)
|
23
|
+
o = OptionParser.new do |opt|
|
24
|
+
opt.banner = self.banner
|
25
|
+
opt.on("-v", "--version", "Show version") do
|
26
|
+
puts File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
|
27
|
+
exit
|
49
28
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if(num.nil?)
|
56
|
-
Dir.glob("/dev/ttys00*")
|
57
|
-
else
|
58
|
-
if(File.exists?("/dev/ttys00#{num}"))
|
59
|
-
["/dev/ttys00#{num}"]
|
60
|
-
else
|
61
|
-
raise "/dev/ttys00#{num} does not exist"
|
29
|
+
opt.on("-d", "--log_dir DIRECTORY", "Log directory") do |d|
|
30
|
+
options[:log_dir] = d
|
31
|
+
end
|
32
|
+
opt.on("-t", "--type TYPE", "Poop type. Available types:\n\ttail - simulate 'tail -f' in all your open terminals\n\ttest - simulate a console test run (needs two terminals open)") do |t|
|
33
|
+
options[:type] = t
|
62
34
|
end
|
63
35
|
end
|
36
|
+
o.parse!
|
37
|
+
options
|
64
38
|
end
|
65
|
-
|
66
|
-
def
|
67
|
-
|
39
|
+
|
40
|
+
def self.instance
|
41
|
+
@@instance
|
68
42
|
end
|
69
|
-
|
70
|
-
def
|
71
|
-
|
72
|
-
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
options = self.class.parse_options
|
46
|
+
Runner::Context.run(options)
|
73
47
|
end
|
48
|
+
|
74
49
|
end
|
75
50
|
|
76
51
|
Signal.trap("INT") do
|
77
|
-
|
52
|
+
Runner::Context.stop
|
78
53
|
end
|
79
54
|
|
80
55
|
Signal.trap("TERM") do
|
81
|
-
|
56
|
+
Runner::Context.stop
|
82
57
|
end
|
data/logpoop.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{logpoop}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Billy Reisinger"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-12-01}
|
13
13
|
s.default_executable = %q{logpoop}
|
14
14
|
s.description = %q{This gem installs a script called 'logpoop' that, when run, fills up your active terminal sessions with crap (so that you look really busy). }
|
15
15
|
s.email = %q{billy.reisinger@gmail.com}
|
@@ -28,6 +28,12 @@ Gem::Specification.new do |s|
|
|
28
28
|
"VERSION",
|
29
29
|
"bin/logpoop",
|
30
30
|
"lib/logpoop.rb",
|
31
|
+
"lib/logpoop/runner/context.rb",
|
32
|
+
"lib/logpoop/runner/multi_tail.rb",
|
33
|
+
"lib/logpoop/runner/test_run.rb",
|
34
|
+
"lib/logpoop/simulator/base.rb",
|
35
|
+
"lib/logpoop/simulator/tail_eff.rb",
|
36
|
+
"lib/logpoop/simulator/test_run.rb",
|
31
37
|
"logpoop.gemspec",
|
32
38
|
"test/helper.rb",
|
33
39
|
"test/test_logpoop.rb"
|
@@ -35,7 +41,7 @@ Gem::Specification.new do |s|
|
|
35
41
|
s.homepage = %q{http://github.com/unclebilly/logpoop}
|
36
42
|
s.licenses = ["MIT"]
|
37
43
|
s.require_paths = ["lib"]
|
38
|
-
s.rubygems_version = %q{1.5.
|
44
|
+
s.rubygems_version = %q{1.5.2}
|
39
45
|
s.summary = %q{Quick, look busy! Print some poop in your terminals!}
|
40
46
|
s.test_files = [
|
41
47
|
"test/helper.rb",
|
data/test/helper.rb
CHANGED
data/test/test_logpoop.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestLogpoop < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
4
|
+
def test_test
|
5
|
+
ARGV[0], ARGV[1] = "--type", "test"
|
6
|
+
LogPoop.new
|
6
7
|
end
|
7
8
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logpoop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
7
|
- 1
|
10
|
-
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Billy Reisinger
|
@@ -15,10 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-01 00:00:00 -06:00
|
19
19
|
default_executable: logpoop
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
type: :development
|
22
23
|
name: jeweler
|
23
24
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
@@ -32,7 +33,6 @@ dependencies:
|
|
32
33
|
- 2
|
33
34
|
version: 1.5.2
|
34
35
|
prerelease: false
|
35
|
-
type: :development
|
36
36
|
requirement: *id001
|
37
37
|
description: "This gem installs a script called 'logpoop' that, when run, fills up your active terminal sessions with crap (so that you look really busy). "
|
38
38
|
email: billy.reisinger@gmail.com
|
@@ -53,6 +53,12 @@ files:
|
|
53
53
|
- VERSION
|
54
54
|
- bin/logpoop
|
55
55
|
- lib/logpoop.rb
|
56
|
+
- lib/logpoop/runner/context.rb
|
57
|
+
- lib/logpoop/runner/multi_tail.rb
|
58
|
+
- lib/logpoop/runner/test_run.rb
|
59
|
+
- lib/logpoop/simulator/base.rb
|
60
|
+
- lib/logpoop/simulator/tail_eff.rb
|
61
|
+
- lib/logpoop/simulator/test_run.rb
|
56
62
|
- logpoop.gemspec
|
57
63
|
- test/helper.rb
|
58
64
|
- test/test_logpoop.rb
|
@@ -86,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
92
|
requirements: []
|
87
93
|
|
88
94
|
rubyforge_project:
|
89
|
-
rubygems_version: 1.5.
|
95
|
+
rubygems_version: 1.5.2
|
90
96
|
signing_key:
|
91
97
|
specification_version: 3
|
92
98
|
summary: Quick, look busy! Print some poop in your terminals!
|