package org.ovirt.engine.core.utils; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.compat.Version; public class OS { private static final Pattern versionPattern = Pattern.compile("(^[\\d\\.]+)"); private static final List<String> OS_IDENTIFIER = Arrays.asList("RHEL", "oVirt Node", "RHEV Hypervisor"); private static final String OS_DELIMITER = " - "; private String name; private Version version; private String fullVersion; public OS() { name = ""; version = new Version(); fullVersion = ""; } public OS(String name, Version version, String fullVersion) { Objects.requireNonNull(name); Objects.requireNonNull(version); this.name = name.trim(); this.version = new Version(version.getMajor(), version.getMinor(), version.getBuild(), version.getRevision()); this.fullVersion = fullVersion; } public boolean isValid() { return !version.isNotValid() && !name.isEmpty(); } public boolean isSameOsFamily(final OS os) { return isSameOs(os) || OS_IDENTIFIER.contains(os.getName()) && OS_IDENTIFIER.contains(this.getName()); } public boolean isSameOs(final OS os) { return getName().equals(os.getName()); } public boolean isNewerThan(final OS os) { return getVersion().greater(os.getVersion()); } public boolean isOlderThan(final OS os) { return getVersion().less(os.getVersion()); } public boolean isSameMajorVersion(final OS os) { return getVersion().getMajor() == os.getVersion().getMajor(); } public String getName() { return name; } public String getOsFamily() { return OS_IDENTIFIER.contains(name) ? "RHEL" : name; } public Version getVersion() { return version; } public String getFullVersion() { return fullVersion; } public static OS fromPackageVersionString(String packageVersionString) { if (packageVersionString == null) { return new OS(); } String[] os = packageVersionString.split(OS_DELIMITER, 3); if (os.length < 2) { return new OS(); } final String name = os[0].trim(); final Matcher versionMatcher = versionPattern.matcher(os[1].trim()); final Version version; if (versionMatcher.find()) { if (name != null && name.toLowerCase().startsWith("fedora")) { int major = extractVersionPart(versionMatcher.group()); int minor = extractVersionPart(os[2].trim()); version = new Version(major, minor); } else { version = new Version(versionMatcher.group()); } } else if (os.length == 3 && os[2].contains("el6")) { version = new Version(6, -1); } else if (os.length == 3 && os[2].contains("el7")) { version = new Version(7, -1); } else { version = new Version(); } final String fullVersion = StringUtils.join(Arrays.copyOfRange(os, 1, os.length), OS_DELIMITER); return new OS(name, version, fullVersion); } private static int extractVersionPart(String versionPartStr) { if (StringUtils.isBlank(versionPartStr)) { return Version.VERSION_NOT_SET; } try { return Integer.parseInt(versionPartStr); } catch (NumberFormatException e) { return Version.VERSION_NOT_SET; } } }