root/bin/shadowwalker @ 52130dc9
89d8bebc | Marc Dequènes (Duck) | #!/usr/bin/ruby -Ku
|
|
#--
|
|||
# LdapShadows, a Medium-level LDAP Access Library and Tool.
|
|||
# Copyright (c) 2009 Marc Dequènes (Duck) <Duck@DuckCorp.org>
|
|||
#
|
|||
# This program is free software: you can redistribute it and/or modify
|
|||
# it under the terms of the GNU General Public License as published by
|
|||
# the Free Software Foundation, either version 3 of the License, or
|
|||
# (at your option) any later version.
|
|||
#
|
|||
# This program is distributed in the hope that it will be useful,
|
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
# GNU General Public License for more details.
|
|||
#
|
|||
# You should have received a copy of the GNU General Public License
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#++
|
|||
# to allow in-place run for test
|
|||
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
|||
require 'ldap_shadows'
|
|||
bbb82941 | Marc Dequènes (Duck) | require 'ldap_shadows/display_utils'
|
|
89d8bebc | Marc Dequènes (Duck) | require 'yaml'
|
|
require 'cmdparse2'
|
|||
bbb82941 | Marc Dequènes (Duck) | include LdapShadows
|
|
b0304d30 | Marc Dequènes (Duck) | ||
89d8bebc | Marc Dequènes (Duck) | config_str = IO.read(File.join(LdapShadows::Config::CFG_DIR, "test.conf"))
|
|
1744c478 | Marc Dequènes (Duck) | config = YAML.load(config_str)
|
|
config_str_prv_filelist = [
|
|||
File.join(ENV['HOME'], ".shadowwalker"),
|
|||
File.join(LdapShadows::Config::CFG_DIR, "private.conf")
|
|||
]
|
|||
config_str_prv_filelist.each do |file|
|
|||
if File.exists?(file)
|
|||
config_str_prv = IO.read(file)
|
|||
config.merge!(YAML.load(config_str_prv))
|
|||
break
|
|||
end
|
|||
end
|
|||
config.recursive_symbolize_keys!
|
|||
89d8bebc | Marc Dequènes (Duck) | ActiveLdap::Base.setup_connection(config[:ldap])
|
|
bbb82941 | Marc Dequènes (Duck) | $program_options = {}
|
|
89d8bebc | Marc Dequènes (Duck) | cmdparser = CmdParse::CommandParser.new(true)
|
|
bbb82941 | Marc Dequènes (Duck) | cmdparser.banner = PRODUCT
|
|
5ca3fa56 | Marc Dequènes (Duck) | cmdparser.program_name = File.basename(__FILE__)
|
|
bbb82941 | Marc Dequènes (Duck) | cmdparser.program_version = VERSION.split(".")
|
|
89d8bebc | Marc Dequènes (Duck) | ||
cmdparser.options = CmdParse::OptionParserWrapper.new do |opt|
|
|||
opt.separator "Global options:"
|
|||
bbb82941 | Marc Dequènes (Duck) | opt.on("--debug", "Output debug info without being formated") {|t| $program_options[:debug] = true }
|
|
opt.on("--expert", "Output extra info for expert users") {|t| $program_options[:expert] = true }
|
|||
opt.on("--handles", "Output with handles (objects/field/... keys used for manipulations)") {|t| $program_options[:handles] = true }
|
|||
89d8bebc | Marc Dequènes (Duck) | end
|
|
cmdparser.add_command(CmdParse::HelpCommand.new)
|
|||
cmdparser.add_command(CmdParse::VersionCommand.new)
|
|||
bbb82941 | Marc Dequènes (Duck) | ldapctl = Controller.new
|
|
1744c478 | Marc Dequènes (Duck) | ldapctl.set_global_config(config[:presentation])
|
|
89d8bebc | Marc Dequènes (Duck) | config[:aspects].each_pair do |aspect_name, aspect_data|
|
|
ldapctl.set_aspect(aspect_name, aspect_data)
|
|||
end
|
|||
config[:objects].each_pair do |obj_name, obj_data|
|
|||
ldapctl.load_object(obj_name, obj_data)
|
|||
end
|
|||
ldapctl.load_relations
|
|||
cmd = CmdParse::Command.new('list', false)
|
|||
cmd.short_desc = "list objects"
|
|||
cmd.set_execution_block do |args|
|
|||
if args.size != 1
|
|||
STDERR.puts "syntax error: no object name given"
|
|||
exit 1
|
|||
end
|
|||
b0304d30 | Marc Dequènes (Duck) | obj_hdl = args.shift.singularize
|
|
89d8bebc | Marc Dequènes (Duck) | obj_klass = ldapctl.find_klass(obj_hdl)
|
|
if obj_klass.nil?
|
|||
STDERR.puts "No such object '#{obj_hdl}'."
|
|||
exit 2
|
|||
end
|
|||
a9b44a39 | Marc Dequènes (Duck) | obj_human_name = Translator.translate_object_name(obj_hdl)
|
|
Display.display_item_list("List of " + obj_human_name.pluralize, obj_klass.find(:all))
|
|||
89d8bebc | Marc Dequènes (Duck) | end
|
|
cmdparser.add_command(cmd)
|
|||
cmd = CmdParse::Command.new('show', false)
|
|||
cmd.short_desc = "show object information"
|
|||
cmd.set_execution_block do |args|
|
|||
if args.size < 1
|
|||
STDERR.puts "syntax error: no object name given"
|
|||
exit 1
|
|||
end
|
|||
if args.size < 2
|
|||
STDERR.puts "syntax error: no item name given"
|
|||
exit 1
|
|||
end
|
|||
b0304d30 | Marc Dequènes (Duck) | obj_hdl = args.shift
|
|
89d8bebc | Marc Dequènes (Duck) | obj_klass = ldapctl.find_klass(obj_hdl)
|
|
if obj_klass.nil?
|
|||
STDERR.puts "No such object '#{obj_hdl}'."
|
|||
exit 2
|
|||
end
|
|||
b0304d30 | Marc Dequènes (Duck) | item_hdl = args.shift
|
|
89d8bebc | Marc Dequènes (Duck) | begin
|
|
c6632e15 | Marc Dequènes (Duck) | item = obj_klass.find(item_hdl, :attributes => ["*", "+"])
|
|
89d8bebc | Marc Dequènes (Duck) | rescue ActiveLdap::EntryNotFound
|
|
STDERR.puts "No such item '#{obj_hdl}/#{item_hdl}'"
|
|||
exit 2
|
|||
end
|
|||
bbb82941 | Marc Dequènes (Duck) | Display.display_item(item, $program_options)
|
|
89d8bebc | Marc Dequènes (Duck) | end
|
|
cmdparser.add_command(cmd)
|
|||
0d75a0b6 | Marc Dequènes (Duck) | cmd = CmdParse::Command.new('tree', false)
|
|
cmd.short_desc = "show skeleton objects tree"
|
|||
cmd.set_execution_block do |args|
|
|||
puts "Tree:"
|
|||
bbb82941 | Marc Dequènes (Duck) | base_dn = ActiveLdap::DistinguishedName.parse(LdapObject.base)
|
|
0d75a0b6 | Marc Dequènes (Duck) | ||
gconfig = ldapctl.get_global_config()
|
|||
if gconfig.has_key?(:tree_objects)
|
|||
tree = {}
|
|||
gconfig[:tree_objects].each do |obj_hdl|
|
|||
obj_klass = ldapctl.find_klass(obj_hdl)
|
|||
raise "object '#{obj_hdl}' not defined" unless obj_klass
|
|||
obj_klass.find(:all).each do |obj|
|
|||
ptree = tree
|
|||
pdn = nil
|
|||
(obj.dn_obj - base_dn).to_s.split(',').reverse.each do |pdn|
|
|||
ptree[pdn] = {} unless ptree.has_key?(pdn)
|
|||
ptree = ptree[pdn]
|
|||
end
|
|||
ptree = nil
|
|||
end
|
|||
end
|
|||
tree = {base_dn => tree}
|
|||
bbb82941 | Marc Dequènes (Duck) | Display.display_hash_tree(tree, 0)
|
|
0d75a0b6 | Marc Dequènes (Duck) | end
|
|
end
|
|||
cmdparser.add_command(cmd)
|
|||
b0304d30 | Marc Dequènes (Duck) | cmd = CmdParse::Command.new('mod', false)
|
|
cmd.short_desc = "Modify attributes of an object"
|
|||
cmd.set_execution_block do |args|
|
|||
if args.size < 1
|
|||
STDERR.puts "syntax error: no object name given"
|
|||
exit 1
|
|||
end
|
|||
if args.size < 2
|
|||
STDERR.puts "syntax error: no item name given"
|
|||
exit 1
|
|||
end
|
|||
obj_hdl = args.shift
|
|||
obj_klass = ldapctl.find_klass(obj_hdl)
|
|||
if obj_klass.nil?
|
|||
STDERR.puts "No such object '#{obj_hdl}'."
|
|||
exit 2
|
|||
end
|
|||
item_hdl = args.shift
|
|||
begin
|
|||
item = obj_klass.find(item_hdl, :attributes => ["*", "+"])
|
|||
rescue ActiveLdap::EntryNotFound
|
|||
STDERR.puts "No such item '#{obj_hdl}/#{item_hdl}'"
|
|||
exit 2
|
|||
end
|
|||
puts "COIN"
|
|||
p args
|
|||
args.each do |mod_info|
|
|||
key, val = mod_info.split("=")
|
|||
raise "Syntax error in modification parameters" if val.nil?
|
|||
# TODO: manage relations (harder)
|
|||
raise "No such field '#{key}' in object '#{obj_hdl}'" unless item.has_attribute?(key)
|
|||
item[key] = val
|
|||
end
|
|||
p item.valid?
|
|||
item.save!
|
|||
Display.display_item(item, $program_options)
|
|||
end
|
|||
cmdparser.add_command(cmd)
|
|||
89d8bebc | Marc Dequènes (Duck) | cmdparser.parse
|