Hello community,
here is the log from the commit of package yast2-multipath
checked in at Wed Jul 11 10:43:16 CEST 2007.
--------
--- yast2-multipath/yast2-multipath.changes 2007-07-07 07:25:20.000000000 +0200
+++ /mounts/work_src_done/NOARCH/yast2-multipath/yast2-multipath.changes 2007-07-10 19:24:37.598095000 +0200
@@ -1,0 +2,7 @@
+Tue Jul 10 19:24:22 CEST 2007 - coyli@suse.de
+
+- fix #290314 (does not do with blacklist_exceptions)
+- fix #290265 (oes not do with default built-in configuration)
+
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ yast2-multipath.spec ++++++
--- /var/tmp/diff_new_pack.I21630/_old 2007-07-11 10:42:50.000000000 +0200
+++ /var/tmp/diff_new_pack.I21630/_new 2007-07-11 10:42:50.000000000 +0200
@@ -13,7 +13,7 @@
Name: yast2-multipath
URL: http://en.opensuse.org/Yast
Version: 2.13.0
-Release: 35
+Release: 37
License: GPL v2 or later
Group: System/YaST
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -73,6 +73,9 @@
%doc %{prefix}/share/doc/packages/yast2-multipath
%changelog
+* Tue Jul 10 2007 - coyli@suse.de
+- fix #290314 (does not do with blacklist_exceptions)
+- fix #290265 (oes not do with default built-in configuration)
* Sat Jul 07 2007 - coyli@suse.de
- fix #290264 (cannot read blacklist due to a typo)
* Mon Jun 18 2007 - ro@suse.de
++++++ yast2-multipath-2.13.0.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-multipath-2.13.0/src/complex.ycp new/yast2-multipath-2.13.0/src/complex.ycp
--- old/yast2-multipath-2.13.0/src/complex.ycp 2007-07-07 07:04:34.000000000 +0200
+++ new/yast2-multipath-2.13.0/src/complex.ycp 2007-07-10 19:04:30.000000000 +0200
@@ -34,8 +34,8 @@
integer service_status = 0;
boolean has_dumbtab = false;
-list <map> blacklist_items = [];
const string device_template = "vendor %1; product %2";
+const string builtin_multipath_conf_path = "/tmp/.yast2-multipath-builtin-conf";
/* Multipath summary dialog caption */
@@ -52,6 +52,9 @@
`Left(`RadioButton(`id(`start_multipath), `opt(`notify), _("&Use Multipath"), false))
))));
+
+list <map> blacklist_items = [];
+
/*
build black list table from blacklist_items
*/
@@ -90,8 +93,49 @@
))
)));
-list <map> defaults_items = [];
+list <map> blacklist_exception_items = [];
+
+/*
+ build black list exception table from blacklist_exception_items
+*/
+list<term> Build_BlacklistException_Table() {
+ integer id = 0;
+ list<term> table_items = maplist(map e, blacklist_exception_items, {
+ id = id + 1;
+ if(e["type"]:"" == "device") {
+ map sub_e = e["value"]:$[];
+ if(sub_e != $[]) {
+ string product_str = sub_e["product"]:"NA";
+ string vendor_str = sub_e["vendor"]:"NA";
+ string value = sformat(device_template, vendor_str, product_str);
+ return `item(`id(id), e["name"]:"NA", value);
+ }
+ } else if(e["type"]:"" == "node"){
+ return `item(`id(id), e["name"]:"NA", e["value"]:"NA");
+ }
+ });
+ return table_items;
+}
+
+term blacklist_exception_config = `VBox(
+ `id(`blacklist_config_id),
+ `Frame( _("Blacklist"),
+ `VBox(
+ `Table(
+ `id(`blacklist_table_id), `opt(`notify),
+ `header( _("Item"), _("Value")),
+ Build_BlacklistException_Table()
+ ),
+ `Left(`HBox(
+ `PushButton(`id(`blacklist_add_id), Label::AddButton()),
+ `PushButton(`id(`blacklist_edit_id), Label::EditButton()),
+ `PushButton(`id(`blacklist_del_id), Label::DeleteButton())
+ ))
+ )));
+
+
+list <map> defaults_items = [];
/*
build defaults table from defaults_items
*/
@@ -187,8 +231,9 @@
`Top(multipaths_config),
`VBox(
`HVCenter(`PushButton(`id(`defaults_config_id), _("Configure Defaults"))),
+ `HVCenter(`PushButton(`id(`device_config_id), _("Configure Devices"))),
`HVCenter(`PushButton(`id(`blacklist_config_id), _("Configure Blacklist"))),
- `HVCenter(`PushButton(`id(`device_config_id), _("Configure Devices")))
+ `HVCenter(`PushButton(`id(`blacklist_exception_config_id), _("Configure Blacklist Exception")))
));
term tab_status_summary = `RichText(`id(`status_summary_id), `opt(`plainText), "Status summary");
@@ -242,27 +287,17 @@
Read multipaths section from configuration file, store in multipaths_items
*/
boolean Read_MultipathConfig() {
+ integer id = 0;
+ list <map> builtin_multipaths_items = [];
map multipaths_all = (map)SCR::Read(.etc.multipath.all.multipaths);
- if (multipaths_all == nil || multipaths_all == $[])
- {
- y2milestone("empty multipaths section in /etc/multipath.conf");
- return true;
- }
- if (multipaths_all["kind"]:"NA" != "section" ||
- multipaths_all["name"]:"NA" != "multipaths")
- {
- y2error("read multipths section in /etc/multipath.conf error");
- return false;
- }
-
- if(multipaths_all["value"]:nil == nil || multipaths_all["value"]:[] == [])
+ if (multipaths_all != nil && multipaths_all != $[])
{
- y2milestone("no multipath subsection in multipaths section in /etc/multipath.conf");
- return true;
- }
-
- integer id = 0;
- multipaths_items = maplist(map sub_section, multipaths_all["value"]:[], {
+ if (multipaths_all["kind"]:"NA" == "section" &&
+ multipaths_all["name"]:"NA" == "multipaths")
+ {
+ if(multipaths_all["value"]:nil != nil && multipaths_all["value"]:[] != [])
+ {
+ multipaths_items = maplist(map sub_section, multipaths_all["value"]:[], {
map item = $[];
if(sub_section["kind"]:"NA" != "section" ||
sub_section["name"]:"NA" != "multipath" ) {
@@ -290,6 +325,69 @@
id = id + 1;
return item;
});
+ }}}
+
+ /* load built-in configuration, which are not in /etc/multipath.conf */
+ SCR::RegisterAgent(.content, `ag_ini(`IniAgent(builtin_multipath_conf_path,
+ $[
+ "options" : [ "global_values", "repeat_names" ],
+ "comments" : [ "^[ \t]*#.*$", "^[ \t]*$" ],
+ "params" : [ $[ "match" : [ "^[ \t]*([^ \t]+)[ \t]+([^ \t]+([ \t]*[^ \t]+)*)[ \t]*$", "%s %s" ]], ],
+ "sections" : [
+ $[
+ "begin" : [ "[ \t]*([^ \t]+)*[ \t]*\\{[ \t]*$", "%s {" ],
+ "end" : [ "^[ \t]*\\}[ \t]*$", "}" ],
+ ],
+ ],
+ "subindent" : "\t"
+ ] )));
+ multipaths_all = (map)SCR::Read(.content.all.multipaths);
+ SCR::UnregisterAgent(.content);
+
+ if (multipaths_all != nil && multipaths_all != $[])
+ {
+ if (multipaths_all["kind"]:"NA" == "section" &&
+ multipaths_all["name"]:"NA" == "multipaths")
+ {
+ if(multipaths_all["value"]:nil != nil && multipaths_all["value"]:[] != [])
+ {
+ foreach(map sub_section, multipaths_all["value"]:[], {
+ map item = $[];
+ if(sub_section["kind"]:"NA" != "section" ||
+ sub_section["name"]:"NA" != "multipath" ) {
+ return;
+ }
+
+ list<map> value = sub_section["value"]:[];
+ if(value == [])
+ return ;
+
+ item = listmap(map e, value, {
+ if(e["kind"]:"NA" != "value")
+ return nil;
+ if(e["name"]:"NA" == "NA" || e["value"]:"NA" == "NA")
+ return nil;
+ string name = e["name"]:"NA";
+ string value = e["value"]:"";
+ return $[name:value];
+ });
+ if(item["wwid"]:"NA" == "NA" &&
+ item["alias"]:"NA" == "NA") {
+ return;
+ }
+ list<map> filter_ret = filter(map filter_e, multipaths_items, {
+ if (item["wwid"]:"" == filter_e["wwid"]:"NA")
+ return true;
+ else
+ return false;
+ });
+ if (filter_ret != nil && filter_ret != [])
+ return;
+ item["id"] = tostring(id);
+ id = id + 1;
+ multipaths_items = add(multipaths_items, item);
+ });
+ }}}
return true;
}
@@ -298,38 +396,34 @@
read defaults section from configuration file, store in defaults_items
*/
boolean Read_DefaultsConfig() {
+ list <map> temp_defaults_items = [];
+ list<map> value = [];
+ map defaults_mark =
+ $[ "udev_dir":false,
+ "polling_interval":false,
+ "selector":false,
+ "path_grouping_policy":false,
+ "getuid_callout":false,
+ "prio_callout":false,
+ "path_checker":false,
+ "rr_min_io":false,
+ "rr_weight":false,
+ "failback":false,
+ "no_path_retry":false,
+ "user_friendly_names":false
+ ];
map defaults_all = (map)SCR::Read(.etc.multipath.all.defaults);
- if(defaults_all == nil || defaults_all == $[]) {
- y2milestone("empty defaults section in /etc/multipath.conf");
- }
-
- if(defaults_all != nil &&
- ( defaults_all["kind"]:"NA" != "section" ||
- defaults_all["name"]:"NA" != "defaults") ) {
- y2error("read defaults section in /etc/multipath.conf error");
- return false;
- }
-
- list<map> value = defaults_all["value"]:[];
- if(value == nil || value == []) {
- y2milestone("no entry in defaults section of /etc/multipath.conf");
- }
-
- map defaults_mark = $[ "udev_dir":false,
- "polling_interval":false,
- "selector":false,
- "path_grouping_policy":false,
- "getuid_callout":false,
- "prio_callout":false,
- "path_checker":false,
- "rr_min_io":false,
- "rr_weight":false,
- "failback":false,
- "no_path_retry":false,
- "user_friendly_names":false
- ];
- defaults_items = maplist(map item, value, {
+ if(defaults_all != nil && defaults_all != $[])
+ {
+ if(defaults_all != nil &&
+ ( defaults_all["kind"]:"NA" == "section" &&
+ defaults_all["name"]:"NA" == "defaults") )
+ {
+ value = defaults_all["value"]:[];
+ if(value != nil && value != [])
+ {
+ defaults_items = maplist(map item, value, {
string name = item["name"]:"NA";
if(name == "NA")
return $["id":"NA", "name":"NA", "value":"NA"];
@@ -338,6 +432,49 @@
defaults_mark[name] = true;
return $["id":id, "name":name, "value":value];
});
+ }}}
+
+ /* union builtin configurations and /etc/multipath.conf into one */
+ SCR::RegisterAgent(.content, `ag_ini(`IniAgent(builtin_multipath_conf_path,
+ $[
+ "options" : [ "global_values", "repeat_names" ],
+ "comments" : [ "^[ \t]*#.*$", "^[ \t]*$" ],
+ "params" : [ $[ "match" : [ "^[ \t]*([^ \t]+)[ \t]+([^ \t]+([ \t]*[^ \t]+)*)[ \t]*$", "%s %s" ]], ],
+ "sections" : [
+ $[
+ "begin" : [ "[ \t]*([^ \t]+)*[ \t]*\\{[ \t]*$", "%s {" ],
+ "end" : [ "^[ \t]*\\}[ \t]*$", "}" ],
+ ],
+ ],
+ "subindent" : "\t"
+ ] )));
+ defaults_all = (map) SCR::Read(.content.all.defaults);
+ SCR::UnregisterAgent(.content);
+
+ if(defaults_all != nil && defaults_all != $[])
+ {
+ if(defaults_all != nil &&
+ ( defaults_all["kind"]:"NA" == "section" &&
+ defaults_all["name"]:"NA" == "defaults") )
+ {
+ value = defaults_all["value"]:[];
+ if(value != nil && value != [])
+ {
+ foreach(map item, value, {
+ string name = item["name"]:"NA";
+ if(name == "NA")
+ return $["id":"NA", "name":"NA", "value":"NA"];
+ string value = item["value"]:"";
+ string id = name + "_id";
+ if (defaults_mark[name]:false == false)
+ {
+ defaults_mark[name] = true;
+ temp_defaults_items = add(temp_defaults_items, $["id":id, "name":name, "value":value]);
+ }
+ });
+ defaults_items = (list<map>) merge(defaults_items, temp_defaults_items);
+ }}}
+
foreach(string k, boolean v, defaults_mark, {
if(v == false) {
string name = k;
@@ -345,7 +482,6 @@
defaults_items = add(defaults_items, $["id":id, "name":name, "value":""]);
defaults_mark[k] = true;
}
-
});
return true;
@@ -355,58 +491,245 @@
read blacklist section from configuration file, store in blacklist_items
*/
boolean Read_BlacklistConfig() {
+ list<map> value = [];
map blacklist_all = (map)SCR::Read(.etc.multipath.all.blacklist);
- if (blacklist_all == nil || blacklist_all == $[]) {
- y2milestone("empty blacklist section in /etc/multipath.conf");
- return true;
- }
- if(blacklist_all["kind"]:"NA" != "section" ||
- blacklist_all["name"]:"NA" != "blacklist") {
- y2error("read blacklist section in /etc/multipath.conf error");
- return false;
- }
- list<map> value = blacklist_all["value"]:[];
- if(value == []) {
- y2milestone("no blacklist entry in devnode_blacklist section of /etc/multipath.conf");
- return true;
- }
+
+ if (blacklist_all != nil && blacklist_all != $[])
+ {
+ if(blacklist_all["kind"]:"NA" == "section" &&
+ blacklist_all["name"]:"NA" == "blacklist")
+ {
+ value = blacklist_all["value"]:[];
+ if(value != [])
+ {
+ foreach(map e, value, {
+ map item = $[];
+ if(e["kind"]:"NA" == "value") {
+ item["name"] = e["name"]:"NA";
+ item["value"] = e["value"]:"NA";
+ item["type"] = "node";
+ } else if(e["kind"]:"NA" == "section") {
+ list<map> subsection = e["value"]:[];
+ if(subsection == []) {
+ return;
+ } else {
+ map sub_item = $[];
+ foreach(map sub_e, subsection, {
+ if(sub_e["kind"]:"NA" == "value"){
+ string name = sub_e["name"]:"";
+ string value = sub_e["value"]:"";
+ if(size(name) > 0 && size(value) > 0) {
+ sub_item[name] = value;
+ }
+ }
+ });
+ string product_str = sub_item["product"]:"";
+ string vendor_str = sub_item["vendor"]:"";
+ if(size(product_str) == 0 || size(vendor_str) == 0)
+ return;
+ item["name"] = e["name"]:"NA";
+ item["type"] = "device";
+ item["value"] = sub_item;
+ }
+ } else {
+ return;
+ }
+ blacklist_items = add(blacklist_items, item);
+ });
+ }}}
+
+ /* union built-in configuration and /etc/multipath.conf into one */
+ SCR::RegisterAgent(.content, `ag_ini(`IniAgent(builtin_multipath_conf_path,
+ $[
+ "options" : [ "global_values", "repeat_names" ],
+ "comments" : [ "^[ \t]*#.*$", "^[ \t]*$" ],
+ "params" : [ $[ "match" : [ "^[ \t]*([^ \t]+)[ \t]+([^ \t]+([ \t]*[^ \t]+)*)[ \t]*$", "%s %s" ]], ],
+ "sections" : [
+ $[
+ "begin" : [ "[ \t]*([^ \t]+)*[ \t]*\\{[ \t]*$", "%s {" ],
+ "end" : [ "^[ \t]*\\}[ \t]*$", "}" ],
+ ],
+ ],
+ "subindent" : "\t"
+ ] )));
+ blacklist_all = (map) SCR::Read(.content.all.blacklist);
+ SCR::UnregisterAgent(.content);
+
+ if (blacklist_all != nil && blacklist_all != $[])
+ {
+ if(blacklist_all["kind"]:"NA" == "section" &&
+ blacklist_all["name"]:"NA" == "blacklist")
+ {
+ value = blacklist_all["value"]:[];
+ if(value != [])
+ {
+ foreach(map e, value, {
+ map item = $[];
+ if(e["kind"]:"NA" == "value") {
+ item["name"] = e["name"]:"NA";
+ item["value"] = e["value"]:"NA";
+ item["type"] = "node";
+ } else if(e["kind"]:"NA" == "section") {
+ list<map> subsection = e["value"]:[];
+ if(subsection == []) {
+ return;
+ } else {
+ map sub_item = $[];
+ foreach(map sub_e, subsection, {
+ if(sub_e["kind"]:"NA" == "value"){
+ string name = sub_e["name"]:"";
+ string value = sub_e["value"]:"";
+ if(size(name) > 0 && size(value) > 0) {
+ sub_item[name] = value;
+ }
+ }
+ });
+ string product_str = sub_item["product"]:"";
+ string vendor_str = sub_item["vendor"]:"";
+ if(size(product_str) == 0 || size(vendor_str) == 0)
+ return;
+ item["name"] = e["name"]:"NA";
+ item["type"] = "device";
+ item["value"] = sub_item;
+ }
+ } else {
+ return;
+ }
+ if(contains(blacklist_items, item) == true)
+ return;
+ blacklist_items = add(blacklist_items, item);
+ });
+ }}}
integer id = 0;
- foreach(map e, value, {
- map item = $[];
- if(e["kind"]:"NA" == "value") {
- item["name"] = e["name"]:"NA";
- item["value"] = e["value"]:"NA";
- item["type"] = "node";
- } else if(e["kind"]:"NA" == "section") {
- list<map> subsection = e["value"]:[];
- if(subsection == []) {
- return;
- } else {
- map sub_item = $[];
- foreach(map sub_e, subsection, {
- if(sub_e["kind"]:"NA" == "value"){
- string name = sub_e["name"]:"";
- string value = sub_e["value"]:"";
- if(size(name) > 0 && size(value) > 0) {
- sub_item[name] = value;
+ foreach(map e, blacklist_items, {
+ e["id"] = tostring(id);
+ id = id + 1;
+ });
+
+ return true;
+}
+
+
+/*
+ read blacklist_exception section from configuration file,
+ store in blacklist_exception_items
+*/
+boolean Read_BlacklistException_Config() {
+ list<map> value = [];
+ map blacklist_all = (map)SCR::Read(.etc.multipath.all.blacklist_exceptions);
+
+ if (blacklist_all != nil && blacklist_all != $[])
+ {
+ if(blacklist_all["kind"]:"NA" == "section" &&
+ blacklist_all["name"]:"NA" == "blacklist_exceptions")
+ {
+ value = blacklist_all["value"]:[];
+ if(value != [])
+ {
+ foreach(map e, value, {
+ map item = $[];
+ if(e["kind"]:"NA" == "value") {
+ item["name"] = e["name"]:"NA";
+ item["value"] = e["value"]:"NA";
+ item["type"] = "node";
+ } else if(e["kind"]:"NA" == "section") {
+ list<map> subsection = e["value"]:[];
+ if(subsection == []) {
+ return;
+ } else {
+ map sub_item = $[];
+ foreach(map sub_e, subsection, {
+ if(sub_e["kind"]:"NA" == "value"){
+ string name = sub_e["name"]:"";
+ string value = sub_e["value"]:"";
+ if(size(name) > 0 && size(value) > 0) {
+ sub_item[name] = value;
+ }
+ }
+ });
+ string product_str = sub_item["product"]:"";
+ string vendor_str = sub_item["vendor"]:"";
+ if(size(product_str) == 0 || size(vendor_str) == 0)
+ return;
+ item["name"] = e["name"]:"NA";
+ item["type"] = "device";
+ item["value"] = sub_item;
+ }
+ } else {
+ return;
}
- }
+ blacklist_exception_items = add(blacklist_exception_items, item);
+ });
+ }}}
+
+ /* union built-in configuration and /etc/multipath.conf into one */
+ SCR::RegisterAgent(.content, `ag_ini(`IniAgent(builtin_multipath_conf_path,
+ $[
+ "options" : [ "global_values", "repeat_names" ],
+ "comments" : [ "^[ \t]*#.*$", "^[ \t]*$" ],
+ "params" : [ $[ "match" : [ "^[ \t]*([^ \t]+)[ \t]+([^ \t]+([ \t]*[^ \t]+)*)[ \t]*$", "%s %s" ]], ],
+ "sections" : [
+ $[
+ "begin" : [ "[ \t]*([^ \t]+)*[ \t]*\\{[ \t]*$", "%s {" ],
+ "end" : [ "^[ \t]*\\}[ \t]*$", "}" ],
+ ],
+ ],
+ "subindent" : "\t"
+ ] )));
+ blacklist_all = (map) SCR::Read(.content.all.blacklist_exceptions);
+ SCR::UnregisterAgent(.content);
+
+ if (blacklist_all != nil && blacklist_all != $[])
+ {
+ if(blacklist_all["kind"]:"NA" == "section" &&
+ blacklist_all["name"]:"NA" == "blacklist")
+ {
+ value = blacklist_all["value"]:[];
+ if(value != [])
+ {
+ foreach(map e, value, {
+ map item = $[];
+ if(e["kind"]:"NA" == "value") {
+ item["name"] = e["name"]:"NA";
+ item["value"] = e["value"]:"NA";
+ item["type"] = "node";
+ } else if(e["kind"]:"NA" == "section") {
+ list<map> subsection = e["value"]:[];
+ if(subsection == []) {
+ return;
+ } else {
+ map sub_item = $[];
+ foreach(map sub_e, subsection, {
+ if(sub_e["kind"]:"NA" == "value"){
+ string name = sub_e["name"]:"";
+ string value = sub_e["value"]:"";
+ if(size(name) > 0 && size(value) > 0) {
+ sub_item[name] = value;
+ }
+ }
+ });
+ string product_str = sub_item["product"]:"";
+ string vendor_str = sub_item["vendor"]:"";
+ if(size(product_str) == 0 || size(vendor_str) == 0)
+ return;
+ item["name"] = e["name"]:"NA";
+ item["type"] = "device";
+ item["value"] = sub_item;
+ }
+ } else {
+ return;
+ }
+ if(contains(blacklist_exception_items, item) == true)
+ return;
+ blacklist_exception_items = add(blacklist_exception_items, item);
});
- string product_str = sub_item["product"]:"";
- string vendor_str = sub_item["vendor"]:"";
- if(size(product_str) == 0 || size(vendor_str) == 0)
- return;
- item["name"] = e["name"]:"NA";
- item["type"] = "device";
- item["value"] = sub_item;
- }
- } else {
- return;
- }
- item["id"] = tostring(id);
+ }}}
+
+ integer id = 0;
+ foreach(map e, blacklist_exception_items, {
+ e["id"] = tostring(id);
id = id + 1;
- blacklist_items = add(blacklist_items, item);
});
return true;
@@ -417,56 +740,117 @@
read device section from configuration file, store in devices_items
*/
boolean Read_DeviceConfig() {
+ integer id = 0;
map devices_all = (map)SCR::Read(.etc.multipath.all.devices);
- if (devices_all == nil || devices_all == $[]) {
- y2milestone("empty devices section in /etc/multipath.conf");
- return true;
- }
- if (devices_all["kind"]:"NA" != "section" ||
- devices_all["name"]:"NA" != "devices")
- {
- y2error("read devices section in /etc/multipath.conf error");
- return false;
- }
- if(devices_all["value"]:nil == nil || devices_all["value"]:[] == [])
+ if (devices_all != nil && devices_all != $[])
{
- y2milestone("no device subsection in devices section of /etc/multipath.conf");
- return true;
- }
+ if (devices_all["kind"]:"NA" == "section" &&
+ devices_all["name"]:"NA" == "devices")
+ {
+ if(devices_all["value"]:nil != nil && devices_all["value"]:[] != [])
+ {
+ foreach(map sub_section, devices_all["value"]:[], {
+ map item = $[];
+ if(sub_section["kind"]:"NA" != "section" ||
+ sub_section["name"]:"NA" != "device") {
+ return;
+ }
+
+ list<map> value = sub_section["value"]:[];
+ if(value == [])
+ return;
+
+ item = listmap(map e, value, {
+ if(e["kind"]:"NA" != "value")
+ return nil;
+ if(e["name"]:"NA" == "NA" || e["value"]:"NA" == "NA")
+ return nil;
+ string name = e["name"]:"NA";
+ string value = e["value"]:"NA";
+ return $[name:value];
+ });
+ /* for configuration without "vendor" or "product", do not
+ read it into Yast module.
+ */
+ if(item["vendor"]:"NA" == "NA" ||
+ item["product"]:"NA" == "NA"){
+ return;
+ }
+ item["id"] = tostring(id);
+ id = id + 1;
+ devices_items = add(devices_items, item);
+ });
+ }}}
- integer id = 0;
- foreach(map sub_section, devices_all["value"]:[], {
- map item = $[];
- if(sub_section["kind"]:"NA" != "section" ||
- sub_section["name"]:"NA" != "device") {
- return;
- }
- list<map> value = sub_section["value"]:[];
- if(value == [])
- return;
+ /* union built-in configuration and /etc/multipath.conf into one */
+ SCR::RegisterAgent(.content, `ag_ini(`IniAgent(builtin_multipath_conf_path,
+ $[
+ "options" : [ "global_values", "repeat_names" ],
+ "comments" : [ "^[ \t]*#.*$", "^[ \t]*$" ],
+ "params" : [ $[ "match" : [ "^[ \t]*([^ \t]+)[ \t]+([^ \t]+([ \t]*[^ \t]+)*)[ \t]*$", "%s %s" ]], ],
+ "sections" : [
+ $[
+ "begin" : [ "[ \t]*([^ \t]+)*[ \t]*\\{[ \t]*$", "%s {" ],
+ "end" : [ "^[ \t]*\\}[ \t]*$", "}" ],
+ ],
+ ],
+ "subindent" : "\t"
+ ] )));
+ devices_all = (map) SCR::Read(.content.all.devices);
+ SCR::UnregisterAgent(.content);
- item = listmap(map e, value, {
- if(e["kind"]:"NA" != "value")
- return nil;
- if(e["name"]:"NA" == "NA" || e["value"]:"NA" == "NA")
- return nil;
- string name = e["name"]:"NA";
- string value = e["value"]:"NA";
- return $[name:value];
+ if (devices_all != nil && devices_all != $[])
+ {
+ if (devices_all["kind"]:"NA" == "section" &&
+ devices_all["name"]:"NA" == "devices")
+ {
+ if(devices_all["value"]:nil != nil && devices_all["value"]:[] != [])
+ {
+ foreach(map sub_section, devices_all["value"]:[], {
+ map item = $[];
+ if(sub_section["kind"]:"NA" != "section" ||
+ sub_section["name"]:"NA" != "device") {
+ return;
+ }
+
+ list<map> value = sub_section["value"]:[];
+ if(value == [])
+ return;
+
+ item = listmap(map e, value, {
+ if(e["kind"]:"NA" != "value")
+ return nil;
+ if(e["name"]:"NA" == "NA" || e["value"]:"NA" == "NA")
+ return nil;
+ string name = e["name"]:"NA";
+ string value = e["value"]:"NA";
+ return $[name:value];
+ });
+ /* for configuration without "vendor" or "product", do not
+ read it into Yast module.
+ */
+ if(item["vendor"]:"NA" == "NA" ||
+ item["product"]:"NA" == "NA"){
+ return;
+ }
+ list<map> filter_ret = filter(map filter_e, devices_items, {
+ if (filter_e["vendor"]:"" == item["vendor"]:"NA" &&
+ filter_e["product"]:"" == item["product"]:"NA")
+ return true;
+ else
+ return false;
+ });
+ if( filter_ret != nil &&
+ filter_ret != [])
+ return;
+ item["id"] = tostring(id);
+ id = id + 1;
+ devices_items = add(devices_items, item);
});
- /* for configuration without "vendor" or "product", do not
- read it into Yast module.
- */
- if(item["vendor"]:"NA" == "NA" ||
- item["product"]:"NA" == "NA"){
- return;
- }
- item["id"] = tostring(id);
- id = id + 1;
- devices_items = add(devices_items, item);
- });
+
+ }}}
return true;
}
@@ -1525,8 +1909,10 @@
map entry = $["comment":"", "kind":"value", "type":0];
entry["name"] = add_quotes(e["name"]:"NA");
entry["value"] = add_quotes(e["value"]: "");
- defaults_value = add(defaults_value, entry);
+ if (entry["value"]:"" != "")
+ defaults_value = add(defaults_value, entry);
});
+
map defaults_root = $[ "comment":"#\n# This configuration file is generated by Yast, do not modify it\n# manually please. \n#\n",
"file":-1,
"kind":"section",
@@ -1535,10 +1921,10 @@
"value":defaults_value
];
- /* devnode_blacklist section
+ /* blacklist section
if value is empty, do not write name into configuration file.
*/
- list devnode_blacklist_value = [];
+ list blacklist_value = [];
maplist(map e, blacklist_items, {
map entry = $[];
if(e["type"]:"NA" == "device") {
@@ -1576,14 +1962,66 @@
entry["type"] = 0;
entry["value"] = add_quotes(e[1]:"NA");
}
- devnode_blacklist_value = add(devnode_blacklist_value, entry);
+ blacklist_value = add(blacklist_value, entry);
+ });
+ map blacklist_root = $[ "comment":"",
+ "file":-1,
+ "kind":"section",
+ "name":"blacklist",
+ "type":0,
+ "value":blacklist_value
+ ];
+
+
+ /* blacklist_exception section
+ if value is empty, do not write name into configuration file.
+ */
+ list blacklist_exception_value = [];
+ maplist(map e, blacklist_exception_items, {
+ map entry = $[];
+ if(e["type"]:"NA" == "device") {
+ map sub_e = e["value"]:$[];
+ if(sub_e == $[])
+ return;
+ if(size((string) sub_e["vendor"]:"") == 0 ||
+ size((string) sub_e["product"]:"") == 0)
+ return;
+ entry["comment"] = "";
+ entry["file"] = -1;
+ entry["kind"] = "section";
+ entry["name"] = "device";
+ entry["type"] = 0;
+ entry["value"] = [$["comment":"",
+ "kind":"value",
+ "name":"vendor",
+ "type":0,
+ "value":add_quotes(sub_e["vendor"]:"")],
+ $["comment":"",
+ "kind":"value",
+ "name":"product",
+ "type":0,
+ "value":add_quotes(sub_e["product"]:"")]];
+ } else if(size((string) e["name"]:"") > 0 && size((string) e["value"]:"") > 0){
+ entry["comment"] = "";
+ entry["kind"] = "value";
+ entry["name"] = add_quotes(e["name"]:"NA");
+ entry["type"] = 0;
+ entry["value"] = add_quotes(e["value"]:"");
+ } else {
+ entry["comment"] = "";
+ entry["kind"] = "value";
+ entry["name"] = add_quotes(e[0]:"NA");
+ entry["type"] = 0;
+ entry["value"] = add_quotes(e[1]:"NA");
+ }
+ blacklist_exception_value = add(blacklist_exception_value, entry);
});
- map devnode_blacklist_root = $[ "comment":"",
+ map blacklist_exception_root = $[ "comment":"",
"file":-1,
"kind":"section",
- "name":"blacklist",
+ "name":"blacklist_exceptions",
"type":0,
- "value":devnode_blacklist_value
+ "value":blacklist_exception_value
];
/* multipaths section
@@ -1593,7 +2031,7 @@
maplist(map e, multipaths_items, {
list <map>value = [];
foreach(string k, string v, (map)e, {
- if(v != nil && size(v) > 0) {
+ if(k != "id" && v != nil && size(v) > 0) {
value = add(value, $["comment":"",
"kind":"value",
"name":add_quotes(k),
@@ -1626,7 +2064,7 @@
maplist(map e, devices_items, {
list value = [];
foreach(string k, string v, (map)e, {
- if(v != nil && size(v) > 0) {
+ if(k != "id" && v != nil && size(v) > 0) {
value = add(value, $["comment":"",
"kind":"value",
"name":add_quotes(k),
@@ -1652,7 +2090,8 @@
];
list <map> all_value = [ defaults_root,
- devnode_blacklist_root,
+ blacklist_root,
+ blacklist_exception_root,
multipaths_root,
devices_root
];
@@ -1993,6 +2432,331 @@
return ret;
}
+
+void Delete_Blacklist_Exception_Dialog(term table_item) {
+ blacklist_exception_items = filter(map e, blacklist_exception_items, {
+ boolean match = true;
+ string value = nil;
+ if(table_item[1]:"NA" == "device" && e["type"]:"NA" == "device") {
+ map sub_e = e["value"]:$[];
+ if(sub_e != $[]){
+ value = sformat(device_template, sub_e["vendor"]:"NA", sub_e["product"]:"NA");
+ match = (e["name"]:"NA" == table_item[1]:"na" &&
+ value == table_item[2]:"na");
+ }
+ } else if(e["type"]:"NA" == "node"){
+ match = (e["name"]:"NA" == table_item[1]:"na" && e["value"]:"NA" == table_item[2]:"na");
+ } else {
+ match = false;
+ }
+ if(match == true)
+ config_modified = true;
+ return (!match);
+ });
+}
+
+boolean check_ble_config(map item) {
+ string type = nil;
+ string name = nil;
+ string value = nil;
+ string vendor = nil;
+ string product = nil;
+ boolean result = false;
+
+ type = (string) item["type"]:"";
+ if(size(type) == 0) {
+ Popup::Message(sformat("invalid type `%1'", type));
+ return false;
+ }
+ name = (string) item["name"]:"";
+
+ if(type == "device") {
+ map sub_item = (map) item["value"]:$[];
+ if(sub_item != $[]) {
+ vendor = (string) sub_item["vendor"]:"";
+ product = (string) sub_item["product"]:"";
+ if(size(vendor) > 0 &&
+ size(product) > 0 &&
+ (!regexpmatch(vendor, "^[ \t]+$") &&
+ (!regexpmatch(product, "^[ \t]+$"))))
+ result = true;
+ }
+ } else {
+ value = (string) item["value"]:"";
+ if(size(value) > 0 &&
+ (!regexpmatch(value, "^[ \t]+$")))
+ result = true;
+ }
+
+ if(result == false) {
+ string err_str = _("Illegal parameters:\n");
+ if(type == "device") {
+ if(size(vendor) == 0 || regexpmatch(vendor, "^[ \t]+$"))
+ err_str = err_str + "* \"vendor\"" + _(" should not be empty.\n");
+ if(size(product) == 0 || regexpmatch(product, "^[ \t]+$"))
+ err_str = err_str + sformat("* \"product\"") + _(" should not be empty.\n");
+ } else {
+ if(size(value) == 0 || regexpmatch(value, "^[ \t]+$")) {
+ err_str = err_str + sformat("* \"%1\"", item["name"]:"NA") + _(" should not be empty.\n");
+ }
+ }
+ Popup::Message(err_str);
+ } else {
+ foreach(map e, blacklist_exception_items, {
+ if(e["id"]:"NA" == item["id"]:"NA")
+ return;
+ if(e["type"]:"NA" == "device") {
+ map sub_e = e["value"]:$[];
+ if(sub_e != $[]) {
+ if(vendor == sub_e["vendor"]:"NA" && product == sub_e["product"]:"NA") {
+ result = false;
+ break;
+ }
+ }
+ } else {
+ if(name == e["name"]:"NA" && value == e["value"]:"NA") {
+ result = false;
+ break;
+ }
+ }
+ });
+ if(result == false) {
+ Popup::Message(_("Duplicated configuration."));
+ }
+ }
+
+ return result;
+}
+
+
+void Edit_Blacklist_Exception_Dialog(term table_item) {
+ list<map> config_item = filter(map item, blacklist_exception_items, {
+ boolean match = true;
+ if(table_item[1]:"NA" == "device" && item["type"]:"NA" == "device" ) {
+ map sub_item = item["value"]:$[];
+ string value = sformat(device_template, sub_item["vendor"]:"NA", sub_item["product"]:"NA");
+ match = (value == table_item[2]:"NA");
+ } else if(table_item[1]:"NA" != "device" && item["type"]:"NA" == "node"){
+ match = (item["name"]:"NA" == table_item[1]:"na" && item["value"]:"NA" == table_item[2]:"na");
+ } else {
+ match = false;
+ }
+ return match;
+ });
+ map cur_item = config_item[0]:$[];
+ if(cur_item == $[]) return ;
+
+ if(cur_item["type"]:"NA" == "device") {
+ map sub_item = cur_item["value"]:$[];
+ if(sub_item == $[]) {
+ Popup::Message(sformat("No value in subitem `%1'", cur_item));
+ return;
+ }
+ UI::OpenDialog( `VBox(
+ `HBox(`TextEntry(`id(`edit_blacklist_item_id), _("item"), cur_item["name"]:"NA")),
+ `HBox(`TextEntry(`id(`edit_blacklist_vendor_id), _("vendor"), sub_item["vendor"]:"NA")),
+ `HBox(`TextEntry(`id(`edit_blacklist_product_id), _("product"), sub_item["product"]:"NA")),
+ `HSpacing(1),
+ `HBox(
+ `PushButton(`id(`ok), Label::OKButton()),
+ `PushButton(`id(`cancel), `opt(`default), Label::CancelButton())
+ )));
+
+ }
+ else {
+ UI::OpenDialog(`VBox(
+ `HBox(`TextEntry(`id(`edit_blacklist_item_id), _("item"), cur_item["name"]:"NA")),
+ `HBox(`TextEntry(`id(`edit_blacklist_value_id), _("value"), cur_item["value"]:"NA")),
+ `HSpacing(1),
+ `HBox(
+ `PushButton(`id(`ok), Label::OKButton()),
+ `PushButton(`id(`cancel), `opt(`default), Label::CancelButton())
+ )));
+ }
+ UI::ChangeWidget(`id(`edit_blacklist_item_id), `Enabled, false);
+
+ any ret = nil;
+ map new_item = $[];
+ while(true) {
+ ret = UI::UserInput();
+ if(ret == `ok) {
+ if(cur_item["type"]:"NA" == "device") {
+ new_item["name"] = UI::QueryWidget(`id(`edit_blacklist_item_id), `Value);
+ new_item["type"] = "device";
+ string vendor_str = (string) UI::QueryWidget(`id(`edit_blacklist_vendor_id), `Value);
+ string product_str = (string) UI::QueryWidget(`id(`edit_blacklist_product_id), `Value);
+ map sub_item = $["vendor":vendor_str, "product":product_str];
+ new_item["value"] = sub_item;
+ }
+ else {
+ new_item["type"] = "node";
+ new_item["name"] = UI::QueryWidget(`id(`edit_blacklist_item_id), `Value);
+ new_item["value"] = UI::QueryWidget(`id(`edit_blacklist_value_id), `Value);
+ }
+ if(check_ble_config(new_item) == true) {
+ config_modified = true;
+ break;
+ }
+ }
+ else {
+ UI::CloseDialog();
+ return;
+ }
+ }
+ blacklist_exception_items = maplist(map item, blacklist_exception_items, {
+ boolean match = true;
+ if(table_item[1]:"NA" == "device" && item["type"]:"NA" == "device") {
+ map sub_item = item["value"]:$[];
+ string value = sformat(device_template, sub_item["vendor"]:"NA", sub_item["product"]:"NA");
+ match = (item["name"]:"NA" == table_item[1]:"na" &&
+ value == table_item[2]:"na");
+ } else if(table_item[1]:"NA" != "device" && item["type"]:"NA" == "node"){
+ match = (item["name"]:"NA" == table_item[1]:"na" &&
+ item["value"]:"NA" == table_item[2]:"na");
+ } else {
+ match = false;
+ }
+ if (match)
+ return new_item;
+ else
+ return item;
+ });
+
+ UI::CloseDialog();
+ return ;
+}
+
+void Add_Blacklist_Exception_Dialog() {
+ UI::OpenDialog(
+ `VBox(
+ `HBox(`HWeight(1,`ComboBox(`id(`add_blacklist_id), `opt(`notify), _("item"), [
+ `item(`id(`combobox_bl_wwid_id), "wwid", true),
+ `item(`id(`combobox_bl_devnode_id), "devnode"),
+ `item(`id(`combobox_bl_device_id), "device")
+ ]))),
+ `ReplacePoint(`id(`replace_bl_id),
+ `HBox(`TextEntry(`id(`edit_blacklist_wwid_id), `opt(`notify), _("wwid") ))
+ ),
+ `HSpacing(1),
+ `HBox(
+ `PushButton(`id(`ok), Label::OKButton()),
+ `PushButton(`id(`cancel), `opt(`default), Label::CancelButton())
+ )));
+ UI::SetFocus(`id(`add_blacklist_id));
+
+ map new_item = $[];
+ string devnode_str = "";
+ string vendor_str = "";
+ string product_str = "";
+ string wwid_str = "";
+
+ any ret = nil;
+ while(true) {
+ ret = UI::UserInput();
+ if(ret == `add_blacklist_id) {
+ any value = UI::QueryWidget(`id(`add_blacklist_id), `Value);
+ if(value != nil && is(value, symbol)) {
+ if(value == `combobox_bl_device_id) {
+ UI::ReplaceWidget(`id(`replace_bl_id),
+ `VBox(`TextEntry(`id(`edit_blacklist_vendor_id), `opt(`notify), "vendor", vendor_str),
+ `TextEntry(`id(`edit_blacklist_product_id), `opt(`notify), "product", product_str)
+ ));
+ } else if(value == `combobox_bl_wwid_id){
+ UI::ReplaceWidget(`id(`replace_bl_id),
+ `VBox(`TextEntry(`id(`edit_blacklist_wwid_id), `opt(`notify), "wwid", wwid_str)));
+ } else if(value == `combobox_bl_devnode_id) {
+ UI::ReplaceWidget(`id(`replace_bl_id),
+ `VBox(`TextEntry(`id(`edit_blacklist_devnode_id), `opt(`notify), "devnode", devnode_str)));
+ }
+ }
+ } else if(ret == `ok) {
+ any value = UI::QueryWidget(`id(`add_blacklist_id), `Value);
+ if(value != nil && is(value, symbol)) {
+ if(value == `combobox_bl_device_id) {
+ string vendor = nil;
+ string product = nil;
+ new_item["type"] = "device";
+ new_item["name"] = "device";
+ vendor = (string) UI::QueryWidget(`id(`edit_blacklist_vendor_id), `Value);
+ product = (string) UI::QueryWidget(`id(`edit_blacklist_product_id), `Value);
+ map sub_item = $["vendor":vendor, "product":product];
+ new_item["value"] = sub_item;
+ } else if (value == `combobox_bl_wwid_id){
+ new_item["type"] = "node";
+ new_item["name"] = "wwid";
+ new_item["value"] = (string) UI::QueryWidget(`id(`edit_blacklist_wwid_id), `Value);
+ } else if (value == `combobox_bl_devnode_id) {
+ new_item["type"] = "node";
+ new_item["name"] = "devnode";
+ new_item["value"] = (string) UI::QueryWidget(`id(`edit_blacklist_devnode_id), `Value);
+ }
+ string id = "0";
+ id = get_newid(blacklist_exception_items);
+ new_item["id"] = id;
+ if(check_ble_config(new_item) == true) {
+ config_modified = true;
+ break;
+ }
+ } else {
+ Popup::Message(sformat("Invalid ret: %1", ret));
+ }
+ } else if(ret == `edit_blacklist_vendor_id) {
+ vendor_str = (string) UI::QueryWidget(`id(`edit_blacklist_vendor_id), `Value);
+ } else if(ret == `edit_blacklist_product_id) {
+ product_str = (string) UI::QueryWidget(`id(`edit_blacklist_product_id), `Value);
+ } else if(ret == `edit_blacklist_devnode_id) {
+ devnode_str = (string) UI::QueryWidget(`id(`edit_blacklist_devnode_id), `Value);
+ } else if(ret == `edit_blacklist_wwid_id) {
+ any str = nil;
+ str = UI::QueryWidget(`id(`edit_blacklist_wwid_id), `Value);
+ wwid_str = (string) str;
+ } else {
+ UI::CloseDialog();
+ return;
+ }
+ }
+
+ blacklist_exception_items = add(blacklist_exception_items, new_item);
+
+ UI::CloseDialog();
+ return;
+}
+
+
+
+any Blacklist_Exception_Dialog() {
+ Wizard::SetContentsButtons(caption, contents, HELPS["Blacklist_Exception_help"]:"",
+ Label::BackButton(), Label::OKButton());
+ UI::ReplaceWidget(`id(`contents_replace_id), blacklist_exception_config);
+ UI::ChangeWidget(`id(`blacklist_table_id), `Items, Build_BlacklistException_Table());
+
+ any ret = nil;
+ while(true) {
+ ret = UI::UserInput();
+ if(ret == `blacklist_del_id) {
+ integer cur = (integer) UI::QueryWidget(`id(`blacklist_table_id), `CurrentItem);
+ term cur_item = (term) UI::QueryWidget(`id(`blacklist_table_id), `Item(cur));
+ Delete_Blacklist_Exception_Dialog(cur_item);
+ UI::ChangeWidget(`id(`blacklist_table_id), `Items, Build_BlacklistException_Table());
+ continue;
+ } else if(ret == `blacklist_edit_id || ret == `blacklist_table_id) {
+ integer cur = (integer) UI::QueryWidget(`id(`blacklist_table_id), `CurrentItem);
+ term cur_item = (term) UI::QueryWidget(`id(`blacklist_table_id), `Item(cur));
+ Edit_Blacklist_Exception_Dialog(cur_item);
+ UI::ChangeWidget(`id(`blacklist_table_id), `Items, Build_BlacklistException_Table());
+ UI::ChangeWidget(`id(`blacklist_table_id), `CurrentItem, cur);
+ continue;
+ } else if(ret == `blacklist_add_id) {
+ Add_Blacklist_Exception_Dialog();
+ UI::ChangeWidget(`id(`blacklist_table_id), `Items, Build_BlacklistException_Table());
+ continue;
+ } else {
+ break;
+ }
+ }
+ return ret;
+}
+
void Delete_Devices_Dialog(term table_item) {
if(table_item == nil) return;
devices_items = filter(map item, devices_items, {
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-multipath-2.13.0/src/helps.ycp new/yast2-multipath-2.13.0/src/helps.ycp
--- old/yast2-multipath-2.13.0/src/helps.ycp 2007-01-19 08:42:45.000000000 +0100
+++ new/yast2-multipath-2.13.0/src/helps.ycp 2007-07-10 19:08:28.000000000 +0200
@@ -88,6 +88,15 @@
<b>device</b>: Used to identify a specific storage controller in blacklist. A device can be specified by vendor and product name.<br>
</p>"),
+ /* dialog help for blacklist_exception section configure tab 1/3 */
+ "Blacklist_Exception_help": _("<p><b><big>Blacklist Exception Configuration</big></b><br>
+ Device names listed here are exceptions of blacklist.<br>
+ There are three methods to identify a device name: <b>wwid</b>, <b>devnode</b>, <b>device</b>.<br><br>
+ <b>wwid</b>: The world wide ID identifying the device excepted from blacklist.<br>
+ <b>devnode</b>: Regular expression can be used here to identify device names in udev_dir (default in directory /dev). Common device names are cciss, fd, hd, md, dm, sr, scd, st, ram, raw, loop.<br>
+ <b>device</b>: Used to identify a specific storage controller excepted from blacklist. A device can be specified by vendor and product name.<br>
+</p>"),
+
/* dialog help for devcies section configure tab 1/3 */
"Devices_help": _("<p><b><big>Devices Configuration</big></b><br>
Per storage controler settings are listed here, they override the default settings and are overriden by per multipath settings.<br>
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-multipath-2.13.0/src/Multipath.ycp new/yast2-multipath-2.13.0/src/Multipath.ycp
--- old/yast2-multipath-2.13.0/src/Multipath.ycp 2007-01-19 11:01:17.000000000 +0100
+++ new/yast2-multipath-2.13.0/src/Multipath.ycp 2007-07-10 18:36:50.000000000 +0200
@@ -126,6 +126,9 @@
return false;
}
+ /* prepare for loading built-in configurations */
+ SCR::Execute(.target.bash, "/sbin/multipath -t > " + builtin_multipath_conf_path);
+
ret = Read_MultipathConfig();
if(ret == false) {
Report::Error(_("Cannot read multipath section in multipath configuration"));
@@ -144,6 +147,12 @@
return false;
}
+ ret = Read_BlacklistException_Config();
+ if(ret == false) {
+ Report::Error(_("Cannot read blacklist_exceptions section in multipath configuration"));
+ return false;
+ }
+
ret = Read_DeviceConfig();
if(ret == false) {
Report::Error(_("Cannot read devices section in multipath configuration"));
@@ -342,6 +351,21 @@
UI::ChangeWidget(`id(`multipaths_table_id), `Items, Build_MultipathsTable());
continue;
}
+ } else if (ret == `blacklist_exception_config_id) {
+ ret = Blacklist_Exception_Dialog();
+
+ if(ret == `cancel || ret == `abort) {
+ if(ReallyAbort()) break;
+ } else if (ret == `next || ret == `back) {
+ Wizard::SetContentsButtons(caption, contents, HELPS["Configure_help"]:"",
+ Label::BackButton(), Label::FinishButton());
+ UI::ReplaceWidget(`id(`contents_replace_id), Tabs);
+ if(has_dumbtab)
+ UI::ChangeWidget(`id(`tabs), `CurrentItem, _("Configure"));
+ UI::ReplaceWidget(`id(`tab_replace_id), tab_config);
+ UI::ChangeWidget(`id(`multipaths_table_id), `Items, Build_MultipathsTable());
+ continue;
+ }
} else if(ret == `defaults_config_id) {
ret = Defaults_Dialog();
if(ret == `cancel || ret == `abort) {
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org