ACC SHELL

Path : /usr/share/YaST2/modules/
File Upload :
Current File : //usr/share/YaST2/modules/NetworkStorage.ycp

/**
 * File:	modules/NetworkStorage.ycp
 * Package:	Network configuration
 * Summary:	Networked disks
 * Authors:	Martin Vidner <mvidner@suse.cz>
 *
 * $Id: NetworkStorage.ycp 38154 2007-05-28 08:20:39Z mzugec $
 *
 * #176804 - Root on iSCSI installation fails
 */

{

module "NetworkStorage";

import "FileUtils";

global string getDevice(string mount_point){
 map out = (map)SCR::Execute(.target.bash_output, sformat("grep ' %1 ' /proc/mounts|grep -v rootfs|tr -d '\n'", mount_point));
 y2milestone("mountpoint found %1", out);
 list<string> rows =  splitstring(out["stdout"]:"", " ");
 string device="";
 if (rows[2]:""=="nfs") device="nfs";
	else device=rows[0]:"";
 y2milestone("%1 is on device: %2", mount_point, device);
 return device;
}

/**
 * If the disk is on a networked device (NFS, ISCSI),
 * the main NIC needs STARTMODE nfsroot instead of auto.
 * @return root dev over network
 */
global integer isDiskOnNetwork(string device){
 y2milestone("begin isDiskOnNetwork(%1) function", device);
 if (device=="nfs") return 2;
 if (size(device)==0) {
	y2error("Empty parameter for isDiskOnNetwork() function");
	return -1;
	}
 integer network_based=0;

 // test for LVM
 if (network_based==0 && issubstring(device, "/dev/mapper/")) {
  y2warning("LVM detected!");
  string group_name = splitstring(splitstring(device, "/")[3]:"", "-")[0]:"";
  y2milestone("LVM group name %1", group_name);
  map<string, any> command = (map<string, any>)SCR::Execute(.target.bash_output, sformat("pvs 2>/dev/null|grep %1", group_name));
  foreach(string row, filter(string s, splitstring(command["stdout"]:"", "\n"), { return (size(s)>0);}), {
   string lvm_device = filter(string s, splitstring(row, " "), { return (size(s)>0);})[0]:"";
   y2milestone("LVM physical device: %1", lvm_device);
   integer nb = isDiskOnNetwork(lvm_device);
   if (nb>0) network_based=nb;
  });
 }

 // test for RAID
 if (network_based==0 && issubstring(device, "/dev/md")){
  y2warning("RAID detected!");
  string raid = splitstring(device, "/")[2]:"";
  y2milestone("RAID %1 detected", raid);
  map<string, any> command = (map<string, any>)SCR::Execute(.target.bash_output, sformat("cat /proc/mdstat |grep %1|tr -d '\\n'", raid));
  list<string> raid_devices = sublist(splitstring(command["stdout"]:"", " "), 4);
  foreach(string dev, raid_devices, {
   if (!issubstring(dev, "/dev/")) dev = sformat("/dev/%1", dev);
   string raid_device = substring(dev, 0, findfirstof(dev, "["));
   integer nb = isDiskOnNetwork(raid_device);
   if (nb>0) network_based=nb;
   }
  );
 }

 //test for iSCSI
 if (network_based==0){
  if (issubstring(device, "/dev/")){
   device = splitstring(device, "/")[2]:"";
  }
  string sys=sformat("/sys/class/block/%1", device);
  if (FileUtils::Exists(sys)){
   if ((integer)SCR::Execute(.target.bash, sformat("ls -la %1 | grep -q session", sys))==0){
    y2warning("iSCSI detected!");
    network_based=1;
   }
  }
 }

// test for nfs (bnc#384420)
 if (network_based==0) {
  string space="[[:space:]]";
  if (SCR::Execute(.target.bash, sformat("grep '%1%2%3*nfs%4' /proc/mounts ", space, device, space, space))==0){
   y2milestone("device %1 is network based : %2", device, network_based);
   network_based=2;
  }
 }
 return network_based;
}

global list<string> getiBFTDevices(){
 if (SCR::Execute(.target.bash, "ls /sys/firmware/ibft")==0){
   map<string, any> output = (map<string, any>)SCR::Execute(.target.bash_output, "ls /sys/firmware/ibft/ethernet*/device/net/");
   list<string> ifaces = filter(string row, splitstring(output["stdout"]:"", "\n"), { return (size(row)>0);});
   return ifaces;
 } else return [];
}

/* EOF */
}

ACC SHELL 2018