Hi all
I've been switching from perl to the ruby programming language for my scripting as
ruby is nicer in many ways. In order to use this with TSM I have ported Owen Crow's
Adsm.pm perl module. Some of you might find it useful.
Steve.
=======================================================================
class Tsm
=begin
=Tsm
A ruby class to interface with the dsmadmc command
based on the perl Adsm package by Owen Crow
==Methods
Tsm.new("username","password")
The new method creates a TSM object. Username and password are optional, and
are the TSM username and password to be usd for this session. If these are
not supplied, the user's HOME environment variable is used to locate a file named
.dsmrc. See the Files section below.
Dsmadmc("c1","c2","c3"...)
When the Dsmadmc method is invoked on the Tsm object the string parameters passed are
joined with a space and the resulting string is passed as a command to the dsmadmc
command. The output of the command is stripped of TSM header and footer information,
continuation lines and blank lines, and returned as a single string to the caller.
The TSM return code is placed into the rc instance variable
rc
This method returns the TSM return code from the last executed command
Dsmconsole {|line| ...}
This method opens a TSM console session and passes returned lines to the block.
No processing is done on the returned lines. Interrupt is trapped.
==Files
tsm.rb - source
.dsmrc optionally contains lines of the form
ID username
PA password
The first line of each type found is used to supply the TSM Id and Password
that is used when invoking the dsmadmc command.
== Examples
require "tsm"
x = Tsm.new("someadmin","somepassword")
puts "#{x.Dsmadmc("-commad","q sess")} rc=#{x.rc}"
puts "#{x.Dsmadmc("q mount")} rc=#{x.rc}"
x.Dsmconsole { |l| puts l}
=end
attr_accessor(:rc)
def initialize(*args)
@id=args.shift
@pa=args.shift
@rc=0
if (@id.nil? or @pa.nil?) and not(ENV['HOME'].nil?)
dsmrcfile=ENV['HOME'] + "/.dsmrc"
begin
mode = File.stat(dsmrcfile).mode%32678
uid = File.stat(dsmrcfile).uid
#mode must be 600 or 400
raise "Permissions of #{dsmrcfile} are #{sprintf("%o",mode)} and should be
octal 600 or 400" unless ("477".oct & mode) != "400".oct
raise "#{dsmrcfile} must be owned by you" unless uid == Process.uid
File.open(ENV['HOME'] + "/.dsmrc").each_line do |l|
if @id.nil? && l =~ /^ID\s+(.*)$/
@id = $1
end
if @pa.nil? && l =~ /^PA\s+(.*)$/
@pa = $1
end
end
rescue Errno::ENOENT # ./dsmrc file does not exist
prompt_user
end
if @id.nil? || @pa.nil?
prompt_user
end
end
end
def prompt_user
if $stdin.isatty
# an interactive terminal
stty = `stty`
if @id.nil?
print "Enter your user id: "
@id = $stdin.gets.chomp
end
if @pa.nil?
# Turn off echoing of characters for the password entry (only in UNIX
`stty -echo`
print "Enter password for [EMAIL PROTECTED]: "
@pa=$stdin.gets.chomp
`stty echo` if stty =~ /[^-]echo\b/
print "\n"
end
else
# Last effort is to read the ID and password from stdin
@id=$stdin.gets.chomp
@pa=$stdin.gets.chomp
end
end
def Dsmadmc(*args)
# dsmadmc accepts a list as its argument. The list is joined with spaces
# to form the command submitted to tsm
command = args.join(" ")
output = String.new("") # output of dsmadmc command
@rc = 0
flag = false
IO.popen("dsmadmc [EMAIL PROTECTED] [EMAIL PROTECTED] #{command}
</dev/null").each_line do |$_|
next if $_ =~ /^\s*$/ # drop empty lines
# Capture return code from output of dsmadmc. Did I miss any other
# messages which contain the return code?
if $_ =~ /^(ANS5103I|ANS5102I|ANS8002I).*?(\d+)\.$/
@rc = $2
break
end
# Wait for the flag and skip empty lines
# Skip any lines starting with "more..."
if flag
more = ($_ =~/^more\.\.\./ ) ? true : false
output += $_ unless more
end
# Set the flag on the message which contains the command issued
flag = true if $_ =~ /^(ANS5101I|ANS8000I)/
end
output # return the output as a string with multiple lines
end
def Dsmconsole
p=IO.popen("dsmadmc [EMAIL PROTECTED] [EMAIL PROTECTED] -console </dev/null")
begin
p.each_line {|l| yield l}
rescue Interrupt
p.close_read
end
end
end
***********************************************************************************
This email, including any attachments sent with it, is confidential and for the sole
use of the intended recipient(s). This confidentiality is not waived or lost, if you
receive it and you are not the intended recipient(s), or if it is transmitted/received
in error.
Any unauthorised use, alteration, disclosure, distribution or review of this email is
prohibited. It may be subject to a statutory duty of confidentiality if it relates to
health service matters.
If you are not the intended recipient(s), or if you have received this email in error,
you are asked to immediately notify the sender by telephone or by return email. You
should also delete this email and destroy any hard copies produced.
***********************************************************************************