factor 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 "install NAME", "install a new channel"
9
- def install(name)
10
- end
11
-
12
- desc "uninstall NAME", "uninstall the channel"
13
- def uninstall(name)
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
- desc "list", "list all my installed channels"
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 "all", "list all channels available for installation"
21
- def all
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
@@ -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
- def list
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 "add KEY VALUE", "add a key and value for the credential"
13
- def add
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
@@ -8,34 +8,13 @@ module Factor
8
8
  module CLI
9
9
  class FactorTask < Command
10
10
 
11
- desc "register","register a new account"
12
- method_option :email, :alias=>"-e", :type=>:string, :desc=>"Email address you would like to use for new account"
13
- method_option :password, :alias=>"-p", :type=>:string, :desc=>"Password you would like to use for new account"
14
- def register
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[:token]=options[:token]
38
- config[:email]=options[:email]
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")
@@ -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..."
@@ -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://localhost:3000"
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
- JSON.parse(RestClient.get "#{HOST}/#{path}.json?auth_token=#{@token}")
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
@@ -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
- values = message.body.merge(@credentials)
78
- puts "[values] #{values}"
79
- # this maps the input values passed in with the templated defined in the workflow
80
- params = Hash.new
81
- activity["params"].each do |key,template|
82
- params[key]=Mustache.render(template,values)
83
- end
84
- puts "[calling] #{channel}::#{method} (#{params.to_s})"
85
- event = call_channel_method(channel,method,params)
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
- response_message = message.respond(event.params,event.class.name.split("::").last)
93
+ response_message = message.respond(event.params,event.class.name.split("::").last)
88
94
 
89
95
 
90
- @message_bus.send response_message
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.6
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: