ps_pabx_listener 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []