forj 0.0.35 → 0.0.36
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/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:
|