mgparser 0.1.9 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -3,19 +3,49 @@ MGParser
3
3
 
4
4
  MGParser (MGP) is a tool which makes analysis of Mediatrix ISDN gateways debug a much simpler task.
5
5
 
6
- Documentation
6
+ Prerequisites
7
7
  =============
8
8
 
9
- TODO
9
+ - Mediatrix 4400 series media gateway (3000 also should be fine) with firmware version DGW2.0
10
+ - Ruby 1.8.7/1.9.2
11
+
12
+ Getting Started
13
+ =============
14
+
15
+ Before starting mgparser ensure that there is no firewall enabled on your Mediatrix unit or that there is a rule
16
+ which will accept incoming connections on it's SNMP port (default is 161 but you can provide a different one with -s PORT option).
17
+ You can find Mediatrix firewall settings in Network-->Local Firewall menu.
18
+ You should also check that the syslog level is set to "Warning" or above for all services, if you have factory default settings
19
+ this should already be OK.
20
+
21
+ Update your rubygems:
22
+ <p><code>
23
+ sudo gem update --system
24
+ </code></p>
25
+
26
+ Install mgparser:
27
+ <p><code>
28
+ sudo gem install mgparser
29
+ </code></p>
30
+
31
+ To start mgparser just type:
32
+ <p><code>
33
+ sudo mgparser -i ip_of_your_Mediatrix_unit
34
+ </code></p>
35
+
36
+ If you want to analyze a log file instead of making live debug you can type:
37
+ <p><code>
38
+ mgparser -l path/to/your/log/file
39
+ </code></p>
40
+
10
41
  <pre><code>
11
- Usage: MGParser.rb [options]
42
+ Usage: mgparser [options]
12
43
 
13
44
  Specific options:
14
45
  -p, --port PORT Port number on which receive syslog (default is 514)
15
- -s, --snmpport PORT Gateway SNMP port number (default is 161)
16
- -i, --ipaddr IPADDR Media Gateway IP
46
+ -s, --snmpport PORT Media Gateway SNMP port number (default is 161)
47
+ -i, --ipaddr IPADDR Media Gateway IP address
17
48
  -l, --logfile LOGFILE Log file to analyze
18
- -v, --[no-]verbose Run verbosely
19
49
 
20
50
  Common options:
21
51
  -h, --help Show this message
data/bin/mgparser CHANGED
@@ -87,7 +87,9 @@ $causes = {"1" => "Unallocated (unassigned) number",
87
87
  if $options.list[:logfile]
88
88
  if FileTest::exist?($options.list[:logfile])
89
89
  data = IO.readlines($options.list[:logfile])
90
- call = Call.new(data)
90
+ @is_file = true
91
+ call = Call.new
92
+ call.analyze(data,@is_file)
91
93
  else
92
94
  puts "File not found"
93
95
  end
@@ -100,15 +102,27 @@ else
100
102
  end
101
103
 
102
104
  def receive_data(data)
103
- @call.analyze(data)
105
+ @is_file = false
106
+ @call.analyze(data,@is_file)
104
107
  end
105
108
  end
106
109
 
107
110
  #We initialize eventmachine
111
+ begin
108
112
  EventMachine::run do
109
113
  host = UDPSocket.open {|s| s.connect($options.list[:ipaddr],30000); s.addr.last }
110
114
  port = $options.list[:port]
111
115
  snmpgw = SnmpGw.new($options.list[:port],$options.list[:ipaddr],$options.list[:snmp])
116
+ begin
112
117
  EventMachine::open_datagram_socket host, port, SyslogServer
118
+ rescue RuntimeError, Interrupt
119
+ puts "Closing..."
120
+ abort ""
121
+ end
122
+ end
123
+ rescue Interrupt
124
+ puts "Interrupted"
125
+ rescue RunetimeError
126
+ puts "Are you root?"
113
127
  end
114
128
  end
data/lib/call.rb CHANGED
@@ -1,98 +1,123 @@
1
1
  class Call
2
2
  attr_accessor :data
3
3
 
4
- def analyze(data)
4
+ def analyze(data,is_file)
5
5
 
6
- @callprogr_counter = 0
7
- @matched = 0
8
-
9
- data.each do |line|
6
+ @callprogr_counter = 0
7
+ @matched = 0
8
+
9
+ if is_file == true
10
+ data.each do |line|
11
+ parse(line)
12
+ end
13
+ else
14
+ parse(data)
15
+ end
10
16
 
11
- if line =~ /Unicast RECV Setup/
12
- @inbound = true
17
+ end
13
18
 
14
- elsif line =~ /CallRouter \[.*\] Src=/
15
- @caller = line.scan(/e164=(\d{1,})/).first
16
-
17
- elsif line =~ /CallRouter \[.*\] Dst\d\/2/
18
- @called = line.scan(/e164=(\d{1,})/).first
19
+ def parse(line)
20
+ if line =~ /Unicast RECV Setup/
21
+ @inbound = true
19
22
 
20
-
21
- elsif line =~ /UseNextDestination - Call \d{1,}-\d{1,}/
22
- id = line.scan(/UseNextDestination - Call \d{1,}-(\d{1,})/).first
23
- if @matched < 1
24
- if @inbound == true
25
- @matched += 1
23
+ elsif line =~ /CallRouter \[.*\] Src=/
24
+ @caller = line.scan(/e164=(\d{1,})/).flatten!.first
25
+
26
+ elsif line =~ /CallRouter \[.*\] Dst\d\/2/
27
+ @called = line.scan(/e164=(\d{1,})/).flatten!.first
28
+
29
+
30
+ elsif line =~ /UseNextDestination - Call \d{1,}-\d{1,}/
31
+ id = line.scan(/UseNextDestination - Call \d{1,}-(\d{1,})/).flatten!.first
32
+ if @matched < 1
33
+ if @inbound == true
34
+ @matched += 1
35
+ else
36
+ puts "Call ID: #{id} - Caller: #{@caller}"
37
+ puts "Call ID: #{id} - Called: #{@called}"
38
+ end
26
39
  else
27
40
  puts "Call ID: #{id} - Caller: #{@caller}"
28
41
  puts "Call ID: #{id} - Called: #{@called}"
42
+ @matched = 0
29
43
  end
30
- else
31
- puts "Call ID: #{id} - Caller: #{@caller}"
32
- puts "Call ID: #{id} - Called: #{@called}"
33
- @matched = 0
34
- end
35
-
36
- elsif line =~ /CallManager \[.*\] C\d{1,} - Send CallSetupA/
37
- id = line.scan(/C(\d{1,}) -/).first
38
- if @inbound == true
39
- puts "Call ID: #{id} - <== ISDN setup received"
40
- else
41
- puts "Call ID: #{id} - ==> ISDN setup sent"
42
- end
43
- @inbound = false
44
-
45
- elsif line =~ /"Proceeding Indication" .* for state CallSetup./
46
- @progress_indication = true
47
-
48
- elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(2\)/
49
- @callprogr_counter += 1
50
- id = line.scan(/C(\d{1,}) -/).first
51
-
52
- if @progress_indication == true
53
- #puts "Call ID: #{id} - <== \"Proceeding indication\" received from operator"
54
- @progress_indication = false
44
+
45
+ elsif line =~ /CallManager \[.*\] C\d{1,} - Send CallSetupA/
46
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
47
+ if @inbound == true
48
+ puts "Call ID: #{id} - <== ISDN setup received"
55
49
  else
56
- if @callprogr_counter >= 3
57
- puts "Call ID: #{id} - <== The call will be probably answered by operator\'s voicemail or is being forwarded"
58
- @callprogr_counter = 0
50
+ puts "Call ID: #{id} - ==> ISDN setup sent"
51
+ end
52
+ @inbound = false
53
+
54
+ elsif line =~ /"Proceeding Indication" .* for state CallSetup./
55
+ @progress_indication = true
56
+
57
+ elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(2\)/
58
+ @callprogr_counter += 1
59
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
60
+
61
+ if @progress_indication == true
62
+ #puts "Call ID: #{id} - <== \"Proceeding indication\" received from operator"
63
+ @progress_indication = false
59
64
  else
60
- puts "Call ID: #{id} - <== \"Call Progress\" received from operator"
61
- end
62
- end
63
-
64
- elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(3\)/
65
- id = line.scan(/C(\d{1,}) -/).first
66
- puts "Call ID: #{id} - ==> \"Call Progress\" sent to the operator"
67
-
68
-
69
- elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(1\)/
70
- id = line.scan(/C(\d{1,}) -/).first
71
- puts "Call ID: #{id} - <== Destination number is ringing"
72
-
73
-
74
- elsif line =~ /CallManager \[.*\] C\d{1,} - CallConnectA/
75
- id = line.scan(/C(\d{1,}) -/).first
76
- puts "Call ID: #{id} - Call has been answered!"
65
+ if @callprogr_counter >= 3
66
+ puts "Call ID: #{id} - <== The call will be probably answered by operator\'s voicemail or is being forwarded"
67
+ @callprogr_counter = 0
68
+ else
69
+ puts "Call ID: #{id} - <== \"Call Progress\" received from operator"
70
+ end
71
+ end
72
+
73
+ elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(3\)/
74
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
75
+ puts "Call ID: #{id} - ==> \"Call Progress\" sent to the operator"
76
+
77
+
78
+ elsif line =~ /CallManager \[.*\] C\d{1,} - CallProgressA\(1\)/
79
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
80
+ puts "Call ID: #{id} - <== Destination number is ringing"
81
+
82
+
83
+ elsif line =~ /CallManager \[.*\] C\d{1,} - CallConnectA/
84
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
85
+ puts "Call ID: #{id} - Call has been answered!"
77
86
 
78
87
 
79
- elsif line =~ /CallManager \[.*\] C\d{1,} - CallMessageA\(2\)/
80
- id = line.scan(/C(\d{1,}) -/).first
81
- @isdn_inbound_disconnect = true
88
+ elsif line =~ /CallManager \[.*\] C\d{1,} - CallMessageA\(2\)/
89
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
90
+ @isdn_inbound_disconnect = true
82
91
 
92
+ elsif line =~ /CallManager.* Call is not allowed/
93
+ @resource_unavailable = true
94
+ @resource_unavailable_id = line.scan(/CallManager \[.*\] C\d{1,}-(\d{1,})/).flatten!.first
83
95
 
84
- elsif line =~ /CallManager \[.*\] C\d{1,} - Send CallReleaseA\(\d{1,}\)/
85
- id = line.scan(/C(\d{1,}) -/).first
86
- cause = line.scan(/Send CallReleaseA\((\d{1,})/).first
96
+ elsif line =~ /CallTable.* ReleaseCall - Interface isdn.*try to release.* \d{1,}/
97
+ @abnormal_hangup = true
98
+ @abnormal_hangup_id = line.scan(/CallTable.* ReleaseCall - Interface isdn.*try to release.* (\d{1,})/).flatten!.first
87
99
 
88
- if @isdn_inbound_disconnect == true
89
- puts "Call ID: #{id} - <== Operator requested hangup with cause: \"#{$causes[cause.first]}\""
90
- @isdn_inbound_disconnect = false
100
+
101
+ elsif line =~ /CallManager \[.*\] C\d{1,} - Send CallReleaseA\(\d{1,}\)/
102
+ if @resource_unavailable == true
103
+ id = @resource_unavailable_id
104
+ @resource_unavailable = false
105
+ elsif @abnormal_hangup == true
106
+ id = @abnormal_hangup_id
107
+ @abnormal_hangup = false
91
108
  else
92
- puts "Call ID: #{id} - ==> Gateway sent hangup with cause: \"#{$causes[cause.first]}\""
109
+ id = line.scan(/C(\d{1,}) -/).flatten!.first
93
110
  end
94
-
95
- end
96
- end
97
- end
111
+ cause = line.scan(/Send CallReleaseA\((\d{1,})/).flatten!.first
112
+
113
+ if @isdn_inbound_disconnect == true
114
+ puts "Call ID: #{id} - <== Operator requested hangup with cause: \"#{$causes[cause]}\""
115
+ @isdn_inbound_disconnect = false
116
+ else
117
+ puts "Call ID: #{id} - ==> Gateway sent hangup with cause: \"#{$causes[cause]}\""
118
+ end
119
+
120
+ end
121
+ end
122
+
98
123
  end
data/lib/snmp_gw.rb CHANGED
@@ -23,6 +23,8 @@ def initialize(port, ipaddr, snmp)
23
23
  rescue SNMP::RequestTimeout
24
24
  puts "Host is not responding (a firewall can be active or there is no SNMP network service listening on port: #{snmp})"
25
25
  abort ""
26
+ rescue Interrupt
27
+ puts "Closing gracefully"
26
28
  end
27
29
 
28
30
  end
data/lib/version.rb CHANGED
@@ -2,7 +2,7 @@ module Mgparser
2
2
  module VERSION
3
3
  MAJOR = 0 unless defined? MAJOR
4
4
  MINOR = 1 unless defined? MINOR
5
- TINY = 9 unless defined? TINY
5
+ TINY = 12 unless defined? TINY
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.') unless defined? STRING
8
8
  end
data/mgparser.gemspec CHANGED
@@ -12,7 +12,6 @@ Gem::Specification.new do |s|
12
12
  s.description = "MGParser (MGP) is a tool which makes analysis of Mediatrix ISDN gateways debug a much simpler task"
13
13
  s.email = "dawid.pogorzelski@mybushido.com"
14
14
  s.executables = ["mgparser"]
15
-
16
15
  s.files = %w{
17
16
  README.markdown
18
17
  bin/mgparser
metadata CHANGED
@@ -1,75 +1,57 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mgparser
3
- version: !ruby/object:Gem::Version
4
- hash: 9
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.12
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 9
10
- version: 0.1.9
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Dawid Pogorzelski
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-04-22 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-04-26 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: bundler
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2157613240 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 1
31
- - 0
32
- - 10
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
33
21
  version: 1.0.10
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: eventmachine
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2157613240
25
+ - !ruby/object:Gem::Dependency
26
+ name: eventmachine
27
+ requirement: &2157612860 !ruby/object:Gem::Requirement
40
28
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
48
33
  type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: snmp
52
34
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2157612860
36
+ - !ruby/object:Gem::Dependency
37
+ name: snmp
38
+ requirement: &2157612400 !ruby/object:Gem::Requirement
54
39
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 3
59
- segments:
60
- - 0
61
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
62
44
  type: :runtime
63
- version_requirements: *id003
64
- description: MGParser (MGP) is a tool which makes analysis of Mediatrix ISDN gateways debug a much simpler task
45
+ prerelease: false
46
+ version_requirements: *2157612400
47
+ description: MGParser (MGP) is a tool which makes analysis of Mediatrix ISDN gateways
48
+ debug a much simpler task
65
49
  email: dawid.pogorzelski@mybushido.com
66
- executables:
50
+ executables:
67
51
  - mgparser
68
52
  extensions: []
69
-
70
53
  extra_rdoc_files: []
71
-
72
- files:
54
+ files:
73
55
  - README.markdown
74
56
  - bin/mgparser
75
57
  - mgparser.gemspec
@@ -81,36 +63,26 @@ files:
81
63
  - Gemfile
82
64
  homepage: https://github.com/dawid999/MGParser
83
65
  licenses: []
84
-
85
66
  post_install_message:
86
67
  rdoc_options: []
87
-
88
- require_paths:
68
+ require_paths:
89
69
  - lib
90
- required_ruby_version: !ruby/object:Gem::Requirement
70
+ required_ruby_version: !ruby/object:Gem::Requirement
91
71
  none: false
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- hash: 3
96
- segments:
97
- - 0
98
- version: "0"
99
- required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
77
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
108
82
  requirements: []
109
-
110
83
  rubyforge_project:
111
84
  rubygems_version: 1.7.2
112
85
  signing_key:
113
86
  specification_version: 3
114
87
  summary: Mediatrix ISDN gateways debug utility
115
88
  test_files: []
116
-