class Ucert::SomTracker

Class to handle SOM user account IDs

Attributes

file_user_map[RW]

Class constant variables

som_2_ad_user[R]
som_user_entitlement[R]
som_user_report[RW]

Class constant variables

verbose[RW]

Class constant variables

Public Class Methods

new(params ={}) click to toggle source

Instance default variables

# File lib/ucert/som_tracker.rb, line 18
def initialize (params ={})
  @verbose=params.fetch(:verbose, false)
              # Som to AD user map file
              @file_user_map =  File.dirname(__FILE__)+"/../../data/som/som_user_map.txt"
              @som_user_report = File.dirname(__FILE__)+"/../../data/som/som_user_report.csv"
              # Load the user map file to an instance variable (for performance gain)
              @som_2_ad_user=load_known_user_map_from_file(@file_user_map)
              # Load the user entitlement instance variable from the native Som user entitlement report
              parse_som_user_report(@som_user_report)
              # Insert DN field into the user entitlement data structure
              insert_dn
              save!
      end

Public Instance Methods

print_user()
print_user_entitlement() click to toggle source

Print out the user entitlement table in plain text, to be imported into database

Also aliased as: print_user
save!(file=@file_user_map)
Alias for: save_som_user_map!
save_som_user_map!(file=@file_user_map) click to toggle source

Save the SOM to AD user mapping relation into the cache file

# File lib/ucert/som_tracker.rb, line 144
def save_som_user_map!(file=@file_user_map)
        puts "Saving the known Som to AD user mapping relationship to file: #{file} ..." if @verbose
        begin
                timestamp=Time.now
                f=File.open(file, 'w')
                f.write "# local Som to AD user map file created by the #{self.class} class #{__method__} method at: #{timestamp}"
                @som_user_entitlement.each do |key,record|
                        value = record['DN']
                        f.write "\n#{record['uid'].upcase}|#{value}"
                end
                f.close
                puts "Som to AD user map file is successfully saved to: #{file}" if @verbose
        rescue => ee
                puts "Exception on method #{__method__}: #{ee}" if @verbose
        end
end
Also aliased as: save!
search_by_dn(dn)
Alias for: som_search_by_dn
search_by_id(uid)
Alias for: som_search_by_id
som_id_2_dn(id) click to toggle source

DN lookup via SOM for ssomems under SOM, such as CVM

# File lib/ucert/som_tracker.rb, line 214
def som_id_2_dn (id)
        @som_user_entitlement.each do |key,val|
                return val["DN"] if val["uid"] == id.strip
        end
        return nil
end
som_search_by_dn(dn) click to toggle source

Search user entitlement record by AD DN

# File lib/ucert/som_tracker.rb, line 163
    def som_search_by_dn (dn)
            begin
  puts "Perform search on the user entitlement record by AD DN: #{dn}" if @verbose
  @som_user_entitlement.each do |key, val|
      return val if @som_user_entitlement[key]['DN'].eql? dn
  end
                    return nil
rescue => ee
  puts "Exception on method #{__method__}: #{ee}"
end
    end
Also aliased as: search_by_dn
som_search_by_id(uid) click to toggle source

Search user entitlement record by USER_ID

# File lib/ucert/som_tracker.rb, line 200
    def som_search_by_id (uid)
            #begin
  puts "Perform search on the user entitlement record by USER_ID: #{uid}" if @verbose
  @som_user_entitlement.each do |key, val|
      return val if @som_user_entitlement[key]['USER_ID'].eql? uid.strip
  end
                    return nil
#rescue => ee
#  puts "Exception on method #{__method__}: #{ee}"
#end
    end
Also aliased as: search_by_id
uid_2_index(uid) click to toggle source

Search user entitlement instance valueable for uid, return index for match uid; return nil if no match found

# File lib/ucert/som_tracker.rb, line 191
def uid_2_index (uid)
        puts "Perform search on the user entitlement record by user ID: #{uid}" if @verbose
        @som_user_entitlement.each do |key,val|
                return key if val['uid'] == uid.strip
        end
        return nil
end
uid_include?(uid) click to toggle source

Search user entitlement instance valueable for uid, return true if found

# File lib/ucert/som_tracker.rb, line 177
def uid_include? (uid)
        puts "Determine if UID is already known: #{uid}" if @verbose
        return false if @som_user_entitlement.nil?
        @som_user_entitlement.each do |key,val|
                if val['uid'] == uid.strip
                        #puts "Found" if @verbose
                        return true
                end
        end
        #puts "Unfound" if @verbose
        return false
end

Private Instance Methods

insert_dn() click to toggle source

Procedures to add additonal field 'dn' into the @som_user_entitlement data structure, by person the AD search

# File lib/ucert/som_tracker.rb, line 85
def insert_dn
                #begin
                         puts "Insert DN into the record ..." if @verbose
                         tracker = Ucert::AdTracker.new(:verbose=>@verbose)
                         @som_user_entitlement.delete(nil)
                         @som_user_entitlement.each do |index, record|
                                 next if record.nil?
                                 puts "\n\nPerform DN lookup for record: #{record['uid']}" if @verbose
                                 key1 = record['uid'] unless record['uid'].nil?
                                 next if key1.nil?
                                 if key1 =~ /\\/
                                         key2 = key1.split('\\')[1]
                                 end
                                 my_key = key1.upcase
                                 puts "Perform 1st order search from the local cache: #{my_key}" if @verbose
                                 if @som_2_ad_user.key?(my_key)
                                         dn=@som_2_ad_user[my_key]
                                         # additional logic to update the existing DN record
                                         unless tracker.ad_person_records.key?(dn)
                                          dn = update_dn(tracker,dn)
                                         end
                                         puts "Found in the local cache file: #{dn}" if @verbose
                                 else
                            if dn.nil? and !key1.nil?
                                           puts "Perform 2nd order search only if the 1st one fail, by using: #{key1}" if @verbose
                                           dn = tracker.ad_search_by_text(key1, "person")
                                   end
                                        if dn.nil? and !key2.nil?
                                                puts "Perform 3rd order search only if the last fail, by using: #{key2}" if @verbose
                                                dn = tracker.ad_search_by_text(key2, "person")
                                        end
                                end
                                @som_user_entitlement[index]['DN'] = dn
                        end
                        tracker=nil
                #rescue => ee
                        #puts "Exception on method #{__method__}: #{ee}"
                        #tracker=nil
                #end
end
parse_som_user_report(file) click to toggle source

Parsing the Som user entitlement report in CSV format

# File lib/ucert/som_tracker.rb, line 33
  def parse_som_user_report (file)
                  #begin
                          puts "Parse the user entitlement report: #{file}" if @verbose
  @som_user_entitlement=Hash.new
                          user_record_index=0
  line_cnt=0
                          cur_user_id=String.new
                          header=Array.new
  #File.open(file,'r:gb18030:UTF-8').each do |line|
                          File.open(file,'r:gb18030:UTF-8').each do |line|
    puts "Processing SOM user report line number #{line_cnt.inspect}" if @verbose
                                  entry=line.chomp.split(",").map {|x| x.gsub(/(\s|\")/,"")}
    # skip the 1st line of the file (header line)
    if line_cnt == 0
                                          header=entry
      line_cnt+=1
      next
    end
                                   # clean the entry data
    puts entry.inspect if @verbose
    # Determine current user
    entry[0].strip!
    if entry[0].nil?
                                          line_cnt+=1
      next
          elsif entry[0].empty?
                                          line_cnt+=1
                                          next
                                          #app=Hash.new
    elsif entry[5] != cur_user_id
                                          cur_user_id=entry[5]
    end
    record=Hash[header.zip(entry)] unless entry[0].nil?
                                  puts "User record: #{record}" if @verbose
    if uid_include?(cur_user_id)
                                          index = uid_2_index(cur_user_id)
                                          @som_user_entitlement[index]['systems'].push(record)
                                  else
                                          user_record_index += 1
                                          @som_user_entitlement[user_record_index]=Hash.new
                                          @som_user_entitlement[user_record_index]['uid']=cur_user_id
                                          @som_user_entitlement[user_record_index]['systems']=Array.new
                                          @som_user_entitlement[user_record_index]['systems'].push(record)
                                  end
    line_cnt += 1
                    end
#rescue => ee
                  #    puts "Exception on method #{__method__}: #{ee}"
                  #end
  end