Author: locilka
Date: Thu Feb 7 18:51:48 2008
New Revision: 44255
URL: http://svn.opensuse.org/viewcvs/yast?rev=44255&view=rev
Log:
- Added possibility to disintegrate extensions integrated by
InstExtensionImage module.
Modified:
trunk/yast2/library/control/src/InstExtensionImage.ycp
trunk/yast2/package/yast2.changes
Modified: trunk/yast2/library/control/src/InstExtensionImage.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/yast2/library/control/src/InstExtensionImage.ycp?rev=44255&r1=44254&r2=44255&view=diff
==============================================================================
--- trunk/yast2/library/control/src/InstExtensionImage.ycp (original)
+++ trunk/yast2/library/control/src/InstExtensionImage.ycp Thu Feb 7 18:51:48 2008
@@ -285,6 +285,15 @@
// Already downloaded (and mounted and merged) files
list <string> already_downloaded_files = [];
+ // All integrated extensions
+ list <string> integrated_extensions = [];
+
+ // $["extension_name" : "mounted_as_directory", ...]
+ map extensions_mounted_as = $[];
+
+ // $["extension_name" : "downloaded_to_file", ...]
+ map extension_downloaded_as = $[];
+
/**
* Downloads extension archive (file system image) and integrates
* it to the current system. Extension name (param) is relative to the
@@ -317,6 +326,7 @@
if (extension == nil || extension == "") {
y2error ("Such extension name can't work: %1", extension);
+ return false;
}
// Every single GLOBAL function has to use LazyInit!
@@ -326,8 +336,14 @@
// extension='aaa' -> http://inst_base_url/aaa/?base_url_params
string extension_url = sformat ("%1%2?%3", base_url, extension, base_url_params);
+ // All "/" in relative extension name are replaced with "_._"
+ string extension_file_localname = extension;
+ if (regexpmatch (extension_file_localname, "/")) {
+ extension_file_localname = mergestring (splitstring (extension_file_localname, "/"), "_._");
+ }
+
// download to extension='aaa' -> /tmp/YaST.SomeMoreLetters/special/dir/aaa
- string extension_localfile = sformat ("%1%2", base_tmpdir, extension);
+ string extension_localfile = sformat ("%1%2", base_tmpdir, extension_file_localname);
if (contains (already_downloaded_files, extension_url)) {
y2milestone ("File %1 has already been downloaded", extension_url);
@@ -354,13 +370,15 @@
return false;
} else {
already_downloaded_files = add (already_downloaded_files, extension_url);
+ extension_downloaded_as[extension] = extension_localfile;
y2milestone ("Downloaded: %1 -> %2 (size: %3)", extension_url, extension_localfile, FileUtils::GetSize (extension_localfile));
}
// FIXME: Check SHA1sum against /content file
+ // sha1sum is not part of the inst-sys yet
// Creating subdir for extension to be mounted
- string extension_mount = sformat ("%1%2/", base_mounts, extension);
+ string extension_mount = sformat ("%1%2/", base_mounts, extension_file_localname);
cmd_run = (map) WFM::Execute (.local.bash_output,
sformat ("/bin/mkdir -p '%1'", String::Quote (extension_mount))
);
@@ -371,13 +389,15 @@
}
// Mounting the extension
- cmd = sformat ("/bin/mount -o loop '%1' '%2'", String::Quote (extension_localfile), String::Quote (extension_mount));
+ cmd = sformat ("/bin/mount -o loop,ro '%1' '%2'", String::Quote (extension_localfile), String::Quote (extension_mount));
cmd_run = (map) WFM::Execute (.local.bash_output, cmd);
if (cmd_run["exit"]:-1 != 0) {
y2error ("Cannot mount extension '%1': %2", cmd, cmd_run);
return false;
} else {
+ // can be umouted later
+ extensions_mounted_as[extension] = extension_mount;
y2milestone ("Mounted: %1 -> %2", extension_localfile, extension_mount);
}
@@ -393,7 +413,104 @@
y2milestone ("Lndir successful: %1 to %2", extension_mount, where_to_lndir);
}
+ // finally, extension has been integrated
+ integrated_extensions = add (integrated_extensions, extension);
+
return true;
}
+
+ /**
+ * Reverse function to DownloadAndIntegrateExtension(). The only difference is
+ * that it doesn't upload the image from where it has been downloaded.
+ * It just umounts the image and removes it.
+ *
+ * @see DownloadAndIntegrateExtension()
+ *
+ * @param string extension name
+ * @return boolean if successful
+ */
+ global boolean DesintegrateExtension (string extension) {
+ if (!Stage::initial()) {
+ y2error ("This module should be used in Stage::initial only!");
+ }
+
+ if (extension == nil || extension == "") {
+ y2error ("Such extension name can't work: %1", extension);
+ return false;
+ }
+
+ // Umounting
+ if (haskey (extensions_mounted_as, extension) && extensions_mounted_as[extension]:"" != "") {
+ string cmd_tmp_file = sformat ("%1/IEI_cmd_tmp_file", Directory::tmpdir);
+ string mounted_as = extensions_mounted_as[extension]:"";
+ string cmd = sformat (
+ "echo > '%1'; /bin/umount -f '%2' 1>>%2 2>>%2",
+ String::Quote (cmd_tmp_file), String::Quote (mounted_as)
+ );
+ y2milestone ("Umounting %1", mounted_as);
+ map cmd_run = (map) WFM::Execute (.local.bash_output, cmd);
+
+ if (cmd_run["exit"]:-1 != 0) {
+ y2warning (
+ "Cannot umount extension '%1' (%2):\n%3",
+ cmd, cmd_run["exit"]:-1, (string) WFM::Read (.local.string, cmd_tmp_file)
+ );
+ return false;
+ } else {
+ // not mounted anymore
+ extensions_mounted_as = remove (extensions_mounted_as, extension);
+ y2milestone ("Umounted: %2", extension);
+ }
+ } else {
+ y2warning ("Extension '%1' not mounted", extension);
+ }
+
+ // Removing the file
+ if (haskey (extension_downloaded_as, extension) && extension_downloaded_as[extension]:"" != "") {
+ string downloaded_as = extension_downloaded_as[extension]:"";
+ y2milestone ("Removing %1", downloaded_as);
+ map cmd_run = (map) WFM::Execute (.local.remove, downloaded_as);
+
+ if (cmd_run["exit"]:-1 != 0) {
+ y2warning ("Cannot remove extension %1", downloaded_as);
+ return false;
+ } else {
+ // not mounted anymore
+ extension_downloaded_as = remove (extension_downloaded_as, extension);
+ y2milestone ("Removed: %2", extension);
+ }
+ } else {
+ y2warning ("Extension '%1' not downloaded", extension);
+ }
+
+ return true;
+ }
+
+ /**
+ * Tries to disintegrate (umount, remove) all already used extensions.
+ * Nevertheless extensions already in use cannot be disintegrated.
+ *
+ * @return boolean whether successfull (almost always false)
+ */
+ global boolean DisintegrateAllExtensions () {
+ boolean ret = true;
+ list <string> foreach_loop = integrated_extensions;
+
+ y2milestone ("Disintegrating all extensions...");
+ foreach (string one_extension, foreach_loop, {
+ y2milestone ("Disintegrating extension: %1", one_extension);
+
+ if (DesintegrateExtension (one_extension)) {
+ integrated_extensions = filter (string one_filter, integrated_extensions, { return one_filter != one_extension; });
+
+ y2milestone ("Extension %1 has been disintegrated", one_extension);
+ } else {
+ ret = false;
+ y2error ("Disintegration of %1 has failed", one_extension);
+ }
+ });
+
+ return ret;
+ }
/* EOF */
}
Modified: trunk/yast2/package/yast2.changes
URL: http://svn.opensuse.org/viewcvs/yast/trunk/yast2/package/yast2.changes?rev=44255&r1=44254&r2=44255&view=diff
==============================================================================
--- trunk/yast2/package/yast2.changes (original)
+++ trunk/yast2/package/yast2.changes Thu Feb 7 18:51:48 2008
@@ -1,7 +1,9 @@
-------------------------------------------------------------------
Thu Feb 7 15:50:24 CET 2008 - locilka@suse.cz
-- Module InstExtensionImage moved here from installation
+- Module InstExtensionImage moved here from installation.
+- Added possibility to disintegrate extensions integrated by
+ InstExtensionImage module.
- 2.16.26
-------------------------------------------------------------------
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org