/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.iwave.ext.linux.command;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.collect.Lists;
import com.iwave.ext.linux.model.MultiPathEntry;
import com.iwave.ext.linux.model.PathInfo;
import com.iwave.ext.text.TextParser;
public class ListMultiPathEntriesCommand extends LinuxResultsCommand<List<MultiPathEntry>> {
private static final Pattern ENTRY_PATTERN = Pattern
.compile("(\\w+)\\s+(?:\\((.*)\\)\\s+)?(dm-\\w+)");
private static final Pattern PATH_PATTERN = Pattern
.compile("- (\\d+):(\\d+):(\\d+):(\\d+)\\s+(\\w+)\\s+\\d+:\\d+\\s+(.*)");
public ListMultiPathEntriesCommand() {
setCommand(CommandConstants.MULTIPATH);
addArgument("-ll");
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(ENTRY_PATTERN);
for (String textBlock : parser.parseTextBlocks(stdout)) {
MultiPathEntry entry = readEntry(textBlock);
if (entry != null) {
results.add(entry);
}
}
}
}
private MultiPathEntry readEntry(String textBlock) {
Matcher m = ENTRY_PATTERN.matcher(textBlock);
if (m.find()) {
MultiPathEntry entry = new MultiPathEntry();
entry.setName(m.group(1));
// If there is no WWID group, it is the same as the name
if (m.group(2) != null) {
entry.setWwid(m.group(2));
}
else {
entry.setWwid(entry.getName());
}
entry.setDmName(m.group(3));
entry.setPaths(readPaths(textBlock));
return entry;
}
else {
return null;
}
}
private List<PathInfo> readPaths(String textBlock) {
List<PathInfo> paths = Lists.newArrayList();
Matcher m = PATH_PATTERN.matcher(textBlock);
while (m.find()) {
PathInfo path = new PathInfo();
path.setHost(Integer.parseInt(m.group(1)));
path.setChannel(Integer.parseInt(m.group(2)));
path.setId(Integer.parseInt(m.group(3)));
path.setLun(Integer.parseInt(m.group(4)));
path.setDevice(m.group(5));
path.setStatus(m.group(6));
paths.add(path);
}
return paths;
}
}