summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--loader2/loader.c2
-rw-r--r--loader2/nfsinstall.c200
-rw-r--r--rescue.py2
3 files changed, 113 insertions, 91 deletions
diff --git a/loader2/loader.c b/loader2/loader.c
index bd658919b..3a7b9f3e5 100644
--- a/loader2/loader.c
+++ b/loader2/loader.c
@@ -1761,7 +1761,7 @@ int main(int argc, char ** argv) {
/* we only want to use RHupdates on nfs installs. otherwise, we'll
* use files on the first iso image and not be able to umount it */
- if (!strncmp(url, "nfs:", 4)) {
+ if (!strncmp(url, "nfs:", 4) && !FL_STAGE2(flags)) {
logMessage(INFO, "NFS install method detected, will use RHupdates/");
useRHupdates = 1;
} else {
diff --git a/loader2/nfsinstall.c b/loader2/nfsinstall.c
index a27b00356..71612dd9a 100644
--- a/loader2/nfsinstall.c
+++ b/loader2/nfsinstall.c
@@ -88,14 +88,12 @@ char * mountNfsImage(struct installMethod * method,
char * directory = NULL;
char * mountOpts = NULL;
char * fullPath = NULL;
- char * path;
char * url = NULL;
enum { NFS_STAGE_NFS, NFS_STAGE_MOUNT,
NFS_STAGE_DONE } stage = NFS_STAGE_NFS;
- int rc;
- int dir = 1;
+ int rc, tmp;
/* JKFIXME: ASSERT -- we have a network device setup when we get here */
while (stage != NFS_STAGE_DONE) {
@@ -115,6 +113,7 @@ char * mountNfsImage(struct installMethod * method,
if (!host || !directory) {
logMessage(ERROR, "missing host or directory specification");
+ flags &= ~LOADER_FLAGS_STAGE2;
loaderData->method = -1;
break;
} else {
@@ -122,17 +121,16 @@ char * mountNfsImage(struct installMethod * method,
directory = strdup(directory);
}
} else if (nfsGetSetup(&host, &directory) == LOADER_BACK) {
+ flags &= ~LOADER_FLAGS_STAGE2;
return NULL;
}
stage = NFS_STAGE_MOUNT;
- dir = 1;
break;
case NFS_STAGE_MOUNT: {
int foundinvalid = 0;
- char * buf;
- char * cdurl = NULL;
+ char *buf, *stage2dir;
struct in_addr ip;
if (loaderData->noDns && !(inet_pton(AF_INET, host, &ip))) {
@@ -141,72 +139,93 @@ char * mountNfsImage(struct installMethod * method,
if (loaderData->method >= 0) {
loaderData->method = -1;
}
+
+ flags &= ~LOADER_FLAGS_STAGE2;
break;
}
- fullPath = alloca(strlen(host) + strlen(directory) + 2);
- sprintf(fullPath, "%s:%s", host, directory);
+ /* Try to see if we're booted off of a CD with stage2. However,
+ * passing stage2= overrides this check.
+ */
+ if (!FL_STAGE2(flags) && findAnacondaCD("/mnt/stage2", 0)) {
+ logMessage(INFO, "Detected stage 2 image on CD");
+ winStatus(50, 3, _("Media Detected"),
+ _("Local installation media detected..."), 0);
+ sleep(3);
+ newtPopWindow();
+
+ stage = NFS_STAGE_DONE;
+ url = "nfs:/mnt/source";
+ break;
+ }
+
+ if (FL_STAGE2(flags)) {
+ if (!strrchr(directory, '/')) {
+ return NULL;
+ flags &= ~LOADER_FLAGS_STAGE2;
+ } else {
+ tmp = asprintf(&fullPath, "%s:%.*s/", host,
+ (int) (strrchr(directory, '/') - directory), directory);
+ }
+ }
+ else
+ tmp = asprintf(&fullPath, "%s:%s", host, directory);
logMessage(INFO, "mounting nfs path %s", fullPath);
if (FL_TESTING(flags)) {
stage = NFS_STAGE_DONE;
- dir = 1;
break;
}
stage = NFS_STAGE_NFS;
if (!doPwMount(fullPath, "/mnt/source", "nfs", mountOpts)) {
- if (!access("/mnt/source/images/stage2.img", R_OK)) {
- logMessage(INFO, "can access /mnt/source/images/stage2.img");
- /* Try to see if we're booted off of a CD with stage2. However,
- * passing stage2= overrides this check.
- */
- if (!FL_STAGE2(flags))
- cdurl = findAnacondaCD("/mnt/stage2", 0);
-
- if (cdurl) {
- logMessage(INFO, "Detected stage 2 image on CD");
- winStatus(50, 3, _("Media Detected"),
- _("Local installation media detected..."), 0);
- sleep(3);
- newtPopWindow();
- rc = 0;
- } else {
- rc = mountStage2("/mnt/source/images/stage2.img");
- logMessage(DEBUGLVL, "after mountStage2, rc is %d", rc);
- }
- if (rc) {
- if (rc == -1) {
- foundinvalid = 1;
- logMessage(WARNING, "not the right one");
- }
+ if (FL_STAGE2(flags)) {
+ stage2dir = strdup("/mnt/source");
+ tmp = asprintf(&buf, "/mnt/source/%s", strrchr(directory, '/'));
+ } else {
+ stage2dir = strdup("/mnt/source/images");
+ buf = strdup("/mnt/source/images/stage2.img");
+ }
+
+ winStatus(70, 3, _("Retrieving"), "%s %s...", _("Retrieving"), buf);
+ rc = copyFile(buf, "/tmp/stage2.img");
+ newtPopWindow();
+
+ free(buf);
+ free(stage2dir);
+
+ if (!rc) {
+ logMessage(INFO, "can access %s", buf);
+ rc = mountStage2("/tmp/stage2.img", stage2dir);
+
+ if (rc && rc == -1) {
+ foundinvalid = 1;
+ logMessage(WARNING, "not the right one");
+ umount("/mnt/source");
} else {
stage = NFS_STAGE_DONE;
- url = "nfs://mnt/source";
+
+ if (FL_STAGE2(flags)) {
+ rc = asprintf(&url, "nfs:%s:%s", host, directory);
+ umount("/mnt/source");
+ } else {
+ url = strdup("nfs:/mnt/source");
+ }
+
break;
}
} else {
- logMessage(WARNING, "unable to access /mnt/source/images/stage2.img");
+ umount("/mnt/source");
+ logMessage(WARNING, "unable to access %s", buf);
}
-
+ } else if (!doPwMount(fullPath, "/mnt/isodir", "nfs", mountOpts)) {
+ char *path;
/* If we get here, it wasn't a regular NFS method but it may
* still be NFSISO. Remount on the isodir mountpoint and try
* again.
*/
- umount("/mnt/source");
- if (!doPwMount(fullPath, "/mnt/isodir", "nfs", mountOpts)) {
- } else {
- newtWinMessage(_("Error"), _("OK"),
- _("That directory could not be mounted from "
- "the server."));
- if (loaderData->method >= 0) {
- loaderData->method = -1;
- }
- break;
- }
-
if ((path = validIsoImages("/mnt/isodir", &foundinvalid))) {
foundinvalid = 0;
logMessage(INFO, "Path to valid iso is %s", path);
@@ -215,55 +234,37 @@ char * mountNfsImage(struct installMethod * method,
if (mountLoopback(path, "/mnt/source", "/dev/loop1"))
logMessage(WARNING, "failed to mount iso %s loopback", path);
else {
- /* try to see if we're booted off of a CD with stage2 */
- cdurl = findAnacondaCD("/mnt/stage2", 0);
- if (cdurl) {
- logMessage(INFO, "Detected stage 2 image on CD");
- winStatus(50, 3, _("Media Detected"),
- _("Local installation media detected..."), 0);
- sleep(3);
- newtPopWindow();
- rc = 0;
+ if (FL_STAGE2(flags)) {
+ stage2dir = strdup("/mnt/source");
+ tmp = asprintf(&buf, "/mnt/source/%s", strrchr(directory, '/'));
} else {
- rc = mountStage2("/mnt/source/images/stage2.img");
+ stage2dir = strdup("/mnt/source/images");
+ buf = strdup("/mnt/source/images/stage2.img");
}
- if (rc) {
- umountLoopback("/mnt/source", "/dev/loop1");
- if (rc == -1)
- foundinvalid = 1;
- } else {
- /* JKFIXME: hack because /mnt/source is hard-coded
- * in mountStage2() */
- copyUpdatesImg("/mnt/source/images/updates.img");
- copyProductImg("/mnt/source/images/product.img");
- queryIsoMediaCheck(path);
+ rc = copyFile(buf, "/tmp/stage2.img");
+ rc = mountStage2("/tmp/stage2.img", stage2dir);
+ free(buf);
+ free(stage2dir);
+ if (rc && rc == -1) {
+ foundinvalid = 1;
+ umountLoopback("/mnt/source", "/dev/loop1");
+ umount("/mnt/isodir");
+ } else {
stage = NFS_STAGE_DONE;
- url = "nfsiso:/mnt/source";
+
+ if (FL_STAGE2(flags)) {
+ rc = asprintf(&url, "nfs:%s:%s", host, directory);
+ umountLoopback("/mnt/source", "/dev/loop1");
+ umount("/mnt/isodir");
+ } else {
+ url = strdup("nfsiso:/mnt/source");
+ }
break;
}
}
}
-
- /* if we fell through to here we did not find a valid NFS */
- /* source for installation. */
- umount("/mnt/isodir");
- if (foundinvalid)
- rc = asprintf(&buf, _("The %s installation tree in that "
- "directory does not seem to match "
- "your boot media."), getProductName());
- else
- rc = asprintf(&buf, _("That directory does not seem to "
- "contain a %s installation tree."),
- getProductName());
- newtWinMessage(_("Error"), _("OK"), buf);
- free(buf);
- if (loaderData->method >= 0) {
- loaderData->method = -1;
- }
-
- break;
} else {
newtWinMessage(_("Error"), _("OK"),
_("That directory could not be mounted from "
@@ -273,6 +274,25 @@ char * mountNfsImage(struct installMethod * method,
}
break;
}
+
+ if (foundinvalid)
+ rc = asprintf(&buf, _("The %s installation tree in that "
+ "directory does not seem to match "
+ "your boot media."), getProductName());
+ else
+ rc = asprintf(&buf, _("That directory does not seem to "
+ "contain a %s installation tree."),
+ getProductName());
+
+ newtWinMessage(_("Error"), _("OK"), buf);
+ free(buf);
+
+ if (loaderData->method >= 0) {
+ loaderData->method = -1;
+ }
+
+ flags &= ~LOADER_FLAGS_STAGE2;
+ break;
}
case NFS_STAGE_DONE:
@@ -282,6 +302,8 @@ char * mountNfsImage(struct installMethod * method,
free(host);
free(directory);
+ if (fullPath)
+ free(fullPath);
return url;
}
@@ -399,7 +421,7 @@ int getFileFromNfs(char * url, char * dest, struct loaderData_s * loaderData) {
i = asprintf(&host, "%s/%s", host, path);
}
- logMessage(INFO, "file location: nfs://%s/%s", host, file);
+ logMessage(INFO, "file location: nfs:/%s/%s", host, file);
if (!doPwMount(host, "/tmp/mnt", "nfs", opts)) {
char * buf;
diff --git a/rescue.py b/rescue.py
index 803a1fb5e..f31eabb4e 100644
--- a/rescue.py
+++ b/rescue.py
@@ -133,7 +133,7 @@ def makeResolvConf(instPath):
# probably belongs somewhere else
#
def methodUsesNetworking(methodstr):
- for m in ['http://', 'ftp://', 'nfs:/', 'nfsiso:/']:
+ for m in ['http://', 'ftp://', 'nfs:', 'nfsiso:']:
if methodstr.startswith(m):
return 1
return 0