xcskarel 0.0.1 → 0.2
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 +4 -4
- data/bin/xcskarel +79 -0
- data/lib/karel/filter.rb +28 -0
- data/lib/karel/log.rb +40 -0
- data/lib/karel/server.rb +90 -0
- data/lib/karel/version.rb +3 -0
- data/lib/xcskarel.rb +4 -5
- metadata +112 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8554a8191907bcc3d6b14bde66f344d3d6e9bf2c
|
4
|
+
data.tar.gz: 132b062bb5c4ee7259cb4052cdf011160cc7af03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0a88b3aec7d56c1ceac71cf936941a3f67a43362f9ac7090e230e69f7ab9dec3208c9ed323b194fc7beef611901881ae7d0732044983376f6adf8c0ec6e18ed
|
7
|
+
data.tar.gz: 40936af2da7f3212bb3fe90b7d6206d765038cefa503b603df63932b1799188878ea506653bbbaf15c95a19e022dd7f8606b9fd988c1e48c4afd3795944c647c
|
data/bin/xcskarel
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('../../lib', __FILE__)
|
4
|
+
|
5
|
+
require 'xcskarel'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'commander'
|
8
|
+
|
9
|
+
XCSKarel.set_no_log(true)
|
10
|
+
|
11
|
+
class XCSKarelApplication
|
12
|
+
include Commander::Methods
|
13
|
+
|
14
|
+
def add_xcs_options(c)
|
15
|
+
c.option '--host Hostname', '(required) Xcode Server\'s hostname or IP address'
|
16
|
+
c.option '--user Username', 'Xcode Server username'
|
17
|
+
c.option '--pass Password', 'Xcode Server password'
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_server_from_options(options)
|
21
|
+
raise "No hostname was specified, please see `xcskarel --help`" unless options.host
|
22
|
+
XCSKarel::Server.new(options.host, options.user, options.pass)
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
program :name, 'xcskarel'
|
27
|
+
program :version, XCSKarel::VERSION
|
28
|
+
program :description, 'Tool for managing your Xcode Server & Bot configurations'
|
29
|
+
program :help, 'Author', 'Honza Dvorsky <http://honzadvorsky.com>'
|
30
|
+
program :help, 'GitHub', 'https://github.com/czechboy0/xcskarel'
|
31
|
+
|
32
|
+
global_option('--verbose', 'Print internal logs') { XCSKarel.set_no_log(false) }
|
33
|
+
global_option('--no_pretty', 'Disables output JSON prettification')
|
34
|
+
global_option('--no_filter', 'Prints full JSON payload for objects instead of just filtering the important ones')
|
35
|
+
|
36
|
+
command :bots do |c|
|
37
|
+
c.syntax = 'xcskarel bots [options]'
|
38
|
+
c.description = 'Fetches all Bots found on the specified server'
|
39
|
+
c.example 'get all bot names & identifiers', 'xcskarel bots --hostname 127.0.0.1'
|
40
|
+
c.example 'get all bot metadata', 'xcskarel bots --no_filter --hostname 127.0.0.1'
|
41
|
+
add_xcs_options(c)
|
42
|
+
c.action do |args, options|
|
43
|
+
server = create_server_from_options(options)
|
44
|
+
all_bots = server.get_bots
|
45
|
+
unless options.no_filter
|
46
|
+
all_bots = XCSKarel.filter_array(all_bots, ['name', '_id'])
|
47
|
+
end
|
48
|
+
out = options.no_pretty ? JSON.generate(all_bots) : JSON.pretty_generate(all_bots)
|
49
|
+
puts out
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
command :integrations do |c|
|
54
|
+
c.syntax = 'xcskarel integrations [options]'
|
55
|
+
c.description = 'Fetches all Integrations for a specified Bot identifier'
|
56
|
+
c.example 'get all integration identifiers, numbers & results', 'xcskarel integrations --bot BOT_ID --hostname 127.0.0.1'
|
57
|
+
add_xcs_options(c)
|
58
|
+
c.option '--bot BOT_ID', '(required) Bot identifier'
|
59
|
+
c.action do |args, options|
|
60
|
+
raise "No Bot id was specified, please see `xcskarel integrations --help`" unless options.bot
|
61
|
+
server = create_server_from_options(options)
|
62
|
+
all_integrations = server.get_integrations(options.bot)
|
63
|
+
unless options.no_filter
|
64
|
+
all_integrations = XCSKarel.filter_array(all_integrations, ['number', '_id', 'currentStep', 'result'])
|
65
|
+
end
|
66
|
+
out = options.no_pretty ? JSON.generate(all_integrations) : JSON.pretty_generate(all_integrations)
|
67
|
+
puts out
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
run!
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
XCSKarelApplication.new.run
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
data/lib/karel/filter.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module XCSKarel
|
5
|
+
# returns a copy of the passed-in hash with only the provided keypaths kept
|
6
|
+
# e.g. "name" will keep the key "name" at the top level.
|
7
|
+
# TODO: support even nested keypaths
|
8
|
+
def self.filter_key_paths(hash, key_paths)
|
9
|
+
new_hash = Hash.new
|
10
|
+
keys = Set.new(key_paths)
|
11
|
+
hash.each do |k,v|
|
12
|
+
if keys.member?(k)
|
13
|
+
new_hash[k] = v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
return new_hash
|
17
|
+
end
|
18
|
+
|
19
|
+
# filters each element
|
20
|
+
def self.filter_array(array, key_paths)
|
21
|
+
new_array = Array.new
|
22
|
+
keys = Set.new(key_paths)
|
23
|
+
array.each do |i|
|
24
|
+
new_array << filter_key_paths(i, key_paths)
|
25
|
+
end
|
26
|
+
return new_array
|
27
|
+
end
|
28
|
+
end
|
data/lib/karel/log.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'colored'
|
3
|
+
|
4
|
+
module XCSKarel
|
5
|
+
|
6
|
+
@@NO_LOG = false
|
7
|
+
|
8
|
+
def self.set_no_log(no_log)
|
9
|
+
@@NO_LOG = no_log
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.log
|
13
|
+
|
14
|
+
@@log ||= Logger.new($stdout)
|
15
|
+
|
16
|
+
@@log.formatter = proc do |severity, datetime, progname, msg|
|
17
|
+
|
18
|
+
unless @@NO_LOG
|
19
|
+
string = "#{severity} [#{datetime.strftime('%Y-%m-%d %H:%M:%S.%2N')}]: "
|
20
|
+
second = "#{msg}\n"
|
21
|
+
|
22
|
+
if severity == "DEBUG"
|
23
|
+
string = string.magenta
|
24
|
+
elsif severity == "INFO"
|
25
|
+
string = string.white
|
26
|
+
elsif severity == "WARN"
|
27
|
+
string = string.yellow
|
28
|
+
elsif severity == "ERROR"
|
29
|
+
string = string.red
|
30
|
+
elsif severity == "FATAL"
|
31
|
+
string = string.red.bold
|
32
|
+
end
|
33
|
+
|
34
|
+
[string, second].join("")
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
@@log
|
39
|
+
end
|
40
|
+
end
|
data/lib/karel/server.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'excon'
|
2
|
+
require 'pry'
|
3
|
+
require 'karel/log'
|
4
|
+
require 'json'
|
5
|
+
require 'base64'
|
6
|
+
|
7
|
+
module XCSKarel
|
8
|
+
|
9
|
+
class Server
|
10
|
+
|
11
|
+
attr_reader :host
|
12
|
+
attr_reader :user
|
13
|
+
attr_reader :pass
|
14
|
+
attr_reader :port
|
15
|
+
|
16
|
+
def initialize(host, user=nil, pass=nil, allow_self_signed=true)
|
17
|
+
@port = 20343
|
18
|
+
@host = validate_host(host)
|
19
|
+
@user = user
|
20
|
+
@pass = pass
|
21
|
+
validate_connection(allow_self_signed)
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_bots
|
25
|
+
response = get_endpoint('/bots')
|
26
|
+
raise "You are unauthorized to access data on #{@host}, please check that you're passing in a correct username and password.".red if response.status == 401
|
27
|
+
raise "Failed to fetch Bots from Xcode Server at #{@host}, response: #{response.status}: #{response.body}.".red if response.status != 200
|
28
|
+
JSON.parse(response.body)['results']
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_integrations(bot_id)
|
32
|
+
response = get_endpoint("/bots/#{bot_id}/integrations?limit=10")
|
33
|
+
raise "Failed to fetch Integrations for Bot #{bot_id} from Xcode Server at #{@host}, response: #{response.status}: #{response.body}".red if response.status != 200
|
34
|
+
JSON.parse(response.body)['results']
|
35
|
+
end
|
36
|
+
|
37
|
+
def headers
|
38
|
+
headers = {
|
39
|
+
'user-agent' => 'xcskarel', # XCS wants user agent. for some API calls. not for others. sigh.
|
40
|
+
'X-XCSAPIVersion' => 6 # XCS API version with this API, currently 6 with Xcode 7 Beta 6.
|
41
|
+
}
|
42
|
+
|
43
|
+
if @user && @pass
|
44
|
+
userpass = "#{@user}:#{@pass}"
|
45
|
+
headers['Authorization'] = "Basic #{Base64.strict_encode64(userpass)}"
|
46
|
+
end
|
47
|
+
|
48
|
+
return headers
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_endpoint(endpoint)
|
52
|
+
url = url_for_endpoint(endpoint)
|
53
|
+
headers = self.headers || {}
|
54
|
+
response = Excon.get(url, :headers => headers)
|
55
|
+
XCSKarel.log.debug "GET endpoint #{endpoint} => #{url} => Response #{response.data[:status_line].gsub("\n", "")}"
|
56
|
+
return response
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def url_for_endpoint(endpoint)
|
62
|
+
"#{@host}:#{@port}/api#{endpoint}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def validate_host(host)
|
66
|
+
comps = host.split(":")
|
67
|
+
raise "Scheme must be unspecified or https, nothing else" if comps.count > 1 && comps[0] != 'https'
|
68
|
+
host_with_https = comps.count > 1 ? host : "https://#{host}"
|
69
|
+
return host_with_https
|
70
|
+
end
|
71
|
+
|
72
|
+
def validate_connection(allow_self_signed)
|
73
|
+
|
74
|
+
# check for allowing self-signed certs
|
75
|
+
Excon.defaults[:ssl_verify_peer] = !allow_self_signed
|
76
|
+
|
77
|
+
# TODO: logout/login to validate user/pass
|
78
|
+
|
79
|
+
# try to connect to the host
|
80
|
+
begin
|
81
|
+
response = get_endpoint("/ping")
|
82
|
+
rescue Exception => e
|
83
|
+
raise "Failed to validate - #{e}.\nPlease make sure your Xcode Server is up and running at #{host}".red
|
84
|
+
else
|
85
|
+
raise "Failed to validate - Endpoint at \"#{url}\" responded with #{response.data[:status_line]}".red if response.status != 204
|
86
|
+
XCSKarel.log.info "Validation of host #{@host} succeeded.".green
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/xcskarel.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcskarel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Honza Dvorsky
|
@@ -9,15 +9,120 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-08-26 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
13
|
-
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: excon
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.45.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.45.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.8.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.8.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: logger
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.8
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.8
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: colored
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.2'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: commander
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.3.5
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.3.5
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.10.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.10.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.2.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.2.0
|
111
|
+
description: Tool for managing your Xcode Server & Bot configurations from the command
|
112
|
+
line
|
14
113
|
email: http://honzadvorsky.com
|
15
|
-
executables:
|
114
|
+
executables:
|
115
|
+
- xcskarel
|
16
116
|
extensions: []
|
17
117
|
extra_rdoc_files: []
|
18
118
|
files:
|
119
|
+
- bin/xcskarel
|
120
|
+
- lib/karel/filter.rb
|
121
|
+
- lib/karel/log.rb
|
122
|
+
- lib/karel/server.rb
|
123
|
+
- lib/karel/version.rb
|
19
124
|
- lib/xcskarel.rb
|
20
|
-
homepage: http://
|
125
|
+
homepage: http://github.com/czechboy0/xcskarel
|
21
126
|
licenses:
|
22
127
|
- MIT
|
23
128
|
metadata: {}
|
@@ -29,7 +134,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
29
134
|
requirements:
|
30
135
|
- - ">="
|
31
136
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
137
|
+
version: 2.0.0
|
33
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
139
|
requirements:
|
35
140
|
- - ">="
|
@@ -40,6 +145,6 @@ rubyforge_project:
|
|
40
145
|
rubygems_version: 2.4.5
|
41
146
|
signing_key:
|
42
147
|
specification_version: 4
|
43
|
-
summary: Manage Xcode
|
148
|
+
summary: Manage your Xcode Server & Bots from the command line
|
44
149
|
test_files: []
|
45
150
|
has_rdoc:
|