ps_pabx_listener 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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/README.md +37 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/ps_pabx +67 -0
- data/lib/ps_pabx_listener/listener.rb +86 -0
- data/lib/ps_pabx_listener/main.rb +49 -0
- data/lib/ps_pabx_listener/version.rb +3 -0
- data/lib/ps_pabx_listener.rb +4 -0
- data/ps_pabx_listener.gemspec +28 -0
- metadata +159 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1341c8e3a69ebeabad3b3f4c263a94bba9d866da
|
4
|
+
data.tar.gz: ceb997c422563e562f68802572a4fb5a87ea89c7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b92e9a25b16b0cb0378f02a58905095284653a2a70c01156ae39bfd4143b80b7ae48779acf6560760bb31d1520cd0ebf9d23e6d742a2ed1357905e6d6bdfe651
|
7
|
+
data.tar.gz: 446572ceb032cc5f127cdd26faa6a75af9c345678d02ac492d25a0c07f6baa1a1e21f72e48d8fcbaedad7f8e10a9155b566a9a5626639a819d9b1b7ad0e8cc49
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# PsPabxListener
|
2
|
+
A command line utility which connects to a Panasonic PABX via *telnet* and retrieve calling information. It doesn't parse the responses to any popular format. Instead, it just filters valuable content while keeping the original fixed-space format. Parsing to formats such as *csv*, as well as further instructions regarding Panasonic's default format, shall be included in the future. And a list of working devices, off course.
|
3
|
+
|
4
|
+
## Tested Devices:
|
5
|
+
* Panasonic KX-TDA 200.
|
6
|
+
|
7
|
+
## Environment:
|
8
|
+
* Ubuntu Linux (trusty or newer);
|
9
|
+
* Ruby 2.2.0.
|
10
|
+
|
11
|
+
It's possible that the utility works on different environments, but since I haven't tested it on such conditions, I can't promise anything. If you do, please let me know, and I will include both the information and your name as a contributor.
|
12
|
+
|
13
|
+
## Install
|
14
|
+
Simply,
|
15
|
+
|
16
|
+
gem install ps_pabx_listener
|
17
|
+
|
18
|
+
## Using the command line utility
|
19
|
+
|
20
|
+
* Listem for useful information for 30 seconds:
|
21
|
+
|
22
|
+
ps_pabx -s <pabx ip address or hostname> -u <username> -p <password>
|
23
|
+
|
24
|
+
* Listem for useful information for 10 seconds:
|
25
|
+
|
26
|
+
ps_pabx -s <pabx ip address or hostname> -u <username> -p <password> -t 10
|
27
|
+
|
28
|
+
* Listem continuously for data and store it in a given directory:
|
29
|
+
|
30
|
+
ps_pabx -s <pabx ip address or hostname> -u <username> -p <password> -d <store directory>
|
31
|
+
|
32
|
+
## What else?
|
33
|
+
Developed by Lucas Vieira <lucas@vieira.io>, June 2016.
|
34
|
+
|
35
|
+
If you noticed a problem whatsoever, please, let me know.
|
36
|
+
|
37
|
+
Also, accepting PRs for better spec tests and anything else, really.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "ps_pabx_listener"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/exe/ps_pabx
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'ps_pabx_listener'
|
2
|
+
require 'getoptlong'
|
3
|
+
|
4
|
+
module PsPabxListener
|
5
|
+
class Robot
|
6
|
+
def initialize
|
7
|
+
@get_time = 30
|
8
|
+
load_options
|
9
|
+
load_arguments
|
10
|
+
@main = PsPabxListener::Main.new(host: @host,
|
11
|
+
user: @user,
|
12
|
+
password: @password,
|
13
|
+
timeout: 1)
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
if @daemonize
|
18
|
+
@main.each_data do |data|
|
19
|
+
puts data
|
20
|
+
store_data(data, generate_filename)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
@main.get_data(@get_time) {|data| puts data}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def load_options
|
30
|
+
@args = GetoptLong.new(
|
31
|
+
['--host', '-s', GetoptLong::REQUIRED_ARGUMENT],
|
32
|
+
['--user', '-u', GetoptLong::REQUIRED_ARGUMENT],
|
33
|
+
['--password', '-p', GetoptLong::REQUIRED_ARGUMENT],
|
34
|
+
['--get-time', '-t', GetoptLong::OPTIONAL_ARGUMENT],
|
35
|
+
['--daemonize', '-d', GetoptLong::OPTIONAL_ARGUMENT]
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def load_arguments
|
40
|
+
@args.each do |opt, arg|
|
41
|
+
case opt
|
42
|
+
when '--host' then @host = arg
|
43
|
+
when '--user' then @user = arg
|
44
|
+
when '--password' then @password = arg
|
45
|
+
when '--get-time' then @get_time = arg.to_i
|
46
|
+
when '--daemonize'
|
47
|
+
@daemonize = true
|
48
|
+
@store_dir = arg
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def store_data data, filename
|
54
|
+
File.open(File.join(@store_dir,filename), 'a') do |f|
|
55
|
+
f.puts data
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_filename
|
60
|
+
Time.now.strftime("%Y%m%d") + (Time.now.hour / 12).to_s + ".txt"
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
robot = PsPabxListener::Robot.new
|
67
|
+
robot.run
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module PsPabxListener
|
2
|
+
class Listener
|
3
|
+
|
4
|
+
attr_reader :connection, :started
|
5
|
+
|
6
|
+
def initialize(host, user, password, timeout=false)
|
7
|
+
@host, @user, @password, @timeout = host, user, password, timeout
|
8
|
+
validate_attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
unless @started
|
13
|
+
@started = true
|
14
|
+
connect_to_pabx
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def stop
|
19
|
+
if @started
|
20
|
+
@started = false
|
21
|
+
disconnect_from_pabx
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get
|
26
|
+
if @started
|
27
|
+
if @authenticated
|
28
|
+
get_more_data
|
29
|
+
else
|
30
|
+
authenticate_and_start_getting_data
|
31
|
+
end
|
32
|
+
else
|
33
|
+
raise "No connection."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def validate_attributes
|
40
|
+
raise 'Invalid host' unless @host.is_a? String
|
41
|
+
raise 'Invalid user' unless @user.is_a? String
|
42
|
+
raise 'Invalid password' unless @password.is_a? String
|
43
|
+
raise 'Invalid timeout' unless @timeout.is_a? FalseClass or @timeout.is_a? Numeric
|
44
|
+
end
|
45
|
+
|
46
|
+
def connect_to_pabx
|
47
|
+
@connection = Net::Telnet.new({
|
48
|
+
"Host" => @host,
|
49
|
+
"Port" => 2300,
|
50
|
+
"Prompt" => /(\n|\r)/,
|
51
|
+
"Timeout" => false,
|
52
|
+
"Waittime" => @timeout
|
53
|
+
})
|
54
|
+
end
|
55
|
+
|
56
|
+
def disconnect_from_pabx
|
57
|
+
@connection.close
|
58
|
+
@authenticated = false
|
59
|
+
end
|
60
|
+
|
61
|
+
# authenticate and get a first chunk of data
|
62
|
+
def authenticate_and_start_getting_data
|
63
|
+
response = @connection.waitfor(/(-|Rejected)/)
|
64
|
+
raise "Connection rejected." if response.include? 'Rejected'
|
65
|
+
response += @connection.cmd({
|
66
|
+
"String" => @user,
|
67
|
+
"Match" => /[Pp]ass(?:word|phrase)[:]*\z/n
|
68
|
+
})
|
69
|
+
response += @connection.cmd(@password)
|
70
|
+
@authenticated = true
|
71
|
+
filtered response.split(/\n|\r/)
|
72
|
+
end
|
73
|
+
|
74
|
+
# get more chunks of data
|
75
|
+
def get_more_data
|
76
|
+
response = @connection.waitfor({"Match" => /(\n|\r)/}).split(/(\n|\r)/)
|
77
|
+
filtered response
|
78
|
+
end
|
79
|
+
|
80
|
+
# filter relevant data
|
81
|
+
def filtered raw_data
|
82
|
+
raw_data.map { |line| line if line =~ /\A\d{2}\/\d{2}\/\d{2}/ }.compact
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module PsPabxListener
|
2
|
+
class Main
|
3
|
+
|
4
|
+
attr_reader :args, :listener
|
5
|
+
attr_accessor :run
|
6
|
+
|
7
|
+
def initialize *args
|
8
|
+
@args = args.first
|
9
|
+
@args[:timeout] ||= false
|
10
|
+
@listener = PsPabxListener::Listener.new(@args[:host],
|
11
|
+
@args[:user],
|
12
|
+
@args[:password],
|
13
|
+
@args[:timeout])
|
14
|
+
end
|
15
|
+
|
16
|
+
# disconnects listener after given timeout is reached
|
17
|
+
def get_data timeout, &block
|
18
|
+
@listener.start
|
19
|
+
start_time = Time.now
|
20
|
+
runner = Thread.new do
|
21
|
+
loop do
|
22
|
+
@listener.get.each {|data| yield data}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
sleep 1 while Time.now - start_time < timeout
|
26
|
+
runner.exit
|
27
|
+
@listener.stop
|
28
|
+
end
|
29
|
+
|
30
|
+
# keeps getting data kind of forever and process the data
|
31
|
+
def each_data &block
|
32
|
+
@listener.start
|
33
|
+
@run = true
|
34
|
+
|
35
|
+
Signal.trap("INT") {@run = false}
|
36
|
+
|
37
|
+
runner = Thread.new do
|
38
|
+
loop do
|
39
|
+
@listener.get.each {|data| yield data}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
sleep 1 while(@run)
|
44
|
+
runner.exit
|
45
|
+
@listener.stop
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ps_pabx_listener/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ps_pabx_listener"
|
8
|
+
spec.version = PsPabxListener::VERSION
|
9
|
+
spec.authors = ["Lucas Vieira"]
|
10
|
+
spec.email = ["lucas@vieira.io"]
|
11
|
+
|
12
|
+
spec.summary = %q{Command line utility which connects to a Panasonic PABX via telnet and retrieve calling information.}
|
13
|
+
spec.description = %q{A command line utility which connects to a Panasonic PABX via *telnet* and retrieve calling information. Filters valuable content while keeping the original fixed-space format.}
|
14
|
+
spec.homepage = "http://vieira.io"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
24
|
+
spec.add_development_dependency "rspec-mocks", "~> 3.0"
|
25
|
+
spec.add_development_dependency "factory_girl", "~> 4.7"
|
26
|
+
spec.add_dependency "net-telnet"
|
27
|
+
spec.add_dependency "daemons"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ps_pabx_listener
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lucas Vieira
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-07-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-mocks
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: factory_girl
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: net-telnet
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: daemons
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A command line utility which connects to a Panasonic PABX via *telnet*
|
112
|
+
and retrieve calling information. Filters valuable content while keeping the original
|
113
|
+
fixed-space format.
|
114
|
+
email:
|
115
|
+
- lucas@vieira.io
|
116
|
+
executables:
|
117
|
+
- ps_pabx
|
118
|
+
extensions: []
|
119
|
+
extra_rdoc_files: []
|
120
|
+
files:
|
121
|
+
- ".gitignore"
|
122
|
+
- ".rspec"
|
123
|
+
- ".travis.yml"
|
124
|
+
- Gemfile
|
125
|
+
- README.md
|
126
|
+
- Rakefile
|
127
|
+
- bin/console
|
128
|
+
- bin/setup
|
129
|
+
- exe/ps_pabx
|
130
|
+
- lib/ps_pabx_listener.rb
|
131
|
+
- lib/ps_pabx_listener/listener.rb
|
132
|
+
- lib/ps_pabx_listener/main.rb
|
133
|
+
- lib/ps_pabx_listener/version.rb
|
134
|
+
- ps_pabx_listener.gemspec
|
135
|
+
homepage: http://vieira.io
|
136
|
+
licenses: []
|
137
|
+
metadata: {}
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 2.5.1
|
155
|
+
signing_key:
|
156
|
+
specification_version: 4
|
157
|
+
summary: Command line utility which connects to a Panasonic PABX via telnet and retrieve
|
158
|
+
calling information.
|
159
|
+
test_files: []
|