factor 0.0.6 → 0.0.7
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.
- data/lib/cli/channel_task.rb +28 -11
- data/lib/cli/command.rb +10 -0
- data/lib/cli/credential_task.rb +11 -5
- data/lib/cli/factor_task.rb +7 -27
- data/lib/cli/server_task.rb +4 -7
- data/lib/cli/workflow_task.rb +20 -2
- data/lib/client/client.rb +88 -6
- data/lib/runtime/engine.rb +28 -12
- metadata +49 -1
data/lib/cli/channel_task.rb
CHANGED
@@ -1,25 +1,42 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'cli/command'
|
3
|
+
require 'zip/zip'
|
4
|
+
require 'zip/zipfilesystem'
|
3
5
|
|
4
6
|
module Factor
|
5
7
|
module CLI
|
6
8
|
class ChannelTask < Command
|
7
|
-
|
8
|
-
desc "
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
|
10
|
+
desc "call CHANNEL METHOD TARGET","start a workflow"
|
11
|
+
method_option :parameters, :type=>:hash, :default=>{}, :required=>false
|
12
|
+
def call(channel, method, target)
|
13
|
+
|
14
|
+
puts "not implemented"
|
15
|
+
|
14
16
|
end
|
15
17
|
|
16
|
-
|
18
|
+
|
19
|
+
|
20
|
+
desc "list", "list all the channels"
|
21
|
+
#method_option :key, :alias=>"-k", :type=>:string, :desc=>"key reference"
|
17
22
|
def list
|
23
|
+
puts @client.get_channels
|
18
24
|
end
|
19
|
-
|
20
|
-
desc "
|
21
|
-
def
|
25
|
+
|
26
|
+
desc "add NAME DIRECTORY", "add a key and value for the credential"
|
27
|
+
def add(name,directory)
|
28
|
+
|
29
|
+
#contents=File.open(File.expand_path(filename), "rb") {|f| f.read}
|
30
|
+
|
31
|
+
puts @client.add_channel(name,directory)
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "remove NAME", "remove a workflow"
|
35
|
+
def remove(name)
|
36
|
+
puts @client.remove_channel(name)
|
22
37
|
end
|
38
|
+
|
39
|
+
|
23
40
|
end
|
24
41
|
end
|
25
42
|
end
|
data/lib/cli/command.rb
CHANGED
@@ -9,11 +9,21 @@ module Factor
|
|
9
9
|
module CLI
|
10
10
|
class Command < Thor
|
11
11
|
CONFIG_FILE_DIR = File.expand_path("~/.factor")
|
12
|
+
|
13
|
+
|
12
14
|
no_tasks do
|
15
|
+
|
16
|
+
def initialize(*vals)
|
17
|
+
@client = Factor::Client::Client.new
|
18
|
+
@client.login_token(get_config[:token])
|
19
|
+
super(*vals)
|
20
|
+
end
|
21
|
+
|
13
22
|
def save_config(config)
|
14
23
|
File.open(CONFIG_FILE_DIR,'w') do |file|
|
15
24
|
YAML::dump(config,file)
|
16
25
|
end
|
26
|
+
@client.login_token(get_config[:token])
|
17
27
|
end
|
18
28
|
|
19
29
|
def get_config
|
data/lib/cli/credential_task.rb
CHANGED
@@ -5,16 +5,22 @@ module Factor
|
|
5
5
|
module CLI
|
6
6
|
class CredentialTask < Command
|
7
7
|
|
8
|
-
desc "list", "list all the credentials"
|
9
|
-
|
8
|
+
desc "list [KEY]", "list all the credentials"
|
9
|
+
#method_option :key, :alias=>"-k", :type=>:string, :desc=>"key reference"
|
10
|
+
def list(key="")
|
11
|
+
puts @client.get_credential(key)["value"]
|
10
12
|
end
|
11
13
|
|
12
|
-
desc "
|
13
|
-
|
14
|
+
desc "set KEY VALUE", "add a key and value for the credential"
|
15
|
+
#method_option :key, :alias=>"-k", :type=>:string, :desc=>"key reference"
|
16
|
+
#method_option :value, :alias=>"-v", :type=>:string, :desc=>"values"
|
17
|
+
def set(key,value)
|
18
|
+
puts @client.set_credential(key,value)
|
14
19
|
end
|
15
20
|
|
16
21
|
desc "remove KEY", "remove a value from the credentials bag"
|
17
|
-
def remove
|
22
|
+
def remove(key)
|
23
|
+
puts @client.remove_credential(key)
|
18
24
|
end
|
19
25
|
|
20
26
|
end
|
data/lib/cli/factor_task.rb
CHANGED
@@ -8,34 +8,13 @@ module Factor
|
|
8
8
|
module CLI
|
9
9
|
class FactorTask < Command
|
10
10
|
|
11
|
-
desc "
|
12
|
-
method_option :email, :alias=>"-e", :type=>:string, :desc=>"Email address
|
13
|
-
method_option :
|
14
|
-
def
|
15
|
-
email = options[:email]==nil ? ask("Email address:") : options[:email]
|
16
|
-
password = options[:password]==nil ? ask("Password:") : options[:password]
|
17
|
-
|
18
|
-
# register with email/password
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "login", "login to the account"
|
23
|
-
method_option :email, :alias=>"-u", :type=>:string, :desc=>"Account email address"
|
24
|
-
method_option :password, :alias=>"-p", :type=>:string, :desc=>"Account password"
|
25
|
-
def login
|
26
|
-
email = options[:email]==nil ? ask("Email address:") : options[:email]
|
27
|
-
password = options[:password]==nil ? ask("Password:") : options[:password]
|
28
|
-
|
29
|
-
#login with email/password
|
30
|
-
end
|
31
|
-
|
32
|
-
desc "token", "login with token"
|
33
|
-
method_option :email, :alias=>"-e", :type=>:string, :desc=>"Email address for Factor account", :required=>true
|
34
|
-
method_option :token, :alias=>"-t", :type=>:string, :desc=>"Token value to set", :required=>true
|
35
|
-
def token
|
11
|
+
desc "login EMAIL TOKEN", "login with token"
|
12
|
+
# method_option :email, :alias=>"-e", :type=>:string, :desc=>"Email address for Factor account", :required=>true
|
13
|
+
# method_option :token, :alias=>"-t", :type=>:string, :desc=>"Token value to set", :required=>true
|
14
|
+
def login(email,token)
|
36
15
|
config = get_config
|
37
|
-
config[:
|
38
|
-
config[:
|
16
|
+
config[:email]=email
|
17
|
+
config[:token]=token
|
39
18
|
save_config(config)
|
40
19
|
end
|
41
20
|
end
|
@@ -45,3 +24,4 @@ end
|
|
45
24
|
Factor::CLI::FactorTask.register(Factor::CLI::ServerTask, "server","server","start and list servers")
|
46
25
|
Factor::CLI::FactorTask.register(Factor::CLI::WorkflowTask,"workflow","workflow","start and list workflows")
|
47
26
|
Factor::CLI::FactorTask.register(Factor::CLI::ChannelTask,"channel","channel","install,uninstall, list channels")
|
27
|
+
Factor::CLI::FactorTask.register(Factor::CLI::CredentialTask,"credential","credential","manage remote credential store")
|
data/lib/cli/server_task.rb
CHANGED
@@ -7,20 +7,17 @@ module Factor
|
|
7
7
|
desc "start", "start the server"
|
8
8
|
def start
|
9
9
|
engine = Factor::Runtime::Engine.new(get_config[:email],get_config[:token])
|
10
|
-
|
11
|
-
client = Factor::Client::Client.new
|
12
|
-
client.login_token(get_config[:token])
|
13
|
-
|
10
|
+
|
14
11
|
puts "loading channels"
|
15
|
-
engine = client.load_channels(engine)
|
12
|
+
engine = @client.load_channels(engine)
|
16
13
|
puts "loading channels complete"
|
17
14
|
|
18
15
|
puts "loading workflows"
|
19
|
-
engine = client.load_workflows(engine)
|
16
|
+
engine = @client.load_workflows(engine)
|
20
17
|
puts "loading workflows complete"
|
21
18
|
|
22
19
|
puts "loading credentials"
|
23
|
-
engine = client.load_credentials(engine)
|
20
|
+
engine = @client.load_credentials(engine)
|
24
21
|
puts "loading credentials complete"
|
25
22
|
|
26
23
|
puts "starting the server..."
|
data/lib/cli/workflow_task.rb
CHANGED
@@ -16,11 +16,29 @@ module Factor
|
|
16
16
|
puts "workflow executed with id #{id}"
|
17
17
|
end
|
18
18
|
|
19
|
-
desc "list", "list all available workflows"
|
20
|
-
def list
|
21
19
|
|
22
20
|
|
21
|
+
desc "list", "list all the workflows"
|
22
|
+
#method_option :key, :alias=>"-k", :type=>:string, :desc=>"key reference"
|
23
|
+
def list
|
24
|
+
puts @client.get_workflow
|
23
25
|
end
|
26
|
+
|
27
|
+
desc "add NAME FILENAME", "add a key and value for the credential"
|
28
|
+
#method_option :key, :alias=>"-k", :type=>:string, :desc=>"key reference"
|
29
|
+
#method_option :value, :alias=>"-v", :type=>:string, :desc=>"values"
|
30
|
+
def add(name,filename)
|
31
|
+
contents=File.open(File.expand_path(filename), "rb") {|f| f.read}
|
32
|
+
puts @client.add_workflow(name,contents)
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "remove NAME", "remove a workflow"
|
36
|
+
def remove(name)
|
37
|
+
puts @client.remove_workflow(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
24
42
|
end
|
25
43
|
end
|
26
44
|
end
|
data/lib/client/client.rb
CHANGED
@@ -2,12 +2,13 @@ require 'rubygems'
|
|
2
2
|
require 'rest_client'
|
3
3
|
require 'zip'
|
4
4
|
require 'zip/zipfilesystem'
|
5
|
+
require 'zip/zip'
|
5
6
|
require 'open-uri'
|
6
7
|
|
7
8
|
module Factor
|
8
9
|
module Client
|
9
10
|
class Client
|
10
|
-
HOST = "http://
|
11
|
+
HOST = "http://factor.io"
|
11
12
|
|
12
13
|
def register(email,password)
|
13
14
|
end
|
@@ -30,15 +31,59 @@ module Factor
|
|
30
31
|
end
|
31
32
|
|
32
33
|
def load_credentials(engine)
|
33
|
-
|
34
|
-
credentials_definition = rest_get("credentials")
|
35
|
-
credentials = JSON.parse(credentials_definition["bag"])
|
34
|
+
credentials = rest_get("credentials")
|
36
35
|
engine.load_credentials(credentials)
|
37
36
|
|
38
37
|
engine
|
39
38
|
end
|
40
39
|
|
41
40
|
|
41
|
+
def set_credential(key,value)
|
42
|
+
# this is a PUT not POST because it is technically editing, not creating a new one
|
43
|
+
rest_put("credentials",{:key=>key,:value=>value})
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_credential(key="")
|
47
|
+
rest_get("credentials",{:key=>key})
|
48
|
+
end
|
49
|
+
|
50
|
+
def remove_credential(key="")
|
51
|
+
rest_delete("credentials",{:key=>key})
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
# workflows
|
58
|
+
def add_workflow(key,definition)
|
59
|
+
rest_post("workflows",{:name=>key,:definition=>definition})
|
60
|
+
end
|
61
|
+
|
62
|
+
# def get_workflow()
|
63
|
+
# rest_get("workflows")
|
64
|
+
# end
|
65
|
+
|
66
|
+
def remove_workflow(name="")
|
67
|
+
rest_delete("workflows",{:name=>name})
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# channels
|
72
|
+
def add_channel(key,path)
|
73
|
+
file=zip(path)
|
74
|
+
rest_post("channels",{:name=>key,:zip=>file})
|
75
|
+
end
|
76
|
+
|
77
|
+
# def get_channel()
|
78
|
+
# rest_get("channels")
|
79
|
+
# end
|
80
|
+
|
81
|
+
def remove_channel(name="")
|
82
|
+
rest_delete("channels",{:name=>name})
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
|
42
87
|
def load_channels(engine)
|
43
88
|
|
44
89
|
# get list of channels
|
@@ -108,9 +153,46 @@ module Factor
|
|
108
153
|
end
|
109
154
|
FileUtils.rm(zip) if remove_after
|
110
155
|
end
|
156
|
+
|
157
|
+
def zip(directory)
|
158
|
+
path=directory.dup
|
159
|
+
path.sub!(%r[/$],'')
|
160
|
+
zip_path = File.join(path,File.basename(path))+'.zip'
|
161
|
+
FileUtils.rm zip_path, :force=>true
|
162
|
+
Zip::ZipFile.open(zip_path, 'w') do |zip|
|
163
|
+
Dir["#{path}/**/**"].reject{|f|f==zip_path}.each do |file|
|
164
|
+
zip.add(file.sub(path+'/',''),file)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
File.open(zip_path,'r')
|
168
|
+
end
|
111
169
|
|
112
|
-
def rest_get(path)
|
113
|
-
|
170
|
+
def rest_get(path,params={})
|
171
|
+
params["auth_token"]=@token
|
172
|
+
|
173
|
+
param_string=params.map{|key,value| "#{key}=#{value}"}.join("&")
|
174
|
+
|
175
|
+
JSON.parse(RestClient.get("#{HOST}/#{path}.json?#{param_string}"))
|
176
|
+
end
|
177
|
+
|
178
|
+
def rest_put(path,params={})
|
179
|
+
params["auth_token"]=@token
|
180
|
+
|
181
|
+
JSON.parse(RestClient.put("#{HOST}/#{path}.json",params))
|
182
|
+
end
|
183
|
+
|
184
|
+
def rest_post(path,params={})
|
185
|
+
#params["auth_token"]=@token
|
186
|
+
|
187
|
+
JSON.parse(RestClient.post("#{HOST}/#{path}.json?auth_token=#{@token}",params))
|
188
|
+
end
|
189
|
+
|
190
|
+
def rest_delete(path,params={})
|
191
|
+
params["auth_token"]=@token
|
192
|
+
|
193
|
+
param_string=params.map{|key,value| "#{key}=#{value}"}.join("&")
|
194
|
+
|
195
|
+
JSON.parse(RestClient.delete("#{HOST}/#{path}.json?#{param_string}"))
|
114
196
|
end
|
115
197
|
|
116
198
|
end
|
data/lib/runtime/engine.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'factor'
|
3
3
|
require 'mustache'
|
4
|
+
require 'facter'
|
5
|
+
require 'siren'
|
4
6
|
|
5
7
|
|
6
8
|
module Factor
|
@@ -73,21 +75,26 @@ module Factor
|
|
73
75
|
action = activity["action"]
|
74
76
|
channel = activity["channel"]
|
75
77
|
method = activity["method"]
|
78
|
+
target = activity["target"]
|
76
79
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
80
|
+
|
81
|
+
if match(target)
|
82
|
+
|
83
|
+
values = message.body.merge(@credentials)
|
84
|
+
# puts "[values] #{values}"
|
85
|
+
# this maps the input values passed in with the templated defined in the workflow
|
86
|
+
params = Hash.new
|
87
|
+
activity["params"].each do |key,template|
|
88
|
+
params[key]=Mustache.render(template,values)
|
89
|
+
end
|
90
|
+
# puts "[calling] #{channel}::#{method} (#{params.to_s})"
|
91
|
+
event = call_channel_method(channel,method,params)
|
86
92
|
|
87
|
-
|
93
|
+
response_message = message.respond(event.params,event.class.name.split("::").last)
|
88
94
|
|
89
95
|
|
90
|
-
|
96
|
+
@message_bus.send response_message
|
97
|
+
end
|
91
98
|
|
92
99
|
end
|
93
100
|
else
|
@@ -97,12 +104,21 @@ module Factor
|
|
97
104
|
end
|
98
105
|
end
|
99
106
|
|
100
|
-
|
101
107
|
def call_channel_method(channel_name,class_name,params)
|
102
108
|
channel_module = @channel_modules[channel_name]
|
103
109
|
command = channel_module.const_get(class_name)
|
104
110
|
command.new.do_work(params)
|
105
111
|
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def match(target)
|
116
|
+
return true if target==nil || target==""
|
117
|
+
[key,value]=target.split("=")
|
118
|
+
Facter[key]==value
|
119
|
+
end
|
120
|
+
|
121
|
+
|
106
122
|
end
|
107
123
|
end
|
108
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -123,6 +123,54 @@ dependencies:
|
|
123
123
|
- - ! '>='
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: 0.9.8
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rubyzip
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: siren
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: facter
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
126
174
|
description: Friendly command-line interface and library for Factor
|
127
175
|
email: maciej@skierkowski.com
|
128
176
|
executables:
|