mirror of
https://github.com/OpenNebula/one.git
synced 2026-11-09 22:14:13 +09:00
491 lines
14 KiB
Ruby
Executable File
491 lines
14 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
# -------------------------------------------------------------------------- #
|
|
# Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
|
|
# #
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
|
# not use this file except in compliance with the License. You may obtain #
|
|
# a copy of the License at #
|
|
# #
|
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
|
# #
|
|
# Unless required by applicable law or agreed to in writing, software #
|
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
|
# See the License for the specific language governing permissions and #
|
|
# limitations under the License. #
|
|
#--------------------------------------------------------------------------- #
|
|
|
|
ONE_LOCATION=ENV["ONE_LOCATION"]
|
|
|
|
if !ONE_LOCATION
|
|
RUBY_LIB_LOCATION="/usr/lib/one/ruby"
|
|
else
|
|
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby"
|
|
end
|
|
|
|
$: << RUBY_LIB_LOCATION
|
|
$: << RUBY_LIB_LOCATION+"/cli"
|
|
|
|
require 'command_parser'
|
|
require 'one_helper/oneuser_helper'
|
|
require 'one_helper/onequota_helper'
|
|
|
|
require 'uri'
|
|
|
|
cmd=CommandParser::CmdParser.new(ARGV) do
|
|
usage "`oneuser` <command> [<args>] [<options>]"
|
|
version OpenNebulaHelper::ONE_VERSION
|
|
|
|
helper = OneUserHelper.new
|
|
|
|
before_proc do
|
|
helper.set_client(options)
|
|
end
|
|
|
|
########################################################################
|
|
# Global Options
|
|
########################################################################
|
|
set :option, CommandParser::OPTIONS+OpenNebulaHelper::CLIENT_OPTIONS
|
|
|
|
list_options = CLIHelper::OPTIONS
|
|
list_options << OpenNebulaHelper::XML
|
|
list_options << OpenNebulaHelper::NUMERIC
|
|
list_options << OpenNebulaHelper::DESCRIBE
|
|
|
|
READ_FILE={
|
|
:name => "read_file",
|
|
:short => "-r",
|
|
:large => "--read-file",
|
|
:description => "Read password from file"
|
|
}
|
|
|
|
SHA1={
|
|
:name => "sha1",
|
|
:large => "--sha1",
|
|
:description => "The password will be hashed using the sha1\n"<<
|
|
" "*31<<"algorithm"
|
|
}
|
|
|
|
SSH={
|
|
:name => "ssh",
|
|
:large => "--ssh",
|
|
:description => "SSH Auth system",
|
|
:proc => lambda { |o, options|
|
|
options[:driver] = OpenNebula::User::SSH_AUTH
|
|
}
|
|
}
|
|
|
|
X509={
|
|
:name => "x509",
|
|
:large => "--x509",
|
|
:description => "x509 Auth system for x509 certificates",
|
|
:proc => lambda { |o, options|
|
|
options[:driver] = OpenNebula::User::X509_AUTH
|
|
}
|
|
}
|
|
|
|
X509_PROXY={
|
|
:name => "x509_proxy",
|
|
:large => "--x509_proxy",
|
|
:description => "x509 Auth system based on x509 proxy certificates",
|
|
:proc => lambda { |o, options|
|
|
options[:driver] = OpenNebula::User::X509_PROXY_AUTH
|
|
}
|
|
}
|
|
|
|
KEY={
|
|
:name => "key",
|
|
:short => "-k path_to_private_key_pem",
|
|
:large => "--key path_to_private_key_pem",
|
|
:format => String,
|
|
:description => "Path to the Private Key of the User"
|
|
}
|
|
|
|
CERT={
|
|
:name => "cert",
|
|
:short => "-c path_to_user_cert_pem",
|
|
:large => "--cert path_to_user_cert_pem",
|
|
:format => String,
|
|
:description => "Path to the Certificate of the User"
|
|
}
|
|
|
|
PROXY={
|
|
:name => "proxy",
|
|
:large => "--proxy path_to_user_proxy_pem",
|
|
:format => String,
|
|
:description => "Path to the user proxy certificate"
|
|
}
|
|
|
|
TIME={
|
|
:name => "time",
|
|
:large => "--time x",
|
|
:format => Integer,
|
|
:description => "Token duration in seconds, defaults to 3600 (1 h)"
|
|
}
|
|
|
|
DRIVER={
|
|
:name => "driver",
|
|
:large => "--driver driver",
|
|
:format => String,
|
|
:description => "Driver to autehnticate this user"
|
|
}
|
|
|
|
create_options = [READ_FILE, SHA1, SSH, X509, KEY, CERT, DRIVER]
|
|
login_options = [SSH, X509, X509_PROXY, KEY, CERT, PROXY, TIME]
|
|
|
|
########################################################################
|
|
# Formatters for arguments
|
|
########################################################################
|
|
set :format, :groupid, OpenNebulaHelper.rname_to_id_desc("GROUP") do |arg|
|
|
OpenNebulaHelper.rname_to_id(arg, "GROUP")
|
|
end
|
|
|
|
set :format, :userid, OneUserHelper.to_id_desc do |arg|
|
|
helper.to_id(arg)
|
|
end
|
|
|
|
set :format, :userid_list, OneUserHelper.list_to_id_desc do |arg|
|
|
helper.list_to_id(arg)
|
|
end
|
|
|
|
set :format, :password, OneUserHelper.password_to_str_desc do |arg|
|
|
OneUserHelper.password_to_str(arg, options)
|
|
end
|
|
|
|
########################################################################
|
|
# Commands
|
|
########################################################################
|
|
|
|
create_desc = <<-EOT.unindent
|
|
Creates a new User
|
|
Examples:
|
|
oneuser create my_user my_password
|
|
oneuser create my_user -r /tmp/mypass
|
|
oneuser create my_user --ssh --key /tmp/id_rsa
|
|
oneuser create my_user --ssh -r /tmp/public_key
|
|
oneuser create my_user --x509 --cert /tmp/my_cert.pem
|
|
EOT
|
|
|
|
command :create, create_desc, :username, [:password, nil],
|
|
:options=>create_options do
|
|
if args[1]
|
|
pass = args[1]
|
|
else
|
|
rc = helper.password(options)
|
|
if rc.first == 0
|
|
pass = rc[1]
|
|
else
|
|
exit_with_code *rc
|
|
end
|
|
end
|
|
|
|
driver = options[:driver] || OpenNebula::User::CORE_AUTH
|
|
|
|
helper.create_resource(options) do |user|
|
|
user.allocate(args[0], pass, driver)
|
|
end
|
|
end
|
|
|
|
update_desc = <<-EOT.unindent
|
|
Update the template contents. If a path is not provided the editor will
|
|
be launched to modify the current content.
|
|
EOT
|
|
|
|
command :update, update_desc, :userid, [:file, nil],
|
|
:options=>OpenNebulaHelper::APPEND do
|
|
helper.perform_action(args[0],options,"modified") do |obj|
|
|
if options[:append]
|
|
str = OpenNebulaHelper.append_template(args[0], obj, args[1])
|
|
else
|
|
str = OpenNebulaHelper.update_template(args[0], obj, args[1])
|
|
end
|
|
|
|
obj.update(str, options[:append])
|
|
end
|
|
end
|
|
|
|
quota_desc = <<-EOT.unindent
|
|
Set the quota limits for the user. If a path is not provided the editor
|
|
will be launched to modify the current quotas.
|
|
EOT
|
|
|
|
command :quota, quota_desc, :userid, [:file, nil] do
|
|
helper.perform_action(args[0], options, "modified") do |user|
|
|
rc = user.info
|
|
|
|
if OpenNebula.is_error?(rc)
|
|
puts rc.message
|
|
exit -1
|
|
end
|
|
|
|
str = OneQuotaHelper.set_quota(user, args[1])
|
|
rc = user.set_quota(str)
|
|
|
|
if OpenNebula.is_error?(rc)
|
|
puts rc.message
|
|
exit -1
|
|
end
|
|
end
|
|
end
|
|
|
|
batchquota_desc = <<-EOT.unindent
|
|
Sets the quota limits in batch for various users. If a path is not
|
|
provided the editor will be launched to create new quotas.
|
|
EOT
|
|
|
|
command :batchquota, batchquota_desc, [:range, :userid_list],
|
|
[:file, nil] do
|
|
batch_str = OneQuotaHelper.get_batch_quota(args[1])
|
|
|
|
helper.perform_actions(args[0], options, "modified") do |user|
|
|
str = OneQuotaHelper.merge_quota(user, batch_str)
|
|
|
|
if OpenNebula.is_error?(str)
|
|
str
|
|
else
|
|
rc = user.set_quota(str)
|
|
rc
|
|
end
|
|
end
|
|
end
|
|
|
|
defaultquota_desc = <<-EOT.unindent
|
|
Sets the default quota limits for the users. If a path is not provided
|
|
the editor will be launched to modify the current default quotas.
|
|
EOT
|
|
|
|
command :defaultquota, defaultquota_desc, [:file, nil] do
|
|
system = System.new(OneUserHelper.get_client(options))
|
|
|
|
default_quotas = system.get_user_quotas()
|
|
|
|
if OpenNebula.is_error?(default_quotas)
|
|
puts default_quotas.message
|
|
exit(-1)
|
|
end
|
|
|
|
str = OneQuotaHelper.set_quota(default_quotas, args[0])
|
|
|
|
rc = system.set_user_quotas(str)
|
|
|
|
if OpenNebula.is_error?(rc)
|
|
puts rc.message
|
|
exit(-1)
|
|
end
|
|
|
|
exit 0
|
|
end
|
|
|
|
umask_desc = <<-EOT.unindent
|
|
Changes the umask used to create the default permissions. In a similar
|
|
way to the Unix umask command, the expected value is a three-digit
|
|
base-8 number. Each digit is a mask that disables permissions for the
|
|
owner, group and other, respectively.
|
|
|
|
If mask is not given, or if it is an empty string, the umask will
|
|
be unset
|
|
EOT
|
|
|
|
command :umask, umask_desc, [:range, :userid_list], [:mask, nil] do
|
|
helper.perform_actions(args[0],options,
|
|
"umask changed") do |user|
|
|
|
|
rc = user.info
|
|
|
|
if OpenNebula.is_error?(rc)
|
|
puts rc.message
|
|
exit -1
|
|
end
|
|
|
|
user.delete_element('/USER/TEMPLATE/UMASK')
|
|
|
|
tmp_str = user.template_str
|
|
|
|
if !args[1].nil? && args[1] != ""
|
|
tmp_str << "\nUMASK = #{args[1]}"
|
|
end
|
|
|
|
user.update(tmp_str)
|
|
end
|
|
end
|
|
|
|
login_desc = <<-EOT.unindent
|
|
Creates the Login token for authentication
|
|
Examples:
|
|
oneuser login my_user --ssh --key /tmp/id_rsa --time 72000
|
|
oneuser login my_user --x509 --cert /tmp/my_cert.pem
|
|
--key /tmp/my_key.pk --time 72000
|
|
oneuser login my_user --x509_proxy --proxy /tmp/my_cert.pem
|
|
--time 72000
|
|
EOT
|
|
|
|
command :login, login_desc, :username, :options=>login_options do
|
|
OneUserHelper.login(args[0], options)
|
|
end
|
|
|
|
key_desc = <<-EOT.unindent
|
|
DEPRECATED, use login to generate auth files.
|
|
|
|
Shows a public key from a private SSH key. Use it as password
|
|
for the SSH authentication mechanism.
|
|
EOT
|
|
|
|
command :key, key_desc, :options=>[KEY] do
|
|
require 'opennebula/ssh_auth'
|
|
|
|
options[:key] ||= ENV['HOME']+'/.ssh/id_rsa'
|
|
|
|
begin
|
|
sshauth = SshAuth.new(:private_key=>options[:key])
|
|
rescue Exception => e
|
|
exit_with_code -1, e.message
|
|
end
|
|
|
|
puts sshauth.password
|
|
exit_with_code 0
|
|
end
|
|
|
|
|
|
delete_desc = <<-EOT.unindent
|
|
Deletes the given User
|
|
EOT
|
|
|
|
command :delete, delete_desc, [:range, :userid_list] do
|
|
helper.perform_actions(args[0], options, "deleted") do |user|
|
|
user.delete
|
|
end
|
|
end
|
|
|
|
passwd_desc = <<-EOT.unindent
|
|
Changes the given User's password
|
|
EOT
|
|
|
|
command :passwd, passwd_desc, :userid, [:password, nil],
|
|
:options=>create_options do
|
|
if args[1]
|
|
pass = args[1]
|
|
else
|
|
rc = helper.password(options)
|
|
if rc.first == 0
|
|
pass = rc[1]
|
|
else
|
|
exit_with_code *rc
|
|
end
|
|
end
|
|
|
|
helper.perform_action(args[0],options,"Password changed") do |user|
|
|
user.passwd(pass)
|
|
end
|
|
end
|
|
|
|
chgrp_desc = <<-EOT.unindent
|
|
Changes the User's primary group
|
|
EOT
|
|
|
|
command :chgrp, chgrp_desc, [:range, :userid_list], :groupid do
|
|
helper.perform_actions(args[0],options,"Group changed") do |user|
|
|
user.chgrp(args[1].to_i)
|
|
end
|
|
end
|
|
|
|
addgroup_desc = <<-EOT.unindent
|
|
Adds the User to a secondary group
|
|
EOT
|
|
|
|
command :addgroup, addgroup_desc, [:range, :userid_list], :groupid do
|
|
gid = args[1]
|
|
|
|
helper.perform_actions(args[0],options,"group added") do |user|
|
|
user.addgroup( gid )
|
|
end
|
|
end
|
|
|
|
delgroup_desc = <<-EOT.unindent
|
|
Removes the User from a secondary group
|
|
EOT
|
|
|
|
command :delgroup, delgroup_desc, [:range, :userid_list], :groupid do
|
|
gid = args[1]
|
|
|
|
helper.perform_actions(args[0],options,"group deleted") do |user|
|
|
user.delgroup( gid )
|
|
end
|
|
end
|
|
|
|
chauth_desc = <<-EOT.unindent
|
|
Changes the User's auth driver and its password (optional)
|
|
Examples:
|
|
oneuser chauth my_user core
|
|
oneuser chauth my_user core new_password
|
|
oneuser chauth my_user core -r /tmp/mypass
|
|
oneuser chauth my_user --ssh --key /home/oneadmin/.ssh/id_rsa
|
|
oneuser chauth my_user --ssh -r /tmp/public_key
|
|
oneuser chauth my_user --x509 --cert /tmp/my_cert.pem
|
|
EOT
|
|
|
|
command :chauth, chauth_desc, :userid, [:auth, nil], [:password, nil],
|
|
:options=>create_options do
|
|
if options[:driver]
|
|
driver = options[:driver]
|
|
elsif args[1]
|
|
driver = args[1]
|
|
else
|
|
exit_with_code 0, "An Auth driver should be specified"
|
|
end
|
|
|
|
if args[2]
|
|
pass = args[2]
|
|
else
|
|
rc = helper.password(options)
|
|
if rc.first == 0
|
|
pass = rc[1]
|
|
else
|
|
pass = ""
|
|
end
|
|
end
|
|
|
|
helper.perform_action(args[0],
|
|
options,
|
|
"Auth driver and password changed") do |user|
|
|
user.chauth(driver, pass)
|
|
end
|
|
end
|
|
|
|
list_desc = <<-EOT.unindent
|
|
Lists Users in the pool
|
|
EOT
|
|
|
|
command :list, list_desc, :options=>list_options do
|
|
helper.list_pool(options)
|
|
end
|
|
|
|
show_desc = <<-EOT.unindent
|
|
Shows information for the given User
|
|
EOT
|
|
|
|
command :show, show_desc, [:userid, nil],
|
|
:options=>OpenNebulaHelper::XML do
|
|
user=args[0] || OpenNebula::User::SELF
|
|
helper.show_resource(user,options)
|
|
end
|
|
|
|
show_desc = <<-EOT.unindent
|
|
Encodes user and password to use it with ldap
|
|
EOT
|
|
|
|
command :encode, show_desc, :username, [:password, nil] do
|
|
ar=args.compact
|
|
|
|
if defined?(URI::Parser)
|
|
parser=URI::Parser.new
|
|
else
|
|
parser=URI
|
|
end
|
|
|
|
puts ar.map{|a| parser.escape(a) }.join(':')
|
|
|
|
0
|
|
end
|
|
end
|