edgecast_cdn_report 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: eefc00e1b638e1ec481464ded14b603d3bc6dc80
4
+ data.tar.gz: b68cc32db3a305c0f61f9d889f4a224a31d299d0
5
+ SHA512:
6
+ metadata.gz: 07addd204829623413a1de1e734e61f6cfc88d31dc41de184f6635796e036a913e0090e234698a6b993daaf5c470b95c1de5396632fd69d771c333ee178f0093
7
+ data.tar.gz: b1ec65d0f23a1cd1efe8daa08b568eecd641b75a544992ebe6b52d717cdee54144abcd7f9f660be20d23f8bb99d84732b706abf63fa7a5c7227a246cc06b9be2
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'edgecast_cdn_report'
4
+
5
+ if ARGV.count
6
+ path_to_config = ARGV[0]
7
+ else
8
+ path_to_config = 'config.yml'
9
+ end
10
+
11
+ EdgecastCdnReport.new(path_to_config).output
@@ -0,0 +1,162 @@
1
+ require 'httparty'
2
+ require 'date'
3
+ require 'json'
4
+ require 'yaml'
5
+ require 'active_support/core_ext/date/calculations.rb'
6
+ require 'active_support/core_ext/time/calculations.rb'
7
+ require 'active_support/core_ext/hash/slice.rb'
8
+ require 'terminal-table'
9
+
10
+ class EdgecastCdnReport
11
+
12
+ BASE_URI = "https://api.edgecast.com/v2/reporting/customers"
13
+
14
+ TB_INBYTES = 10**12
15
+ GB_INBYTES = 10**9
16
+ MB_INBYTES = 10**6
17
+
18
+ attr_accessor :customer_id, :token, :report_date, :cname_groups
19
+
20
+ def initialize(config_file, report_date=Date.today)
21
+ if config_file.nil?
22
+ raise "Please provide a config file #{config_file} "
23
+ end
24
+ @config = YAML.load_file(config_file)
25
+
26
+ self.customer_id = @config['customer_id']
27
+ self.token = @config['token']
28
+ self.cname_groups = @config['cname_groups']
29
+ self.report_date = report_date
30
+ end
31
+
32
+ def base_uri
33
+ BASE_URI+'/'+customer_id
34
+ end
35
+
36
+ def get uri
37
+ response = HTTParty.get(base_uri + uri, :headers => {"Authorization" => "TOK:#{token}"})
38
+ JSON.parse(response.body)
39
+ end
40
+
41
+ def total_data_transfer(month)
42
+ result = self.get "/media/3/region/-1/units/2/trafficusage?begindate=#{month}-01"
43
+ result['UsageResult'].to_f * GB_INBYTES
44
+ end
45
+
46
+ def data_transfer_by_cname(start_date, end_date)
47
+ result = self.get "/media/3/cnamereportcodes?begindate=#{start_date}&enddate=#{end_date}"
48
+ data_transfers = {}
49
+
50
+ result.each do |cname_data|
51
+ data_transfers[cname_data['Description']] = cname_data['Bytes'].to_f
52
+ end
53
+
54
+ data_transfers
55
+ end
56
+
57
+ #month_to_date_data
58
+ def mtd_data_by_cname
59
+ @mtd_data_by_cname ||= data_transfer_by_cname(report_date.beginning_of_month, report_date)
60
+ end
61
+
62
+ #last_month_data
63
+ def lm_data_by_cname
64
+ @lm_data_by_cname ||= data_transfer_by_cname(report_date.last_month.beginning_of_month, report_date.last_month.end_of_month)
65
+ end
66
+
67
+ #last_month_to_date_data
68
+ def lmtd_data_by_cname
69
+ @lmtd_data_by_cname ||= data_transfer_by_cname(report_date.last_month.beginning_of_month, report_date.last_month)
70
+ end
71
+
72
+ #total_current_month_data
73
+ def tcm_data
74
+ @tcm_data ||= total_data_transfer(report_date.strftime("%Y-%m"));
75
+ end
76
+
77
+ #total_last_month_data
78
+ def tlm_data
79
+ @tlm_data ||= total_data_transfer(report_date.last_month.strftime("%Y-%m"))
80
+ end
81
+
82
+ def total_row
83
+ ['Total', f(tcm_data), '', f(tlm_data)]
84
+ end
85
+
86
+ def sum_rows rows
87
+ rows.transpose.map do |row|
88
+ f(row.inject{ |sum, i| sum.to_f + i.to_f})
89
+ end
90
+ end
91
+
92
+ def hash_to_row h
93
+ h.map do |cname, data|
94
+ [cname, *data.map{|x| f(x)}]
95
+ end
96
+ end
97
+
98
+ def grouped_cname_rows
99
+ cnames = [mtd_data_by_cname, lmtd_data_by_cname, lm_data_by_cname].flat_map(&:keys).uniq
100
+
101
+ cname_data = {}
102
+ cnames.each do |cname|
103
+ cname_data[cname] = [mtd_data_by_cname[cname], lmtd_data_by_cname[cname], lm_data_by_cname[cname]]
104
+ end
105
+
106
+ grouped_cnames_data = []
107
+ cname_groups.each do |group, cnames|
108
+ group_cnames = cname_data.extract!(*cnames)
109
+
110
+ grouped_cnames_data << [group.upcase, *sum_rows(group_cnames.values)]
111
+
112
+ grouped_cnames_data += hash_to_row(group_cnames)
113
+ end
114
+
115
+ if (cname_data.length > 0)
116
+ grouped_cnames_data << ['Others', *sum_rows(cname_data.values)]
117
+ grouped_cnames_data += hash_to_row(cname_data)
118
+ end
119
+
120
+ grouped_cnames_data
121
+ end
122
+
123
+ def unaccounted_row
124
+ total_todate_cname = mtd_data_by_cname.values.reduce(:+)
125
+ total_last_month_cname = lm_data_by_cname.values.reduce(:+)
126
+
127
+ ['Unaccounted', f(tcm_data-total_todate_cname), '', f(tlm_data-total_last_month_cname)]
128
+ end
129
+
130
+ #format
131
+ def f(bytes)
132
+ if bytes.nil?
133
+ "Na"
134
+ elsif(bytes/TB_INBYTES > 1)
135
+ (bytes.to_f/TB_INBYTES).round(2).to_s + ' TB'
136
+ elsif(bytes/GB_INBYTES > 1)
137
+ (bytes.to_f/GB_INBYTES).round(2).to_s + ' GB'
138
+ else
139
+ (bytes.to_f/MB_INBYTES).round(2).to_s + ' MB'
140
+ end
141
+ end
142
+
143
+ def output
144
+ header = ['CNAME', 'Cur MTD', 'Last MTD', 'Last Total']
145
+ cname_group_names = cname_groups.keys.map(&:downcase)
146
+
147
+ table = Terminal::Table.new headings: header do |t|
148
+ t << total_row
149
+ t << :separator
150
+ t << unaccounted_row
151
+
152
+ grouped_cname_rows.each do |row|
153
+ t << :separator if (cname_group_names.include? row[0].downcase)
154
+ t << row
155
+ end
156
+ end
157
+
158
+ puts "Date : #{report_date} \n"
159
+ puts table
160
+ end
161
+
162
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: edgecast_cdn_report
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kurniawan and Mohan Krishnan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.13.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.13.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 4.1.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 4.1.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.5
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.5
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.3.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 10.3.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 5.5.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 5.5.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.19.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.19.0
111
+ description: This script will help you generate a text report of your current month
112
+ Edgecast CDN data transfer
113
+ email:
114
+ - pair+kurniawan+mohan@kmkonline.co.id
115
+ executables:
116
+ - edgecast_cdn_report
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - bin/edgecast_cdn_report
121
+ - lib/edgecast_cdn_report.rb
122
+ homepage: https://github.com/KMK-ONLINE/edgecast-cdn-report
123
+ licenses:
124
+ - BSD
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.2.2
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Simple script to generate edgecast report by cnames
146
+ test_files: []