/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.hpux.command; import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import com.google.common.collect.Lists; import com.iwave.ext.linux.model.HBAInfo; import com.iwave.ext.text.TextParser; public class ListHBAInfoCommand extends HpuxResultsCommand<List<HBAInfo>> { private static final Pattern DEVICE_PATTERN = Pattern.compile("host: (.+)"); private static final Pattern WWPN_PATTERN = Pattern.compile("N_Port Port World Wide Name = 0x([0-9a-fA-F]*)"); private static final Pattern WWNN_PATTERN = Pattern.compile("N_Port Node World Wide Name = 0x([0-9a-fA-F]*)"); public ListHBAInfoCommand() { StringBuilder sb = new StringBuilder(); sb.append("for DEVICE in $(/usr/sbin/ioscan -kfnCfc | awk '/dev/{print $1}')\n"); sb.append("do \n"); sb.append(" echo \"host: $DEVICE\" ; \n"); sb.append(" /opt/fcms/bin/fcmsutil $DEVICE | grep \"World Wide Name\" | grep \"N_Port\" \n"); sb.append("done; "); setCommand(sb.toString()); setRunAsRoot(true); } @Override public void parseOutput() { results = Lists.newArrayList(); if (getOutput() != null && getOutput().getStdout() != null) { String stdout = getOutput().getStdout(); TextParser parser = new TextParser(); parser.setRepeatPattern(DEVICE_PATTERN); for (String textBlock : parser.parseTextBlocks(stdout)) { String host = parser.findMatch(DEVICE_PATTERN, textBlock); if (StringUtils.isNotBlank(host)) { HBAInfo hba = new HBAInfo(); String wwnn = parser.findMatch(WWNN_PATTERN, textBlock); hba.setWwnn(normalizeWWN(wwnn)); String wwpn = parser.findMatch(WWPN_PATTERN, textBlock); hba.setWwpn(normalizeWWN(wwpn)); results.add(hba); } } } } private String normalizeWWN(String wwn) { wwn = StringUtils.trim(wwn); wwn = StringUtils.leftPad(wwn, 16, '0'); wwn = StringUtils.lowerCase(wwn); return wwn; } }