obzvonilka-api 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 35c20367b24ef265a9b089332398682cee2bc88a
4
- data.tar.gz: b84a2385444552ffad33b3dbf64afc03e77733dd
5
- SHA512:
6
- metadata.gz: a493617e09ff0071cb710712f9d0a773e042c26fe649971d9c392edc1d4c3b75c08686395ae20f7ef2d460bf94331b504c606dcc7532e62dd6d1a91a7fe3f51b
7
- data.tar.gz: c3d28febe2cd5a8c35bc5ca035699aa4f2e3da266313ce30e236b1d72d2068e2d36c960c8edc3ed4f80784b8531a594aad886251ff5f80f6813f3f9ca3260d8f
1
+ ---
2
+ SHA1:
3
+ data.tar.gz: 8284a8ebc49e5fd0c88c1d1350856504df53395d
4
+ metadata.gz: b149c8ca739fc96a1c9650f92a105f68fad27ae1
5
+ SHA512:
6
+ data.tar.gz: deaf55baa40f828c8939d51d0f995e031ac682c159872b51910ba4e3b484286b27eaae8a239d60bc47871bf4e6a05c111d5bf952c76347f04037c37fe23d29cf
7
+ metadata.gz: e8beda307c4a1ccdad2fd743a8894cdb280e7587e7e30ae91b401421cdff5a85dbff1cc3d6666238eefd70363c8558f17e580ed5f646db27e06ba724ccdae0e4
@@ -1,5 +1,6 @@
1
1
  require "obzvonilka/api/version"
2
2
  require "obzvonilka/api/voice"
3
+ require "obzvonilka/asterisk/voice"
3
4
 
4
5
  module Obzvonilka
5
6
  module Api
@@ -7,5 +8,8 @@ module Obzvonilka
7
8
 
8
9
  end
9
10
 
11
+ module Asterisk
12
+
13
+ end
10
14
 
11
15
  end
@@ -1,5 +1,5 @@
1
1
  module Obzvonilka
2
2
  module Api
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,91 @@
1
+ require 'csv'
2
+ require 'date'
3
+
4
+ module Obzvonilka
5
+ module Asterisk
6
+ class Voice
7
+
8
+ # Path to asterisk CDR logs
9
+ LOGS_PATH = ENV['ASTERISK_CDR_CSV_PATH'] || '/var/log/asterisk/cdr-csv/Master.csv'
10
+ # Path to voice files root
11
+ FILES_PATH = ENV['ASTERISK_VOICE_FILES_DIR'] || '/var/spool/asterisk/monitor'
12
+
13
+ FILE_PATH_TEMPLATE = ENV['ASTERISK_VOICE_PATH_TEMPLATE'] || "#{FILES_PATH}/%Y/%m/%d/*-%ai.*"
14
+
15
+ # Amount of old file, then will be checked
16
+ PREV_FILE_CNT = ENV['ASTERISK_CHECK_FILE_COUNT'] || 100
17
+
18
+ TAIL_COMMAND = "tail -n #{PREV_FILE_CNT} -F '#{LOGS_PATH}'"
19
+
20
+ HEADINGS = [:accountcode, :src, :dst, :dcontet, :clid, :channel, :dstchannel, :lastapp, :lastdata,
21
+ :start, :answer, :end, :duration, :billsec, :disposition, :amaflags, :astid]
22
+
23
+ def self.send_voices
24
+ read_cdr_rows do |row|
25
+ file_name = get_voice_file_name(row)
26
+ if file_name
27
+ puts file_name
28
+ send_voice(row, file_name)
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.send_voice(row, file_name)
34
+ Obzvonilka::Api::Voice.new.put_voice row[:dst], row[:start], row[:end], file_name, row[:astid]
35
+ end
36
+
37
+ def self.read_cdr_rows
38
+ each_cdr_lines do |x|
39
+ yield parse_cdr_row(x.chomp)
40
+ end
41
+ end
42
+
43
+ def self.each_cdr_lines
44
+ IO.popen(TAIL_COMMAND).each_line { |x| yield x }
45
+ end
46
+
47
+ private
48
+ def self.get_voice_file_name(row, template = FILE_PATH_TEMPLATE)
49
+ file_name = make_voice_file_mask(row, template)
50
+ check_file_exists(file_name)
51
+ end
52
+
53
+ def self.check_file_exists(file_name)
54
+ Dir[file_name].first
55
+ end
56
+
57
+ def self.make_voice_file_mask(row, template)
58
+ process_template(row, template)
59
+ # "#{FILES_PATH}/#{row[:start].gsub(/^(\d\d\d\d)-(\d\d)-(\d\d).*/, '\\1/\\2/\\3')}/*-#{row[:astid]}.*"
60
+ end
61
+
62
+ def self.parse_cdr_row(line)
63
+ Hash[HEADINGS.zip(CSV.parse(line).first)]
64
+ end
65
+
66
+ # @param [String] template
67
+ # @param [Hash] row
68
+ # @return [String]
69
+ def self.process_template(row, template)
70
+ template.gsub /(%(?:a.|.))/ do |m|
71
+ case m
72
+ when '%ai'
73
+ row[:astid]
74
+ when '%as'
75
+ row[:src]
76
+ when '%ad'
77
+ row[:dst]
78
+ else
79
+ row_date(row).strftime(m)
80
+ end
81
+ end
82
+ end
83
+
84
+ def self.row_date(row)
85
+ date_time = "#{row[:start]}+00:00"
86
+ utc = DateTime.strptime(date_time, '%Y-%m-%d %H:%M:%S %Z')
87
+ utc.new_offset(DateTime.now.offset)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -27,9 +27,12 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
+ spec.required_ruby_version = '>= 1.8.7'
31
+
30
32
  spec.add_dependency "rest-client"
31
33
  spec.add_dependency "json"
32
34
  spec.add_development_dependency "bundler", "~> 1.10"
33
35
  spec.add_development_dependency "rake", "~> 10.0"
34
36
  spec.add_development_dependency "minitest"
37
+ spec.add_development_dependency "rcov" if RUBY_VERSION =~ /^1.8/
35
38
  end
metadata CHANGED
@@ -1,92 +1,81 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: obzvonilka-api
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - ukolovda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-22 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
11
+
12
+ date: 2015-12-23 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
14
15
  name: rest-client
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
16
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '>='
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - &id002
20
+ - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
34
23
  type: :runtime
24
+ version_requirements: *id001
25
+ - !ruby/object:Gem::Dependency
26
+ name: json
35
27
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
28
+ requirement: &id003 !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - *id002
31
+ type: :runtime
32
+ version_requirements: *id003
33
+ - !ruby/object:Gem::Dependency
42
34
  name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: '1.10'
48
- type: :development
49
35
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
36
+ requirement: &id004 !ruby/object:Gem::Requirement
37
+ requirements:
52
38
  - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '1.10'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '10.0'
39
+ - !ruby/object:Gem::Version
40
+ version: "1.10"
62
41
  type: :development
42
+ version_requirements: *id004
43
+ - !ruby/object:Gem::Dependency
44
+ name: rake
63
45
  prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
46
+ requirement: &id005 !ruby/object:Gem::Requirement
47
+ requirements:
66
48
  - - ~>
67
- - !ruby/object:Gem::Version
68
- version: '10.0'
69
- - !ruby/object:Gem::Dependency
49
+ - !ruby/object:Gem::Version
50
+ version: "10.0"
51
+ type: :development
52
+ version_requirements: *id005
53
+ - !ruby/object:Gem::Dependency
70
54
  name: minitest
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
55
+ prerelease: false
56
+ requirement: &id006 !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - *id002
76
59
  type: :development
60
+ version_requirements: *id006
61
+ - !ruby/object:Gem::Dependency
62
+ name: rcov
77
63
  prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
64
+ requirement: &id007 !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - *id002
67
+ type: :development
68
+ version_requirements: *id007
83
69
  description: Obzvonilka.ru API
84
- email:
70
+ email:
85
71
  - udmitry@mail.ru
86
72
  executables: []
73
+
87
74
  extensions: []
75
+
88
76
  extra_rdoc_files: []
89
- files:
77
+
78
+ files:
90
79
  - .gitignore
91
80
  - .travis.yml
92
81
  - CODE_OF_CONDUCT.md
@@ -99,30 +88,32 @@ files:
99
88
  - lib/obzvonilka/api.rb
100
89
  - lib/obzvonilka/api/version.rb
101
90
  - lib/obzvonilka/api/voice.rb
91
+ - lib/obzvonilka/asterisk/voice.rb
102
92
  - obzvonilka-api.gemspec
103
93
  homepage: https://github.com/ukolovda/abzvonilka-api
104
- licenses:
94
+ licenses:
105
95
  - MIT
106
- metadata:
96
+ metadata:
107
97
  allowed_push_host: https://rubygems.org
108
98
  post_install_message:
109
99
  rdoc_options: []
110
- require_paths:
100
+
101
+ require_paths:
111
102
  - lib
112
- required_ruby_version: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - '>='
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- required_rubygems_version: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - '>='
120
- - !ruby/object:Gem::Version
121
- version: '0'
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 1.8.7
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - *id002
122
111
  requirements: []
112
+
123
113
  rubyforge_project:
124
- rubygems_version: 2.4.8
114
+ rubygems_version: 2.0.17
125
115
  signing_key:
126
116
  specification_version: 4
127
117
  summary: Obzvonilka.ru API
128
118
  test_files: []
119
+