MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/lib/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/lib/osds_afdlib.pm

#
# osds_afdlib.pm
# 
# Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
#
#
#    NAME
#      osds_afdlib.pm - Linux OSD library components for AFD.
#
#    DESCRIPTION
#      Purpose
#          Linux OSD library functions for the install/runtime scripts.
#
#    NOTES
#      All user visible output should be done in the common code.
#      this will ensure a consistent look and feel across all platforms.
#
#

use strict;
use acfslib;
use afdlib;
use osds_unix_linux_afdlib;
package osds_afdlib;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(
                 lib_osds_afd_verify_devices
                 lib_osds_afd_load_driver 
                 lib_osds_afd_unload_driver
                 lib_osds_afd_create_udev
                 lib_osds_get_afd_udev_rules_file
                 lib_osds_afd_copy_library 
                 lib_osds_afd_post_load_setup 
                 lib_osds_afd_delete_oracleafd_disks 
                 @AFD_DRIVER_COMPONENTS
                 );

our (@AFD_DRIVER_COMPONENTS) = (
       "oracleafd.ko"
       );


my ($CACHED_INSTALLED_DRIVERS);               # saved find /lib/modules output
my ($UNAME_R) = `uname -r`;
chomp ($UNAME_R);
my ($ARCH) = `uname -i`;
chomp ($ARCH);                                # e.g., "x86-64"
my $ORACLE_HOME = $ENV{ORACLE_HOME};
use constant UID => 4;
use constant GID => 5;

# /sbin/fuser     ... RH Enterprise Linux
# /bin/fuser      ... Suse
# /usr/sbin/fuser ... AIX, HPUX, Solaris
# /usr/sbin/lsof  ... RH Enterprise Linux
# /sbin/modprobe  ... RH Enterprise Linux
$ENV{PATH} = $ENV{PATH} . ":/sbin:/bin:/usr/sbin";

# AFD Library name
my ($LIBAFD)   = "libafd18.so";

# lib_osds_get_afd_udev_rules_file
#
# get AFD udev rules directory and file used by both install/uninstall
# AFD Udev rules file.
sub lib_osds_get_afd_udev_rules_file
{
  return get_udev_common("/etc/udev/rules.d", "udev_rules", "53-afd.rules");
}

# lib_osds_afd_create_udev
#
# Create a AFD udev file
#
sub lib_osds_afd_create_udev
{
  my ($asmadmin) = @_;
  my ($udev_perm_file);
  my ($user) = acfslib::getParam("ORACLE_OWNER");

  $udev_perm_file = lib_osds_get_afd_udev_rules_file();
  # create the permissions file - replaces existing file (if any)
  open  PERM, ">$udev_perm_file" or die "can't create file: $!";
  print PERM  "#\n";
  print PERM  "# AFD devices\n";
  print PERM  "KERNEL==\"oracleafd/.*\", OWNER=\"$user\", GROUP=\"$asmadmin\", MODE=\"0775\"\n";
  print PERM  "KERNEL==\"oracleafd/*\", OWNER=\"$user\", GROUP=\"$asmadmin\", MODE=\"0775\"\n";
  print PERM  "KERNEL==\"oracleafd/disks/*\", OWNER=\"$user\", GROUP=\"$asmadmin\", MODE=\"0664\"\n";
  close PERM;
} # end lib_osds_afd_create_udev



# lib_osds_afd_verify_devices
#
# Verify that the AFD drivers are loaded and running by checking the
# existence of the device control files for the drivers.
#
sub lib_osds_afd_verify_devices
{
  my $ret;
  $ret = osds_unix_linux_afdlib::lib_osds_verify_afd_devices(); 
  return $ret;
}

sub lib_osds_afd_load_driver
{
  my($driver, $COMMAND) = @_;
  my $result;

  $result = osds_acfslib::lib_osds_load_driver($driver, $COMMAND);
  
  return $result;
}

sub lib_osds_afd_unload_driver
{
  my($driver) = @_;
  my $result;

  $result = osds_acfslib::lib_osds_unload_driver($driver);
  return $result;
}


# get_udev_common
#
# get afd udev permissions file
sub get_udev_common
{
  my ($default_dir, $config_param, $file_name) = @_;
  my ($line);                              # line from the udev.conf file

  # We get the rules directory from the udev.conf file
  # and then append the file name.
  my ($udev_perm_dir) = $default_dir;       # default directory name

  # open file for read
  open (CONF, "</etc/udev/udev.conf");
  while ($line = <CONF>)
  {
    my ($line_org) = $line;
    # strip off the parameter name, if it exists, leaving only the set value
    $line =~ s/^$config_param=//;

    # did we find the right line in the file?
    # we know it's the right line if the substitution worked.
    if ($line ne $line_org)
    {
      # remove the double quotes
      $line =~ s/"//g;
      # remove the carriage return
      chomp($line);
      $udev_perm_dir = $line;
      last;
    }
  }
  close CONF;

  # avoid "//" - just to make it pretty as it works fine as is
  $udev_perm_dir =~ s/\/$//;

  return ($udev_perm_dir . "/" . $file_name);
} # end get_udev_common


sub lib_osds_afd_copy_library
{
  my ($source);
  my ($ret);
  my ($return_code) = osds_unix_linux_acfslib::USM_SUCCESS;
  my ($whatbit) = `grep flags /proc/cpuinfo`;
  my ($target) = $ENV{_vendor_lib_loc};
  my ($asmadmin) = acfslib::lib_get_asm_admin_name();
  my ($user) = acfslib::getParam("ORACLE_OWNER"); 
  my ($uid);
  my ($gid);
  my ($libpath);

  if(!defined($target))
  {
    # Target should be of the type
    # /opt/oracle/extapi/[32,64]/{API}/{VENDOR}/{VERSION}/lib<apiname>.<ext>
    #
    if($whatbit =~ /lm/)
    {
      $target = "/opt/oracle/extapi/64/asm/orcl/1/";
    }
    elsif($whatbit =~ /tm/)
    {
     $target = "/opt/oracle/extapi/32/asm/orcl/1/";
    }
  }
  # libafd18.so goes to /opt/oracle/extapi/64/asm
  $source = "$ORACLE_HOME/lib/$LIBAFD";
  $libpath = $target.$LIBAFD; 
  # Get Owner and group of source
    # get the owner/group of the original file
  ($uid, $gid) = (stat($source))[UID,GID];
  if($user)
  {
    $uid = getpwnam($user);
  }
  $gid = getgrnam($asmadmin);

  if(!(-e $target))
  {
    `mkdir -m 755 -p $target`;
     if ($?)
     {
       acfslib::lib_error_print(9345,
                               "Unable to create directory: '%s'.", $target);
       return osds_unix_linux_acfslib::USM_FAIL;
     }
  }

  # Give 755 to /opt/oracle/extapi/*
  system("chmod 755 /opt/oracle");
  system("chmod -R 755 /opt/oracle/extapi");

  acfslib::lib_verbose_print (9504, "Copying file '%s' to the path '%s'",
                        $source,
                        $target);

  unlink ("$libpath") if ( -e "$libpath"); 
  $ret = system ("cp -f $source $target");
  $return_code = osds_unix_linux_acfslib::USM_FAIL if $ret;
  if($return_code == osds_unix_linux_acfslib::USM_SUCCESS)
  {
     system("chmod 755 $libpath");
     $ret = chown $uid, $gid, $libpath;
     if($ret != 1)
     {
        acfslib::lib_error_print(9426,
                         "unable to set the file attributes for file '%s'",
                         $libpath);
        return osds_unix_linux_acfslib::USM_FAIL;
     } 
  } 
  return $return_code;
}

sub lib_osds_afd_post_load_setup
{
  my ($disks_dir)  = osds_unix_linux_afdlib::lib_osds_fetch_afd_disks_dir();
  my ($return_val) = osds_unix_linux_acfslib::USM_SUCCESS;
  my ($asmuser)    = acfslib::getParam("ORACLE_OWNER");

  # Get the name of the ASM adminisrator
  my ($asmadmin) = acfslib::lib_get_asm_admin_name();

  # Make sure that the proper /dev files get created by udevd
  acfslib::lib_inform_print(649, "Verifying AFD devices.");

  $return_val = lib_osds_afd_verify_devices();
  if ($return_val != osds_unix_linux_acfslib::USM_SUCCESS)
  {
    # osds_verify_afd_devices() will print the specific error(s), if any;
    return $return_val;
  }

  # Give read permissions for 'others' to access AFD devices
  `mkdir -m 775 -p $disks_dir`;
  if ($?)
  {
    acfslib::lib_error_print(9345,
                             "Unable to create directory: '%s'.", $disks_dir);
    return osds_unix_linux_acfslib::USM_FAIL;
  }
  if($asmuser)
  {
    system("chown $asmuser $disks_dir");
  }
  system("chgrp $asmadmin $disks_dir");

  # TODO : Until the bug 25914411 fix is identified, disable logging
  # Enable logging
  #`$ORACLE_HOME/bin/afdtool -log -d`;
  #if ($?)
  #{
  #  acfslib::lib_inform_print(9225, "Failed to start AFD logging.");
  #  # Though failed, continue with rest of the flow
  #}

  # Scan devices and send other persistent states to AFD Driver
  `$ORACLE_HOME/bin/afdboot -scandisk`;

  return $return_val;
}

sub lib_osds_afd_delete_oracleafd_disks
{
  my ($disksdir) =  osds_unix_linux_afdlib::lib_osds_fetch_afd_disks_dir();

  if(opendir (DIR, $disksdir))
  {
    while (my $file = readdir(DIR)) {
      if($file ne "." && $file ne "..")
      {
        my $filepath = $disksdir."/".$file;
        if(-e $filepath)
        {
         unlink("$filepath");
        }  
      }
    }
    closedir(DIR);	 
  }
}

####### internal only functions #########

OHA YOOOO