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.
@@ -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: