/* The currently mounted device may be a Hurd root. Hurd has distros * just like Linux. */ int guestfs___check_hurd_root (guestfs_h *g, struct inspect_fs *fs) { fs->type = OS_TYPE_HURD; if (guestfs_is_file_opts (g, "/etc/debian_version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_DEBIAN; if (parse_release_file (g, fs, "/etc/debian_version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } /* Arch Hurd also exists, but inconveniently it doesn't have * the normal /etc/arch-release file. XXX */ /* Determine the architecture. */ check_architecture (g, fs); /* XXX Check for /etc/fstab. */ /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
/* The currently mounted device is known to be a FreeBSD root. */ int guestfs___check_freebsd_root (guestfs_h *g, struct inspect_fs *fs) { fs->type = OS_TYPE_FREEBSD; /* FreeBSD has no authoritative version file. The version number is * in /etc/motd, which the system administrator might edit, but * we'll use that anyway. */ if (guestfs_is_file_opts (g, "/etc/motd", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { if (parse_release_file (g, fs, "/etc/motd") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } /* Determine the architecture. */ check_architecture (g, fs); /* We already know /etc/fstab exists because it's part of the test above. */ const char *configfiles[] = { "/etc/fstab", NULL }; if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1) return -1; /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
/* Debian/Ubuntu install disks are easy ... * * These files are added by the debian-cd program, and it is worth * looking at the source code to determine exact values, in * particular '/usr/share/debian-cd/tools/start_new_disc' * * XXX Architecture? We could parse it out of the product name * string, but that seems quite hairy. We could look for the names * of packages. Also note that some Debian install disks are * multiarch. */ static int check_debian_installer_root (guestfs_h *g, struct inspect_fs *fs) { fs->product_name = guestfs___first_line_of_file (g, "/.disk/info"); if (!fs->product_name) return -1; fs->type = OS_TYPE_LINUX; if (STRPREFIX (fs->product_name, "Ubuntu")) fs->distro = OS_DISTRO_UBUNTU; else if (STRPREFIX (fs->product_name, "Debian")) fs->distro = OS_DISTRO_DEBIAN; (void) guestfs___parse_major_minor (g, fs); if (guestfs_is_file (g, "/.disk/cd_type") > 0) { char *cd_type = guestfs___first_line_of_file (g, "/.disk/cd_type"); if (!cd_type) return -1; if (STRPREFIX (cd_type, "dvd/single") || STRPREFIX (cd_type, "full_cd/single")) { fs->is_multipart_disk = 0; fs->is_netinst_disk = 0; } else if (STRPREFIX (cd_type, "dvd") || STRPREFIX (cd_type, "full_cd")) { fs->is_multipart_disk = 1; fs->is_netinst_disk = 0; } else if (STRPREFIX (cd_type, "not_complete")) { fs->is_multipart_disk = 0; fs->is_netinst_disk = 1; } free (cd_type); } return 0; }
/* The currently mounted device is known to be a Linux root. Try to * determine from this the distro, version, etc. Also parse * /etc/fstab to determine the arrangement of mountpoints and * associated devices. */ int guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs) { int r; fs->type = OS_TYPE_LINUX; if (guestfs_is_file_opts (g, "/etc/lsb-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { r = parse_lsb_release (g, fs); if (r == -1) /* error */ return -1; if (r == 1) /* ok - detected the release from this file */ goto skip_release_checks; } 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) return -1; char *major, *minor; if ((major = match1 (g, fs->product_name, re_fedora)) != NULL) { fs->distro = OS_DISTRO_FEDORA; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; } else if (match2 (g, fs->product_name, re_rhel_old, &major, &minor) || match2 (g, fs->product_name, re_rhel, &major, &minor)) { fs->distro = OS_DISTRO_RHEL; 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_rhel_no_minor)) != NULL) { fs->distro = OS_DISTRO_RHEL; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; fs->minor_version = 0; } else if (match2 (g, fs->product_name, re_centos_old, &major, &minor) || match2 (g, fs->product_name, re_centos, &major, &minor)) { fs->distro = OS_DISTRO_CENTOS; 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_centos_no_minor)) != NULL) { fs->distro = OS_DISTRO_CENTOS; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; fs->minor_version = 0; } else if (match2 (g, fs->product_name, re_scientific_linux_old, &major, &minor) || match2 (g, fs->product_name, re_scientific_linux, &major, &minor)) { fs->distro = OS_DISTRO_SCIENTIFIC_LINUX; 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_scientific_linux_no_minor)) != NULL) { fs->distro = OS_DISTRO_SCIENTIFIC_LINUX; 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/debian_version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_DEBIAN; if (parse_release_file (g, fs, "/etc/debian_version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/pardus-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_PARDUS; if (parse_release_file (g, fs, "/etc/pardus-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/arch-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_ARCHLINUX; /* /etc/arch-release file is empty and I can't see a way to * determine the actual release or product string. */ } else if (guestfs_is_file_opts (g, "/etc/gentoo-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_GENTOO; if (parse_release_file (g, fs, "/etc/gentoo-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/meego-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_MEEGO; if (parse_release_file (g, fs, "/etc/meego-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/slackware-version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_SLACKWARE; if (parse_release_file (g, fs, "/etc/slackware-version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/ttylinux-target", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_TTYLINUX; if (parse_release_file (g, fs, "/etc/ttylinux-target") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/SuSE-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_SUSE_BASED; if (parse_suse_release (g, fs, "/etc/SuSE-release") == -1) return -1; } /* Buildroot (http://buildroot.net) is an embedded Linux distro * toolkit. It is used by specific distros such as Cirros. */ else if (guestfs_is_file_opts (g, "/etc/br-version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { if (guestfs_is_file_opts (g, "/usr/share/cirros/logo", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) fs->distro = OS_DISTRO_CIRROS; else fs->distro = OS_DISTRO_BUILDROOT; /* /etc/br-version has the format YYYY.MM[-git/hg/svn release] */ if (parse_release_file (g, fs, "/etc/br-version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } skip_release_checks:; /* Determine the architecture. */ check_architecture (g, fs); /* We already know /etc/fstab exists because it's part of the test * for Linux root above. We must now parse this file to determine * which filesystems are used by the operating system and how they * are mounted. */ const char *configfiles[] = { "/etc/fstab", "/etc/mdadm.conf", NULL }; if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1) return -1; /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }