# osds_okalib.pm # # Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. # # # NAME # osds_okalib.pm - Linux OSD library components for OKA. # # 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 okalib; use osds_unix_linux_okalib; package osds_okalib; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw( lib_osds_verify_oka_devices lib_osds_oka_create_udev lib_osds_oka_create_node lib_osds_get_oka_RH5_udev_rules_file @OKA_DRIVER_COMPONENTS %OKA_DRIVER_INFO OKA_IDX OKG_IDX ); # fixed constants for use use constant USM_SUCCESS => 0; use constant USM_FAIL => 1; use constant OKA_DEV => "/dev/oka"; # created when OKA loaded use constant OKA_IDX => 0; # index into driver_components use constant OKG_IDX => 1; # index into driver_components our (@OKA_DRIVER_COMPONENTS) = ( "oracka.ko", "oracka_mod_kga.ko", ); our %OKA_DRIVER_INFO = ( $OKA_DRIVER_COMPONENTS[OKA_IDX] => { 'type' => "drv", 'perm' => ""}, $OKA_DRIVER_COMPONENTS[OKG_IDX] => { 'type' => "drv", 'perm' => ""} ); 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" # /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"; # lib_osds_get_oka_RH5_udev_rules_file # # get OKA udev rules directory and file used by both install/uninstall # sub lib_osds_get_oka_RH5_udev_rules_file { return get_oka_udev_common("/etc/udev/rules.d", "udev_rules", "55-oka.rules"); } # lib_osds_oka_create_udev # # Create a OKA udev file - for now we create with open permissions but # eventually this should just be restricted # sub lib_osds_oka_create_udev { my ($okaadmin) = @_; my ($udev_perm_file); $udev_perm_file = lib_osds_get_oka_RH5_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 "# OKA devices\n"; print PERM "KERNEL==\"oka\", GROUP=\"$okaadmin\", MODE=\"0770\"\n"; close PERM; } # end lib_osds_oka_create_udev # lib_osds_oka_create_node # # Create the /dev node and set the proper permissions # sub lib_osds_oka_create_node { my ($okaadmin) = @_; my ($result) = 0; my ($node) = '/dev/oka'; my ($owner) = 'root'; if (-e $node) { # Node already exists print ("The node already exists.\n"); return USM_FAIL; } # Create the node $result = system("mknod -m 0770 $node c 142 0"); if ($result == 1) { print("The node could not be created.\n"); return USM_FAIL; } $result = system("chown $owner:$okaadmin $node"); if ($result == 1) { print("Could not change OKA node ownership.\n"); return USM_FAIL; } return USM_SUCCESS; } # end lib_osds_oka_create_node # lib_osds_verify_oka_devices # # Verify that the OKA drivers are loaded and running by checking the # existence of the device control files for the drivers. # sub lib_osds_verify_oka_devices { # Make sure that the proper /dev files get created my ($found) = 0; my ($max_wait_seconds) = 60; my $device = OKA_DEV; acfslib::lib_inform_print_noalert(9156, "Detecting control device '%s'.", $device); while (($max_wait_seconds > 0) && (!$found)) { if (! -e $device) { sleep 1; $max_wait_seconds -= 1; } else { $found = 1; } } if (!$found) { acfslib::lib_error_print_noalert(9121, "Failed to detect control device '%s'.", $device); return USM_FAIL; } return USM_SUCCESS; } #end lib_osds_verify_oka_devices # get_oka_udev_common # # common code for get_oka_RH5_udev_rules_file() sub get_oka_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, ") { 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_oka_udev_common ####### internal only functions #########