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 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
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.pid
11
+ *.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ps_pabx_listener.gemspec
4
+ gemspec
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
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
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,3 @@
1
+ module PsPabxListener
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ require "net/telnet"
2
+ require "ps_pabx_listener/version"
3
+ require "ps_pabx_listener/listener"
4
+ require "ps_pabx_listener/main"
@@ -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: []