forj 0.0.35 → 0.0.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -9
- data/bin/forj +22 -8
- data/lib/boot.rb +13 -9
- data/lib/connection.rb +6 -5
- data/lib/defaults.yaml +15 -4
- data/lib/forj-config.rb +10 -2
- data/lib/helpers.rb +32 -0
- data/lib/log.rb +12 -3
- data/lib/network.rb +1 -1
- data/lib/security.rb +17 -3
- data/lib/setup.rb +73 -12
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56a2084ebba0322d7ddd4c282f4920d0200a7f80
|
4
|
+
data.tar.gz: 10f942c5e93c5efb94c62b51447cee6dc7c057ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de3ed0c44cf1d360e823d2ccff9ac391b08d16d5944c01e49c96175e4035e1493ca9c967a3dfc15b29e4eb6a9c316431846e5787eda884c241894f38fb8d42c3
|
7
|
+
data.tar.gz: 938f9c93e3eaa1b86d917e66f89e8dd93902bd4a414347fb77074d08e4e176f51be87df7863a7f6d09a21662156e4250b70947197c9db4b08b716ad4ff18eefa
|
data/README.md
CHANGED
@@ -4,24 +4,23 @@ Forj cli
|
|
4
4
|
|
5
5
|
Installation
|
6
6
|
------------
|
7
|
-
### For ruby 2.0
|
8
7
|
|
9
|
-
|
8
|
+
###Fedora/CentOS/Redhat rpm like package system
|
9
|
+
|
10
|
+
**For ruby 2.0**
|
10
11
|
|
11
12
|
$ sudo yum install ruby-devel libxml2-devel libxslt-devel python-yaml gcc git -y
|
12
13
|
$ sudo gem install forj
|
13
14
|
|
14
|
-
|
15
|
+
###Ubuntu/Debian deb like package system
|
15
16
|
|
16
|
-
|
17
|
-
$ sudo gem install forj
|
18
|
-
|
19
|
-
### For ruby 1.9
|
17
|
+
**For ruby 1.9**
|
20
18
|
|
21
|
-
$ sudo apt-get install ruby-dev build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev git -y
|
19
|
+
$ sudo apt-get install ruby-dev build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev libxml2-dev libxslt-dev git -y
|
22
20
|
$ sudo gem install forj
|
23
21
|
|
24
|
-
|
22
|
+
|
23
|
+
**For ruby 1.8**
|
25
24
|
|
26
25
|
$ sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 -y
|
27
26
|
$ sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby -y
|
data/bin/forj
CHANGED
@@ -23,16 +23,16 @@ require 'ansi'
|
|
23
23
|
$APP_PATH = File.dirname(__FILE__)
|
24
24
|
$LIB_PATH = File.expand_path(File.join(File.dirname($APP_PATH),'lib'))
|
25
25
|
|
26
|
-
$FORJ_DATA_PATH= File.expand_path('~/.forj')
|
27
26
|
$LOAD_PATH << './lib'
|
28
27
|
|
29
|
-
|
28
|
+
require 'boot.rb'
|
29
|
+
require 'down.rb'
|
30
|
+
require 'setup.rb'
|
31
|
+
require 'ssh.rb'
|
32
|
+
|
30
33
|
include Boot
|
31
|
-
require_relative '../lib/down.rb'
|
32
34
|
include Down
|
33
|
-
require_relative '../lib/setup.rb'
|
34
35
|
include Setup
|
35
|
-
require_relative '../lib/ssh.rb'
|
36
36
|
include Ssh
|
37
37
|
|
38
38
|
require 'forj-config.rb' # Load class ForjConfig
|
@@ -44,6 +44,9 @@ require 'connection.rb' # Load class ForjConnection
|
|
44
44
|
|
45
45
|
include Logging
|
46
46
|
|
47
|
+
# Initialize forj paths
|
48
|
+
ensure_forj_dirs_exists()
|
49
|
+
|
47
50
|
# Initialize global Log object
|
48
51
|
$FORJ_LOGGER=ForjLog.new()
|
49
52
|
|
@@ -102,8 +105,8 @@ The list of predefined values can be retrieved with forj show defaults
|
|
102
105
|
|
103
106
|
method_option :account_name, :aliases => '-a', :desc => 'Set the forj account name to use. By default, it takes the provider name.'
|
104
107
|
method_option :infra, :aliases => '-i', :desc => 'Defines your Infra directory to use while booting. You can also set FORJ_INFRA_DIR.'
|
105
|
-
method_option :key_name, :aliases => '-k', :desc =>
|
106
|
-
method_option :key_path, :aliases => '-p', :desc =>
|
108
|
+
method_option :key_name, :aliases => '-k', :desc => "Keypair name to use."
|
109
|
+
method_option :key_path, :aliases => '-p', :desc => "Private or Public key file. forj will determine if you provide a public key or a private, if respectively the extension '.pub' exist or not."
|
107
110
|
|
108
111
|
method_option :boothook, :aliases => '-H', :desc => 'By default, boothook file used is build/bin/build-tools/boothook.sh. Use this option to set another one.'
|
109
112
|
method_option :build, :aliases => '-B', :desc => 'Replace the default build.sh'
|
@@ -124,7 +127,18 @@ The list of predefined values can be retrieved with forj show defaults
|
|
124
127
|
oConfig.set('account_name', options[:account_name])
|
125
128
|
oConfig.set('infra_repo', options[:infra])
|
126
129
|
oConfig.set('keypair_name', options[:key_name])
|
127
|
-
|
130
|
+
if options[:key_path]
|
131
|
+
mFound = options[:key_path].match(/^(.*)(\.pub)?$/)
|
132
|
+
if mFound
|
133
|
+
key_path = File.expand_path(mFound[1])
|
134
|
+
if mFound[2] and not File.exists?(File.expand_path(mFound[1]+mFound[2]))
|
135
|
+
Logging.fatal(1, "'%s' is not a valid keypair files. At least the public key (.pub) is have to exist.")
|
136
|
+
end
|
137
|
+
oConfig.set('keypair_path', key_path)
|
138
|
+
else
|
139
|
+
Logging.fatal(1, "'%s' is not a valid keypair files. At least the public key (.pub) is have to exist.")
|
140
|
+
end
|
141
|
+
end
|
128
142
|
|
129
143
|
# TODO: Be able to support the default provider from config.yaml
|
130
144
|
oConfig.set('provider', cloud_provider)
|
data/lib/boot.rb
CHANGED
@@ -42,16 +42,16 @@ module Boot
|
|
42
42
|
|
43
43
|
# Check options and set data
|
44
44
|
cloud_provider=oConfig.get('provider')
|
45
|
-
|
45
|
+
Logging.fatal(1, 'No provider specified.') if not cloud_provider
|
46
46
|
|
47
47
|
if cloud_provider != 'hpcloud'
|
48
|
-
|
48
|
+
Logging.fatal(1, "forj setup support only hpcloud. '%s' is currently not supported." % cloud_provider)
|
49
49
|
end
|
50
50
|
|
51
51
|
oConfig.setDefault('account_name', cloud_provider)
|
52
52
|
|
53
53
|
initial_msg = 'booting %s on %s (~/.forj/forj.log)' % [blueprint , cloud_provider]
|
54
|
-
Logging.
|
54
|
+
Logging.high_level_msg(initial_msg) #################
|
55
55
|
|
56
56
|
# Initialize defaults
|
57
57
|
maestro_url = oConfig.get('maestro_url')
|
@@ -73,6 +73,7 @@ module Boot
|
|
73
73
|
|
74
74
|
# Step Maestro Clone
|
75
75
|
if not maestro_repo
|
76
|
+
Logging.high_level_msg('cloning maestro repo ...' ) #################
|
76
77
|
Logging.info('cloning maestro repo from \'%s\'...' % maestro_url)
|
77
78
|
Repositories.clone_repo(maestro_url)
|
78
79
|
maestro_repo=File.expand_path('~/.forj/maestro')
|
@@ -92,6 +93,7 @@ module Boot
|
|
92
93
|
# Connect to services
|
93
94
|
oFC=ForjConnection.new(oConfig)
|
94
95
|
|
96
|
+
Logging.high_level_msg('Configuring network...') #################
|
95
97
|
Logging.info('Configuring network \'%s\'' % [oConfig.get('network')])
|
96
98
|
begin
|
97
99
|
network = Network.get_or_create_network(oFC, oConfig.get('network'))
|
@@ -101,16 +103,17 @@ module Boot
|
|
101
103
|
Logging.fatal(1, "Network properly configured is required.\n%s\n%s" % [e.message, e.backtrace.join("\n")])
|
102
104
|
end
|
103
105
|
|
104
|
-
|
106
|
+
Logging.state('Configuring keypair...') #################
|
105
107
|
Logging.info('Configuring keypair \'%s\'' % [oConfig.get('keypair_name')])
|
106
|
-
|
107
|
-
|
108
|
-
|
108
|
+
SecurityGroup.hpc_import_pubkey(oConfig, oFC.sAccountName)
|
109
|
+
|
110
|
+
Logging.state('Configuring security group...') #################
|
109
111
|
|
110
112
|
Logging.info('Configuring Security Group \'%s\'' % [oConfig.get('security_group')])
|
111
113
|
security_group = SecurityGroup.get_or_create_security_group(oFC, oConfig.get('security_group'))
|
112
114
|
ports = oConfig.get('ports')
|
113
115
|
|
116
|
+
Logging.state('Configuring security group ports...') #################
|
114
117
|
ports.each do |port|
|
115
118
|
port = port.to_s if port.class != String
|
116
119
|
if not /^\d+(-\d+)?$/ =~ port
|
@@ -123,10 +126,11 @@ module Boot
|
|
123
126
|
end
|
124
127
|
end
|
125
128
|
|
129
|
+
ENV['FORJ_HPC'] = oFC.sAccountName
|
126
130
|
ENV['FORJ_HPC_NET'] = network.name
|
127
131
|
ENV['FORJ_SECURITY_GROUP'] = oConfig.get('security_group')
|
128
|
-
ENV['FORJ_KEYPAIR'] =
|
129
|
-
ENV['FORJ_HPC_NOVA_KEYPUB'] =
|
132
|
+
ENV['FORJ_KEYPAIR'] = oConfig.get('keypair_name')
|
133
|
+
ENV['FORJ_HPC_NOVA_KEYPUB'] = oConfig.get('keypair_path')
|
130
134
|
ENV['FORJ_BASE_IMG'] = oConfig.get('image')
|
131
135
|
|
132
136
|
# run build.sh to boot maestro
|
data/lib/connection.rb
CHANGED
@@ -30,15 +30,16 @@ class ForjConnection
|
|
30
30
|
|
31
31
|
attr_accessor :oCompute
|
32
32
|
attr_accessor :oNetwork
|
33
|
+
attr_accessor :sAccountName
|
33
34
|
|
34
35
|
def initialize(oConfig)
|
35
36
|
|
36
|
-
sAccountName = oConfig.get('account_name')
|
37
|
+
@sAccountName = oConfig.get('account_name')
|
37
38
|
@provider='HP' # TODO: Support multiple provider. (Generic Provider object required)
|
38
|
-
sAccountName = oConfig.get('provider') if not sAccountName
|
39
|
-
sAccountName = 'hpcloud' if not sAccountName
|
39
|
+
@sAccountName = oConfig.get('provider') if not @sAccountName
|
40
|
+
@sAccountName = 'hpcloud' if not @sAccountName
|
40
41
|
|
41
|
-
@credentials = get_credentials(sAccountName)
|
42
|
+
@credentials = get_credentials(@sAccountName)
|
42
43
|
oSSLError=SSLErrorMgt.new
|
43
44
|
|
44
45
|
# Trying to get Compute object
|
@@ -85,7 +86,7 @@ end
|
|
85
86
|
def get_credentials(sAccountName)
|
86
87
|
# TODO: Should support forj credentials. not hpcloud credentials.
|
87
88
|
|
88
|
-
|
89
|
+
Logging.fatal(1, 'Internal Error: Missing sAccountName') if not sAccountName
|
89
90
|
|
90
91
|
creds = File.expand_path('~/.hpcloud/accounts/%s' % [sAccountName])
|
91
92
|
if not File.exists?(creds)
|
data/lib/defaults.yaml
CHANGED
@@ -14,17 +14,28 @@
|
|
14
14
|
|
15
15
|
default:
|
16
16
|
maestro_url: https://github.com/forj-oss/maestro.git
|
17
|
+
|
18
|
+
# Default Infra repository to use. If missing, it will be proposed to be created.
|
17
19
|
infra_repo: ~/.forj/infra
|
20
|
+
|
18
21
|
# You can set proto2b in your ~/.forj/config.yaml if you built it from maestro/build. Read the maestro/README.md to create it.
|
19
22
|
image: Ubuntu Precise 12.04.4 LTS Server 64-bit 20140414 (Rescue Image)
|
23
|
+
|
24
|
+
# Flavor to use for Maestro
|
20
25
|
flavor: standard.xsmall
|
26
|
+
|
27
|
+
# Ports to open for Maestro, added to the security group
|
28
|
+
security_group: forj
|
21
29
|
ports: [22, 80, 443, 3000, 3131, 3132, 3233, 3134, 3135, 4505-4506, 5000, 5666, 8000, 8080-8081, 8083, 8125, 8139-8140, 8773-8776, 9292, 29418, 35357]
|
22
|
-
|
23
|
-
keypair_name
|
30
|
+
|
31
|
+
# Private key file path. Those files (private/public key) will be added to ~/.forj/keypairs/ as respectively 'keypair_name' and 'keypair_name'.pub
|
32
|
+
keypair_path: ~/.ssh/forj-id_rsa
|
33
|
+
keypair_name: forj
|
34
|
+
|
24
35
|
# Network: If network doesn't exist, forj cli will try to create it, and attach it a router.
|
25
36
|
network: forj
|
26
|
-
|
27
|
-
#
|
37
|
+
|
38
|
+
# build.sh internal variables.
|
28
39
|
build_config: box
|
29
40
|
branch: master
|
30
41
|
box_name: maestro
|
data/lib/forj-config.rb
CHANGED
@@ -36,7 +36,7 @@ class ForjDefault
|
|
36
36
|
# If config doesn't exist, it will be created, empty with 'defaults:' only
|
37
37
|
|
38
38
|
if not $LIB_PATH
|
39
|
-
|
39
|
+
Logging.fatal(1, 'Internal $LIB_PATH was not set.')
|
40
40
|
end
|
41
41
|
|
42
42
|
Logging.info ('Reading default configuration...')
|
@@ -66,7 +66,7 @@ class ForjConfig
|
|
66
66
|
|
67
67
|
|
68
68
|
if not $FORJ_DATA_PATH
|
69
|
-
|
69
|
+
Logging.fatal(1, 'Internal $FORJ_DATA_PATH was not set.')
|
70
70
|
end
|
71
71
|
|
72
72
|
sConfigDefaultName='config.yaml'
|
@@ -191,5 +191,13 @@ class ForjConfig
|
|
191
191
|
end
|
192
192
|
@yConfig.merge!(@yLocal) { |key, oldval, newval| key == 'default'? oldval: newval }
|
193
193
|
end
|
194
|
+
|
195
|
+
def LocalDefaultExist?(key)
|
196
|
+
if @yLocal['default'][key]
|
197
|
+
true
|
198
|
+
else
|
199
|
+
false
|
200
|
+
end
|
201
|
+
end
|
194
202
|
|
195
203
|
end
|
data/lib/helpers.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'fileutils'
|
19
|
+
|
18
20
|
module Helpers
|
19
21
|
def get_home_path
|
20
22
|
File.expand_path('~')
|
@@ -25,4 +27,34 @@ module Helpers
|
|
25
27
|
Dir.mkdir path
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
31
|
+
def dir_exists?(path)
|
32
|
+
if File.exists?(path)
|
33
|
+
if not File.directory?(path)
|
34
|
+
msg = "'%s' is not a directory. Please fix it." % path
|
35
|
+
if $FORJ_LOGGER
|
36
|
+
Logging.fatal(1, msg)
|
37
|
+
else
|
38
|
+
raise msg
|
39
|
+
end
|
40
|
+
end
|
41
|
+
if not File.readable?(path) or not File.writable?(path) or not File.executable?(path)
|
42
|
+
msg = "%s is not a valid directory. Check permissions and fix it." % path
|
43
|
+
if $FORJ_LOGGER
|
44
|
+
Logging.fatal(1, msg)
|
45
|
+
else
|
46
|
+
raise msg
|
47
|
+
end
|
48
|
+
end
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def ensure_dir_exists(path)
|
55
|
+
if not dir_exists?(path)
|
56
|
+
FileUtils.mkpath(path) if not File.directory?(path)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
28
60
|
end
|
data/lib/log.rb
CHANGED
@@ -61,11 +61,17 @@ module Logging
|
|
61
61
|
# Class used to create 2 log object, in order to keep track of error in a log file and change log output to OUTPUT on needs (option flags).
|
62
62
|
|
63
63
|
attr_reader :level
|
64
|
-
|
64
|
+
|
65
65
|
def initialize(sLogFile = 'forj.log', level = Logger::WARN)
|
66
|
-
|
66
|
+
|
67
|
+
if not $FORJ_DATA_PATH
|
67
68
|
raise "Internal Error: Unable to initialize ForjLog - global FORJ_DATA_PATH not set"
|
68
69
|
end
|
70
|
+
|
71
|
+
if not Helpers.dir_exists?($FORJ_DATA_PATH)
|
72
|
+
raise "Internal Error: Unable to initialize ForjLog - '%s' doesn't exist." % $FORJ_DATA_PATH
|
73
|
+
end
|
74
|
+
|
69
75
|
@oFileLogger = Logger.new(File.join($FORJ_DATA_PATH, sLogFile), 'weekly')
|
70
76
|
@oFileLogger.level = Logger::DEBUG
|
71
77
|
@oFileLogger.formatter = proc do |severity, datetime, progname, msg|
|
@@ -160,6 +166,9 @@ module Logging
|
|
160
166
|
print("%s%s ...\r" % [message, ANSI.clear_line]) if $FORJ_LOGGER.level == Logger::INFO
|
161
167
|
end
|
162
168
|
|
163
|
-
|
169
|
+
def high_level_msg(message)
|
170
|
+
# Not DEBUG and not INFO. Just printed to the output.
|
171
|
+
puts ("%s" % [message]) if $FORJ_LOGGER.level > 1
|
172
|
+
end
|
164
173
|
|
165
174
|
end
|
data/lib/network.rb
CHANGED
@@ -227,7 +227,7 @@ module Network
|
|
227
227
|
|
228
228
|
# Router interface to connect to the network
|
229
229
|
def create_router_interface(subnet, router)
|
230
|
-
|
230
|
+
Logging.fatal(1, "Internal Error: subnet/router object not passed.") if not subnet or not router
|
231
231
|
|
232
232
|
Logging.debug("Attaching subnet '%s' to router '%s'" % [subnet.name, router.name])
|
233
233
|
begin
|
data/lib/security.rb
CHANGED
@@ -16,11 +16,13 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
require 'rubygems'
|
19
|
-
require '
|
19
|
+
require 'highline/import'
|
20
20
|
|
21
21
|
#
|
22
22
|
# SecurityGroup module
|
23
23
|
#
|
24
|
+
|
25
|
+
# TODO: Introduce most of HPCloud task in an hpcloud object.
|
24
26
|
module SecurityGroup
|
25
27
|
|
26
28
|
def get_or_create_security_group(oFC, name)
|
@@ -135,8 +137,20 @@ module SecurityGroup
|
|
135
137
|
rule
|
136
138
|
end
|
137
139
|
|
138
|
-
def
|
139
|
-
|
140
|
+
def hpc_import_pubkey(oConfig, account)
|
141
|
+
|
142
|
+
key_name = oConfig.get('keypair_name')
|
143
|
+
key_path = oConfig.get('keypair_path')
|
144
|
+
|
145
|
+
Logging.fatal(1, "'keypair_path' undefined. check your config.yaml file.") if not key_path
|
146
|
+
Logging.fatal(1, "'keypair_name' undefined. check your config.yaml file.") if not key_name
|
147
|
+
|
148
|
+
pubkey_path = key_path + '.pub'
|
149
|
+
Logging.fatal(1, "keypair '%s' are missing. Please call 'forj setup %s' to create the missing key pair required." % [pubkey_path, account]) if not File.exists?(pubkey_path)
|
150
|
+
|
151
|
+
Logging.info("Importing your forj keypair '%s' to hpcloud." % pubkey_path)
|
152
|
+
command = 'hpcloud keypairs:import %s %s -a %s' % [key_name, pubkey_path, account]
|
153
|
+
Logging.debug("Executing command '%s'" % command)
|
140
154
|
Kernel.system(command)
|
141
155
|
end
|
142
156
|
end
|
data/lib/setup.rb
CHANGED
@@ -31,13 +31,13 @@ module Setup
|
|
31
31
|
def setup(sProvider, oConfig, options )
|
32
32
|
begin
|
33
33
|
|
34
|
-
|
34
|
+
Logging.fatal(1, 'No provider specified.') if not sProvider
|
35
35
|
|
36
36
|
sAccountName = sProvider # By default, the account name uses the same provider name.
|
37
37
|
sAccountName = options[:account_name] if options[:account_name]
|
38
38
|
|
39
39
|
if sProvider != 'hpcloud'
|
40
|
-
|
40
|
+
Logging.fatal(1, "forj setup support only hpcloud. '%s' is currently not supported." % sProvider)
|
41
41
|
end
|
42
42
|
|
43
43
|
# TODO: Support of multiple providers thanks to fog.
|
@@ -50,11 +50,14 @@ module Setup
|
|
50
50
|
Kernel.system('hpcloud account:copy hp %s' % [sAccountName])
|
51
51
|
end
|
52
52
|
|
53
|
-
|
53
|
+
Logging.info("Configuring hpcloud account '%s'" % [sAccountName] )
|
54
|
+
command = 'hpcloud account:setup %s' % [sAccountName]
|
55
|
+
Logging.debug("Executing : '%s'" % command)
|
56
|
+
case Kernel.system(command)
|
54
57
|
when false
|
55
|
-
|
58
|
+
Logging.fatal(1, "Unable to setup your hpcloud account")
|
56
59
|
when nil
|
57
|
-
|
60
|
+
Logging.fatal(1, "Unable to execute 'hpcloud' cli. Please check hpcloud installation.")
|
58
61
|
end
|
59
62
|
|
60
63
|
if not oConfig.yConfig['default'].has_key?('account')
|
@@ -64,6 +67,10 @@ module Setup
|
|
64
67
|
|
65
68
|
# Implementation of simple credential encoding for build.sh/maestro
|
66
69
|
save_maestro_creds(sAccountName)
|
70
|
+
|
71
|
+
# Check/create keypair
|
72
|
+
keypair_setup(oConfig)
|
73
|
+
|
67
74
|
rescue RuntimeError => e
|
68
75
|
Logging.fatal(1,e.message)
|
69
76
|
rescue => e
|
@@ -72,7 +79,65 @@ module Setup
|
|
72
79
|
end
|
73
80
|
end
|
74
81
|
|
82
|
+
def ensure_forj_dirs_exists()
|
83
|
+
# Function to create FORJ paths if missing.
|
84
|
+
|
85
|
+
# Defining Global variables
|
86
|
+
$FORJ_DATA_PATH = File.expand_path(File.join('~', '.forj'))
|
87
|
+
$FORJ_ACCOUNT_PATH = File.join($FORJ_DATA_PATH, 'account') # Not currently used...
|
88
|
+
$FORJ_KEYPAIRS_PATH = File.join($FORJ_DATA_PATH, 'keypairs')
|
89
|
+
$FORJ_CREDS_PATH = File.expand_path(File.join('~', '.cache', 'forj'))
|
90
|
+
|
91
|
+
# TODO: To move to an hpcloud object.
|
92
|
+
$HPC_KEYPAIRS = File.expand_path(File.join('~', '.hpcloud', 'keypairs'))
|
93
|
+
|
94
|
+
Helpers.ensure_dir_exists($FORJ_DATA_PATH)
|
95
|
+
Helpers.ensure_dir_exists($FORJ_ACCOUNT_PATH)
|
96
|
+
Helpers.ensure_dir_exists($FORJ_KEYPAIRS_PATH)
|
97
|
+
Helpers.ensure_dir_exists($FORJ_CREDS_PATH)
|
98
|
+
end
|
99
|
+
|
100
|
+
def keypair_setup(oConfig)
|
101
|
+
|
102
|
+
key_path = oConfig.get('keypair_path')
|
103
|
+
|
104
|
+
Logging.info("Configuring forj keypair '%s'" % [key_path] )
|
105
|
+
|
106
|
+
if not File.exists?(key_path)
|
107
|
+
# Need to create a key. ask if we need so.
|
108
|
+
real_key_path = File.expand_path(ask("If your ssh keypair doesn't exist, forj will ask ssh-keygen to create one for you.\nPrivate key file path:") do |q|
|
109
|
+
q.validate = /\w+/
|
110
|
+
q.default = key_path
|
111
|
+
end)
|
112
|
+
if not File.exists?(real_key_path)
|
113
|
+
Helpers.ensure_dir_exists(File.dirname(real_key_path))
|
114
|
+
command = 'ssh-keygen -t rsa -f %s' % real_key_path
|
115
|
+
Logging.debug("Executing '%s'" % command)
|
116
|
+
system(command)
|
117
|
+
end
|
118
|
+
if not File.exists?(real_key_path)
|
119
|
+
Logging.fatal(1, "'%s' not found. Unable to add your keypair to hpcloud. Create it yourself and provide it with -p option. Then retry." % [real_key_path])
|
120
|
+
else
|
121
|
+
if real_key_path != key_path and not oConfig.LocalDefaultExist?('keypair_path')
|
122
|
+
Logging.debug("Saving forj keypair '%s' as default." % [real_key_path] )
|
123
|
+
oConfig.LocalSet('keypair_path', real_key_path)
|
124
|
+
oConfig.SaveConfig()
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
75
131
|
def save_maestro_creds(sAccountName)
|
132
|
+
# Check required global data
|
133
|
+
if not $FORJ_CREDS_PATH
|
134
|
+
Logging.fatal(1, "Internal error: '$FORJ_CREDS_PATH' missing.")
|
135
|
+
end
|
136
|
+
if not Helpers.dir_exists?($FORJ_CREDS_PATH)
|
137
|
+
Logging.fatal(1, "Internal error: '%s' doesn't exist." % $FORJ_CREDS_PATH)
|
138
|
+
end
|
139
|
+
|
140
|
+
Logging.info("Completing hpcloud account '%s' information." % [sAccountName] )
|
76
141
|
|
77
142
|
# TODO Be able to load the previous username if the g64 file exists.
|
78
143
|
hpcloud_os_user = ask('Enter hpcloud username: ') do |q|
|
@@ -87,16 +152,12 @@ def save_maestro_creds(sAccountName)
|
|
87
152
|
|
88
153
|
add_creds = {:credentials => {:hpcloud_os_user=> hpcloud_os_user, :hpcloud_os_key=> hpcloud_os_key}}
|
89
154
|
|
90
|
-
|
91
|
-
cloud_fog = '%s/%s.g64' % [sForjCache, sAccountName]
|
92
|
-
|
93
|
-
|
94
|
-
Helpers.create_directory(sForjCache) if not File.directory?(sForjCache)
|
155
|
+
cloud_fog = File.join($FORJ_CREDS_PATH, sAccountName+'.g64')
|
95
156
|
|
96
157
|
# Security fix: Remove old temp file with clear password.
|
97
|
-
old_file = '%s/master.forj-13.5' % [
|
158
|
+
old_file = '%s/master.forj-13.5' % [$FORJ_CREDS_PATH]
|
98
159
|
File.delete(old_file) if File.exists?(old_file)
|
99
|
-
old_file = '%s/creds' % [
|
160
|
+
old_file = '%s/creds' % [$FORJ_CREDS_PATH]
|
100
161
|
File.delete(old_file) if File.exists?(old_file)
|
101
162
|
|
102
163
|
hpcloud_creds = File.expand_path('~/.hpcloud/accounts/%s' % [sAccountName])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.36
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- forj team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
- - '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 1.4.3
|
125
|
-
description: forj
|
125
|
+
description: forj cli - See https://www.forj.io for documentation/information
|
126
126
|
email:
|
127
127
|
- forj@forj.io
|
128
128
|
executables:
|