Prior to this patch the library would return "rhel" instead of
"oraclelinux" for Oracle Linux OSes.
---
generator/actions.ml | 4 ++++
src/guestfs-internal.h | 1 +
src/inspect-fs-cd.c | 25 +++++++++++++++++++++++++
src/inspect-fs-unix.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
src/inspect-fs.c | 2 ++
src/inspect-icon.c | 1 +
src/inspect.c | 1 +
7 files changed, 78 insertions(+), 1 deletion(-)
diff --git a/generator/actions.ml b/generator/actions.ml
index ef3f17e..72846fd 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -1077,6 +1077,10 @@ OpenBSD.
OpenSUSE.
+=item \"oraclelinux\"
+
+Oracle Linux.
+
=item \"pardus\"
Pardus.
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index 63065c4..b99335b 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -540,6 +540,7 @@ enum inspect_os_distro {
OS_DISTRO_SUSE_BASED,
OS_DISTRO_SLES,
OS_DISTRO_OPENBSD,
+ OS_DISTRO_ORACLE_LINUX,
};
enum inspect_os_package_format {
diff --git a/src/inspect-fs-cd.c b/src/inspect-fs-cd.c
index 45d7bb5..8e1e8d0 100644
--- a/src/inspect-fs-cd.c
+++ b/src/inspect-fs-cd.c
@@ -211,6 +211,16 @@ check_fedora_installer_root (guestfs_h *g, struct inspect_fs *fs)
free (str);
}
+ r = guestfs___first_egrep_of_file (g, "/.treeinfo",
+ "^family = Oracle Linux Server$",
+ 0, &str);
+ if (r == -1)
+ return -1;
+ if (r > 0) {
+ fs->distro = OS_DISTRO_ORACLE_LINUX;
+ free (str);
+ }
+
/* XXX should do major.minor before this */
r = guestfs___first_egrep_of_file (g, "/.treeinfo",
"^version = [[:digit:]]+", 0, &str);
@@ -324,6 +334,21 @@ check_isolinux_installer_root (guestfs_h *g, struct inspect_fs *fs)
return -1;
}
+ /* XXX parse major.minor */
+ r = guestfs___first_egrep_of_file (g, "/isolinux/isolinux.cfg",
+ "^menu title Welcome to Oracle Linux Server
[[:digit:]]+",
+ 0, &str);
+ if (r == -1)
+ return -1;
+ if (r > 0) {
+ fs->distro = OS_DISTRO_ORACLE_LINUX;
+ fs->major_version =
+ guestfs___parse_unsigned_int_ignore_trailing (g, &str[42]);
+ free (str);
+ if (fs->major_version == -1)
+ return -1;
+ }
+
return 0;
}
diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c
index 17b0b5f..739a431 100644
--- a/src/inspect-fs-unix.c
+++ b/src/inspect-fs-unix.c
@@ -60,6 +60,9 @@ static pcre *re_centos_no_minor;
static pcre *re_scientific_linux_old;
static pcre *re_scientific_linux;
static pcre *re_scientific_linux_no_minor;
+static pcre *re_oracle_linux_old;
+static pcre *re_oracle_linux;
+static pcre *re_oracle_linux_no_minor;
static pcre *re_major_minor;
static pcre *re_xdev;
static pcre *re_cciss;
@@ -112,6 +115,12 @@ compile_regexps (void)
"Scientific Linux.*release (\\d+)\\.(\\d+)", 0);
COMPILE (re_scientific_linux_no_minor,
"Scientific Linux.*release (\\d+)", 0);
+ COMPILE (re_oracle_linux_old,
+ "Oracle Linux.*release (\\d+).*Update (\\d+)", 0);
+ COMPILE (re_oracle_linux,
+ "Oracle Linux.*release (\\d+)\\.(\\d+)", 0);
+ COMPILE (re_oracle_linux_no_minor,
+ "Oracle Linux.*release (\\d+)", 0);
COMPILE (re_major_minor, "(\\d+)\\.(\\d+)", 0);
COMPILE (re_xdev, "^/dev/(h|s|v|xv)d([a-z]+)(\\d*)$", 0);
COMPILE (re_cciss, "^/dev/(cciss/c\\d+d\\d+)(?:p(\\d+))?$", 0);
@@ -141,6 +150,9 @@ free_regexps (void)
pcre_free (re_scientific_linux_old);
pcre_free (re_scientific_linux);
pcre_free (re_scientific_linux_no_minor);
+ pcre_free (re_oracle_linux_old);
+ pcre_free (re_oracle_linux);
+ pcre_free (re_oracle_linux_no_minor);
pcre_free (re_major_minor);
pcre_free (re_xdev);
pcre_free (re_cciss);
@@ -417,8 +429,39 @@ guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs)
goto skip_release_checks;
}
- if (guestfs_is_file_opts (g, "/etc/redhat-release",
+ /* Oracle Linux includes a "/etc/redhat-release" file, hence the Oracle
check
+ * needs to be performed before the Red-Hat one.
+ */
+ if (guestfs_is_file_opts (g, "/etc/oracle-release",
GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) {
+
+ fs->distro = OS_DISTRO_ORACLE_LINUX;
+
+ if (parse_release_file (g, fs, "/etc/oracle-release") == -1)
+ return -1;
+
+ if (match2 (g, fs->product_name, re_oracle_linux_old, &major, &minor) ||
+ match2 (g, fs->product_name, re_oracle_linux, &major, &minor)) {
+ fs->major_version = guestfs___parse_unsigned_int (g, major);
+ free (major);
+ if (fs->major_version == -1) {
+ free (minor);
+ return -1;
+ }
+ fs->minor_version = guestfs___parse_unsigned_int (g, minor);
+ free (minor);
+ if (fs->minor_version == -1)
+ return -1;
+ } else if ((major = match1 (g, fs->product_name, re_oracle_linux_no_minor)) !=
NULL) {
+ fs->major_version = guestfs___parse_unsigned_int (g, major);
+ free (major);
+ if (fs->major_version == -1)
+ return -1;
+ fs->minor_version = 0;
+ }
+ }
+ else if (guestfs_is_file_opts (g, "/etc/redhat-release",
+ GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) {
fs->distro = OS_DISTRO_REDHAT_BASED; /* Something generic Red Hat-like. */
if (parse_release_file (g, fs, "/etc/redhat-release") == -1)
diff --git a/src/inspect-fs.c b/src/inspect-fs.c
index 89c9335..c011b5a 100644
--- a/src/inspect-fs.c
+++ b/src/inspect-fs.c
@@ -449,6 +449,7 @@ guestfs___check_package_format (guestfs_h *g, struct inspect_fs *fs)
case OS_DISTRO_SLES:
case OS_DISTRO_CENTOS:
case OS_DISTRO_SCIENTIFIC_LINUX:
+ case OS_DISTRO_ORACLE_LINUX:
fs->package_format = OS_PACKAGE_FORMAT_RPM;
break;
@@ -494,6 +495,7 @@ guestfs___check_package_management (guestfs_h *g, struct inspect_fs
*fs)
case OS_DISTRO_RHEL:
case OS_DISTRO_CENTOS:
case OS_DISTRO_SCIENTIFIC_LINUX:
+ case OS_DISTRO_ORACLE_LINUX:
if (fs->major_version >= 5)
fs->package_management = OS_PACKAGE_MANAGEMENT_YUM;
else
diff --git a/src/inspect-icon.c b/src/inspect-icon.c
index f4194f5..94b63a2 100644
--- a/src/inspect-icon.c
+++ b/src/inspect-icon.c
@@ -137,6 +137,7 @@ guestfs__inspect_get_icon (guestfs_h *g, const char *root, size_t
*size_r,
case OS_DISTRO_REDHAT_BASED:
case OS_DISTRO_CENTOS:
case OS_DISTRO_SCIENTIFIC_LINUX:
+ case OS_DISTRO_ORACLE_LINUX:
r = icon_rhel (g, fs, &size);
break;
diff --git a/src/inspect.c b/src/inspect.c
index 49bf765..1a9554e 100644
--- a/src/inspect.c
+++ b/src/inspect.c
@@ -164,6 +164,7 @@ guestfs__inspect_get_distro (guestfs_h *g, const char *root)
case OS_DISTRO_MEEGO: ret = safe_strdup (g, "meego"); break;
case OS_DISTRO_OPENBSD: ret = safe_strdup (g, "openbsd"); break;
case OS_DISTRO_OPENSUSE: ret = safe_strdup (g, "opensuse"); break;
+ case OS_DISTRO_ORACLE_LINUX: ret = safe_strdup (g, "oraclelinux"); break;
case OS_DISTRO_PARDUS: ret = safe_strdup (g, "pardus"); break;
case OS_DISTRO_REDHAT_BASED: ret = safe_strdup (g, "redhat-based"); break;
case OS_DISTRO_RHEL: ret = safe_strdup (g, "rhel"); break;
--
1.8.3.2