knoc-knoc 0.0.1

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.
@@ -0,0 +1,20 @@
1
+ # Files
2
+ *.swp
3
+ *.swo
4
+ *.jpg
5
+ .DS_Store
6
+ .rvmrc
7
+ .bundle/
8
+
9
+ # Dir
10
+ tmp/
11
+ coverage/
12
+ scratch_directory/
13
+ rdoc/
14
+ pkg/
15
+ doc/
16
+ gems/
17
+
18
+ *.gem
19
+ .yardoc
20
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in knoc-knoc.gemspec
4
+ gemspec
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ knoc-knoc (0.0.1)
5
+ net-ping (>= 1.3.7)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ net-ping (1.3.7)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ knoc-knoc!
17
+ net-ping (>= 1.3.7)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 lex148
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # knoc-knoc, a gem to tell you who is there
2
+
3
+ KnocKnoc will scan your network and tell you who is on it.
4
+ It will tell you when someone new arrives and when someone leaves
5
+
6
+ ##About KnocKnoc
7
+
8
+ KnocKnoc has two modes live and monitor.
9
+
10
+ Monitor mode scans your network in the background. if you ask KnocKnoc whos there in monitor mode, it will only tell you about who it knows about right then.
11
+
12
+ Live mode only scans when you ask about the network. when in live mode you are guaranteed a fill list of people on your network, however you will have to wait for it.
13
+
14
+ ###Switching Modes
15
+
16
+ - KnocKnoc::mode = KnocKnoc::WatchmanMonitor
17
+ - KnocKnoc::mode = KnocKnoc::WatchmanLive
18
+
19
+
20
+ ##Using KnocKnoc
21
+
22
+ To use KnocKnoc you ask it who is there
23
+
24
+ require 'knoc-knoc'
25
+
26
+ - KnocKnoc::whos_there => [list of people on your network]
27
+ - KnocKnoc::whos_new => [list of the new people on your network]
28
+ - KnocKnoc::whos_left => [list of the people that have left your network]
29
+
30
+
31
+
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ desc "Open an irb session preloaded with this library"
5
+ task :console do
6
+ sh "irb -rubygems -r ./lib/knoc-knoc.rb"
7
+ end
8
+
9
+
@@ -0,0 +1,5 @@
1
+ ---
2
+ :patch: 0
3
+ :major: 0
4
+ :minor: 1
5
+
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ #require "knoc-knoc/version"
4
+ require File.expand_path("../lib/knoc-knoc/version", __FILE__)
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "knoc-knoc"
8
+ s.version = KnocKnoc::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Lex Childs"]
11
+ s.email = ["lex@childs.me"]
12
+ s.homepage = %q{http://github.com/lex148/knoc-knoc}
13
+ s.summary = %q{A library to tell you who is there.}
14
+
15
+
16
+ s.rubyforge_project = "knoc-knoc"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+
23
+ s.add_dependency 'net-ping', ">= 1.3.7"
24
+
25
+ end
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'net/ping'
4
+ require 'socket'
5
+
6
+ require File.dirname(__FILE__) + '/knoc-knoc/host'
7
+ require File.dirname(__FILE__) + '/knoc-knoc/watchman'
8
+ require File.dirname(__FILE__) + '/knoc-knoc/watchman_live'
9
+ require File.dirname(__FILE__) + '/knoc-knoc/watchman_monitor'
10
+
11
+ module KnocKnoc
12
+ module_function
13
+
14
+ def mode
15
+ @watchman.class
16
+ end
17
+
18
+ def mode= value
19
+ if value.class == Class
20
+ @watchman.cleanup
21
+ @watchman = value.new
22
+ end
23
+ end
24
+
25
+ #set the default mode
26
+ @watchman = WatchmanMonitor.new
27
+ #@watchman = WatchmanLive.new
28
+
29
+ def whos_there
30
+ @watchman.whos_there
31
+ end
32
+
33
+ def whos_new
34
+ @watchman.whos_new
35
+ end
36
+
37
+ def whos_left
38
+ @watchman.whos_left
39
+ end
40
+
41
+
42
+ end
@@ -0,0 +1,32 @@
1
+ module KnocKnoc
2
+
3
+ class Host
4
+
5
+ #@ip, @hostname, @mac = nil, nil, nil
6
+ attr_reader :ip, :hostname, :mac
7
+
8
+ def initialize(address)
9
+ @ip = address
10
+ @hostname = get_hostname(address)
11
+ @mac = get_mac(address)
12
+ end
13
+
14
+
15
+ private
16
+
17
+ def get_hostname ip
18
+ Socket::getaddrinfo(ip,nil)[0][2]
19
+ end
20
+
21
+ def get_mac ip
22
+ mac = /([a-zA-Z0-9]+:)+([a-zA-Z0-9]+)/.match(`arp #{ip}`).to_s
23
+ mac = mac.split /:/
24
+ mac = mac.map{ |p| '%02s' % p }
25
+ mac = mac.map{ |p| p.gsub(' ', '0' ) }
26
+ mac = mac.join(':')
27
+ mac.upcase
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,3 @@
1
+ module KnocKnoc
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,83 @@
1
+ module KnocKnoc
2
+
3
+ class Watchman
4
+
5
+ attr_reader :whos_there, :whos_left, :whos_new
6
+
7
+ def self.local_ip
8
+ orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
9
+ UDPSocket.open do |s|
10
+ s.connect '172.0.0.1', 1
11
+ s.addr.last
12
+ end
13
+ ensure
14
+ Socket.do_not_reverse_lookup = orig
15
+ end
16
+
17
+ SUBNET = /([0-9]+\.){3}/.match(self.local_ip).to_s
18
+
19
+ def initialize
20
+ @whos_there, @whos_new, @whos_left = [], [], []
21
+ end
22
+
23
+ def whos_new
24
+ list = @whos_new
25
+ @whos_new = []
26
+ list
27
+ end
28
+
29
+ def whos_left
30
+ list = @whos_left
31
+ @whos_left = []
32
+ list
33
+ end
34
+
35
+ def refresh_lists
36
+ current_ips = self.class.ping_all
37
+ whos_there_ips = @whos_there.map{|h| h.ip }
38
+ new_ips = current_ips - whos_there_ips
39
+ left_ips = whos_there_ips - current_ips
40
+ self.update_new_ips new_ips
41
+ self.update_whos_left left_ips
42
+ end
43
+
44
+ def update_new_ips new_ips
45
+ new_ips.each do |ip|
46
+ host = Host.new(ip)
47
+ @whos_there.push host
48
+ @whos_new.push host
49
+ end
50
+ end
51
+
52
+ def update_whos_left left_ips
53
+ left_ips.each do |ip|
54
+ host = @whos_there.find{ |x| x.ip == ip }
55
+ @whos_there = @whos_there - [host]
56
+ @whos_left.push host
57
+ end
58
+ end
59
+
60
+ def self.ping_all
61
+ threads, list = [], []
62
+ (1..254).select do |num|
63
+ threads << Thread.new(num) do |n|
64
+ ip = SUBNET + n.to_s
65
+ if Net::Ping::External.new(ip, 1).ping?
66
+ #if ping ip
67
+ list.push( ip )
68
+ end
69
+ end
70
+ end
71
+ threads.each { |th| th.join() }
72
+ list
73
+ end
74
+
75
+ def self.ping ip
76
+ !!(/1 received/.match(`ping #{ip} -c 1 -w 1`))
77
+ end
78
+
79
+ def cleanup
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,31 @@
1
+ module KnocKnoc
2
+
3
+ class WatchmanLive < Watchman
4
+
5
+ def initialize
6
+ super
7
+ Thread.new() do
8
+ refresh_lists
9
+ end
10
+ end
11
+
12
+ def whos_new
13
+ refresh_lists
14
+ super
15
+ end
16
+
17
+ def whos_left
18
+ refresh_lists
19
+ super
20
+ end
21
+
22
+ def whos_there
23
+ refresh_lists
24
+ super
25
+ end
26
+
27
+ def cleanup
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ module KnocKnoc
2
+
3
+ class WatchmanMonitor < Watchman
4
+
5
+ def initialize
6
+ super
7
+ @running = true
8
+ #run the refresh_lists once before
9
+ #starting the set interval
10
+ Thread.new() do
11
+ self.refresh_lists
12
+ self.repeat_every(30) do
13
+ self.refresh_lists
14
+ end
15
+ end
16
+ end
17
+
18
+ def repeat_every(interval, &block)
19
+ while @running
20
+ start_time = Time.now
21
+ Thread.new(&block).join
22
+ elapsed = Time.now - start_time
23
+ sleep([interval - elapsed, 0].max)
24
+ end
25
+ end
26
+
27
+ def cleanup
28
+ @running = false
29
+ end
30
+
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knoc-knoc
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Lex Childs
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-15 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: net-ping
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 21
30
+ segments:
31
+ - 1
32
+ - 3
33
+ - 7
34
+ version: 1.3.7
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description:
38
+ email:
39
+ - lex@childs.me
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - .gitignore
48
+ - Gemfile
49
+ - Gemfile.lock
50
+ - LICENSE
51
+ - README.markdown
52
+ - Rakefile
53
+ - VERSION.yml
54
+ - knoc-knoc.gemspec
55
+ - lib/knoc-knoc.rb
56
+ - lib/knoc-knoc/host.rb
57
+ - lib/knoc-knoc/version.rb
58
+ - lib/knoc-knoc/watchman.rb
59
+ - lib/knoc-knoc/watchman_live.rb
60
+ - lib/knoc-knoc/watchman_monitor.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/lex148/knoc-knoc
63
+ licenses: []
64
+
65
+ post_install_message:
66
+ rdoc_options: []
67
+
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project: knoc-knoc
91
+ rubygems_version: 1.3.7
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: A library to tell you who is there.
95
+ test_files: []
96
+