Mac OS X Server v10.6:コマンドラインから Wiki およびユーザブログを作成する方法

Mac OS X Server v10.6 では、ユーザが自分のブログを作成できる機能が搭載されています。 

また、管理者ユーザは、コマンドラインで Wiki を作成し、ユーザブログを開設できます。

下記のスクリプトは、ユーザブログをプログラムによって開設できるようにするスクリプトです。#BEGIN と #END の間のすべてのテキストをテキストファイルに標準テキストとして保存する必要があります。具体的な例は、「追加情報」セクションを参照してください。

 

#BEGIN

#!/usr/bin/ruby

require 'rubygems'
require 'highline/import'
require 'xmlrpc/client'
require 'digest'
require 'uri'
require 'optparse'

class WikiServer
  def initialize(server_url)
    u = URI::parse(server_url)
    @rpc_hostname = u.host
    @rpc_port = u.port
    @rpc_scheme = u.scheme
    @rpc_use_ssl = @rpc_scheme == 'https'
    @rpc_method = 'POST'
    @rpc_path = '/RPC2'
    @session_id = nil
  end

  def login(username, password, authorize_as=nil)
    # authorize_as is the name of the user to perform actions as
    # if authorize_as is used, 'username' must be an admin
    @xmlrpc_client = XMLRPC::Client.new3(:host => @rpc_hostname, :path => @rpc_path, :port => @rpc_port, :use_ssl => @rpc_use_ssl)
    xmlrpc_response = @xmlrpc_client.call('digestLogin')
    digest_challenge = xmlrpc_response['challenge']
    h1 = Digest::MD5.hexdigest([username, digest_challenge['realm'], password].join(':'))
    h2 = Digest::MD5.hexdigest([@rpc_method, @rpc_path].join(':'))
    challenge_response = Digest::MD5.hexdigest([h1, digest_challenge['nonce'], h2].join(':'))

    digest_response = { 
      'realm' => digest_challenge['realm'],
      'username' => username,
      'response' => challenge_response,
      'nonce' => digest_challenge['nonce'],
      'opaque' => digest_challenge['opaque'],
      'algorithm' => digest_challenge['algorithm'],
      'uri' => @rpc_path
    }

    @xmlrpc_client.http_header_extra = {'X-Authorize-As' => authorize_as} unless authorize_as.nil?

    xmlrpc_response = @xmlrpc_client.call('digestLogin', digest_response)

    @xmlrpc_client.http_header_extra = nil

    if xmlrpc_response['success']
      @session_id = xmlrpc_response['session_id']
      return true
    else
      return false
    end
  end

  def is_admin?(username)
    @xmlrpc_client.call('checkSessionAuthorization', @session_id, 'admin') rescue false
  end

  def create_wiki(wikiname)
    @xmlrpc_client.call('provisionGroup', @session_id, {'longName' => wikiname})
  end

  def create_blog(username)
    @xmlrpc_client.call('provisionUser', @session_id, username)
  end
end

if __FILE__ == $0
  PROGNAME = File::basename($0)

  options = {}
  options[:users] = []
  options[:wikis] = []

  OptionParser.new do |opts|
    opts.banner = "Usage: #{PROGNAME} [options]"

    opts.on('-a', '--admin username', 'Admin user name') do |a|
      options[:admin] = a
    end

    opts.on('-s', '--server url', 'URL of the wiki server') do |s|
      options[:server_url] = s
    end

    opts.on('-u', '--user user1,user2', Array, 'Name(s) of the user blog(s) to be created') do |u|
      options[:users] = u
    end

    opts.on('-w', '--wiki wiki1,wiki2', Array, 'Name(s) of the wiki(s) to be created') do |w|
      options[:wikis] = w
    end

    opts.on('-v', '--verbose', 'Enable verbose output') do |v|
      options[:verbose] = v
    end

    opts.on('-h', '--help', 'Show this message') do
      puts opts
      exit
    end

    opts.on_tail("\nExample: #{PROGNAME} -a diradmin -s http://wiki.example.com -u user1,user2 -w wiki1,'Another Great Wiki'")

    begin
      raise OptionParser::ParseError, "No admin name specified" unless ARGV.include?('-a') || ARGV.include?('--admin')
      raise OptionParser::ParseError, "No server URL specified" unless ARGV.include?('-s') || ARGV.include?('--server')
      opts.parse!(ARGV)
    rescue OptionParser::ParseError => e
      STDERR.puts e.message, "\n", opts
      exit(1)
    end
  end

  passwd = HighLine::ask("Password for #{options[:admin]}: ") { |q| q.echo = '*' }
  w = WikiServer.new(options[:server_url])

  puts "Logging in to #{options[:server_url]} as #{options[:admin]}" if options[:verbose]
  if w.login(options[:admin], passwd)
    abort "User #{options[:admin]} is not an admin" unless w.is_admin?(options[:admin])

    options[:wikis].each { |wikiname|
      uri = w.create_wiki(wikiname)
      puts "Created #{options[:server_url]}#{URI}" if options[:verbose]
    }

    options[:users].each { |username|
      uri = w.create_blog(username)
      puts "Created #{options[:server_url]}#{URI}" if options[:verbose]
    }
  else
    abort "Authentication to #{options[:server_url]} as user #{options[:admin]} failed"
  end
end

#END

 

たとえば、スクリプトが「wiki_blog_maker.rb」というファイルに保存された場合、Wiki サーバのホスト名は「wiki.example.com」になり、「diradmin」は wiki.example.com の管理者ユーザになるので、次のように「jruser」および「jdoe」のユーザブログを開設することができます。

    ruby wiki_blog_maker.rb -a diradmin -s http://wiki.example.com -u jruser,jdoe

「Marketing」および「IT Department」の Wiki を作成するには、次のスクリプトを実行するとできます。

    ruby wiki_blog_maker.rb -a diradmin -s http://wiki.example.com -w Marketing,'IT Department'

スクリプトのヘルプ出力を表示するには、次のように -h または --help フラグをパスします。

Usage: wiki_blog_maker.rb [options]
    -a, --admin username             Admin user name
    -s, --server url                 URL of the wiki server
    -u, --user user1,user2           Name(s) of the user blog(s) to be created
    -w, --wiki wiki1,wiki2           Name(s) of the wiki(s) to be created
    -v, --verbose                    Enable verbose output
    -h, --help                       Show this message

Example: wiki_blog_maker.rb -a diradmin -s http://wiki.example.com -u user1,user2 -w wiki1,'Another Great Wiki'
公開日: