/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.aix.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 AixResultsCommand<List<HBAInfo>> {
private static final Pattern HOST_PATTERN = Pattern.compile("host: fcs(\\d+)");
private static final Pattern WWPN_PATTERN = Pattern.compile("Network Address[.]+([0-9a-fA-F]*)");
private static final Pattern WWNN_PATTERN = Pattern.compile("Device Specific.\\(Z8\\)[.]+([0-9a-fA-F]*)");
public ListHBAInfoCommand() {
StringBuilder sb = new StringBuilder();
sb.append("for host in `lsdev -Cc adapter -S 1 | grep ^fcs | awk '{print $1}'`; do ");
sb.append(" echo \"host: $host\" ; ");
sb.append(" lscfg -vpl $host | grep -E -i -w 'Network Address|Device Specific.\\(Z8\\)'; ");
sb.append("done; ");
setCommand(sb.toString());
}
@Override
public void parseOutput() {
results = Lists.newArrayList();
if (getOutput() != null && getOutput().getStdout() != null) {
String stdout = getOutput().getStdout();
TextParser parser = new TextParser();
parser.setRepeatPattern(HOST_PATTERN);
for (String textBlock : parser.parseTextBlocks(stdout)) {
String host = parser.findMatch(HOST_PATTERN, textBlock);
if (StringUtils.isNotBlank(host)) {
HBAInfo hba = new HBAInfo();
hba.setHostId(Integer.parseInt(host));
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;
}
}