On Wed, Jun 15, 2011 at 03:14:11AM -0000, [email protected] wrote: > Author: xwhu > Date: Wed Jun 15 05:14:10 2011 > New Revision: 64362 > > URL: http://svn.opensuse.org/viewcvs/yast?rev=64362&view=rev > Log: > Add support of csync2 > > Modified: > trunk/cluster/agents/Makefile.am > trunk/cluster/src/Cluster.ycp > trunk/cluster/src/common.ycp > trunk/cluster/src/dialogs.ycp > trunk/cluster/src/helps.ycp > trunk/cluster/src/wizards.ycp > > Modified: trunk/cluster/agents/Makefile.am > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/agents/Makefile.am?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/agents/Makefile.am (original) > +++ trunk/cluster/agents/Makefile.am Wed Jun 15 05:14:10 2011 > @@ -2,6 +2,7 @@ > > agent_SCRIPTS = ag_openais > > -scrconf_DATA = openais.scr > +scrconf_DATA = openais.scr \ > + csync2_ha.scr > > EXTRA_DIST = $(agent_SCRIPTS) $(scrconf_DATA) > > Modified: trunk/cluster/src/Cluster.ycp > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/Cluster.ycp?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/src/Cluster.ycp (original) > +++ trunk/cluster/src/Cluster.ycp Wed Jun 15 05:14:10 2011 > @@ -42,6 +42,9 @@ > import "PackageSystem"; > import "SuSEFirewall"; > > + > +global string csync2_key_file = "/etc/csync2/key_hagroup"; > + > /** > * Prototypes > */ > @@ -233,6 +236,30 @@ > SCR::Write(.openais, ""); > } > > +global list<string> csync2_host = []; > +global list<string> csync2_include = []; > + > +global void load_csync2_conf() > +{ > + csync2_host = (list<string>)SCR::Read(.csync2_ha.value.ha_group.host); > + csync2_include = > (list<string>)SCR::Read(.csync2_ha.value.ha_group.include); > + > + if (csync2_host == nil) csync2_host = []; > + if (csync2_include == nil) csync2_include = []; > + y2milestone("read csync2 conf: csync2_host = %1", csync2_host); > + y2milestone("read csync2 conf: csync2_include = %1", csync2_include); > +} > + > +global void save_csync2_conf() > +{ > + y2milestone("write csync2 conf: csync2_host = %1", csync2_host); > + y2milestone("write csync2 conf: csync2_include = %1", csync2_include); > + > + SCR::Write(.csync2_ha.value.ha_group.host, csync2_host); > + SCR::Write(.csync2_ha.value.ha_group.include, csync2_include); > + SCR::Write(.csync2_ha.value.ha_group.key, [csync2_key_file]); > +} > + > /** > * Read all cluster settings > * @return true on success > @@ -271,7 +298,7 @@ > ); > > boolean ret = false; > - list<string> required_pack_list = ["pacemaker", "pacemaker-pygui"]; > + list<string> required_pack_list = ["pacemaker", "pacemaker-pygui", > "csync2"]; > ret = > PackageSystem::CheckAndInstallPackagesInteractive(required_pack_list); > if (ret == false) { > Report::Error(_("Cannot install required package")); > @@ -295,6 +322,7 @@ > if(false) Report::Error(_("Cannot read database1.")); > sleep(sl); > > + load_csync2_conf();
Please keep the established indentation rules: four columns per level, \t is 8 columns wide, preferably use 8 spaces instead. > // read another database > if(Abort()) return false; > Progress::NextStep(); > @@ -385,6 +413,8 @@ > SuSEFirewall::AddService(mcastport2, "UDP", "EXT"); > } > > + save_csync2_conf(); > + > // run SuSEconfig > SuSEFirewall::Write(); > if(Abort()) return false; > > Modified: trunk/cluster/src/common.ycp > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/common.ycp?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/src/common.ycp (original) > +++ trunk/cluster/src/common.ycp Wed Jun 15 05:14:10 2011 > @@ -14,7 +14,8 @@ > list<string> DIALOG = [ > "communication", > "security", > - "service" > + "service", > + "csync2" > ]; > > map PARENT = $[ > @@ -23,7 +24,8 @@ > map NAME = $[ > "communication": _("Communication Channels"), > "security": _("Security"), > - "service": _("Service") > + "service": _("Service"), > + "csync2": _("Configure Csync2") > ]; > > void myHelp(string help) > > Modified: trunk/cluster/src/dialogs.ycp > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/dialogs.ycp?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/src/dialogs.ycp (original) > +++ trunk/cluster/src/dialogs.ycp Wed Jun 15 05:14:10 2011 > @@ -45,6 +45,32 @@ > include "cluster/helps.ycp"; > include "cluster/common.ycp"; > > +list<string> csync2_suggest_files = []; > +string csync2_port = "30865"; > + > +// return `cacel or a string > +any text_input_dialog(string title, string value) > +{ > + any ret = nil; > + > + UI::OpenDialog( > + `MarginBox(1, 1, `VBox( > + `MinWidth(100, `TextEntry(`id(`text), title, value)), > + `VSpacing(1), > + `Right(`HBox( > + `PushButton(`id(`ok), _("OK")), > + `PushButton(`id(`cancel), _("Cancel")) > + )) > + )) > + ); > + > + ret = UI::UserInput(); > + if (ret == `ok) ret = UI::QueryWidget(`text, `Value); > + UI::CloseDialog(); > + return ret; > +} We should move this to Popup::TextEntry, improving it to return a string (nil on cancel). (really we don't have this already somewhere?) > + > + > boolean ValidateCommunication () > { > if (IP::Check((string)UI::QueryWidget(`id(`bindnetaddr1), `Value)) == > false) { > @@ -554,6 +580,230 @@ > return ret; > } > > + > +term csync2_layout() > +{ > + return > + `VBox(`opt(`hvstretch), > + `HBox( > + `Frame(_("Sync Host"), > + `VBox( > + `SelectionBox(`id(`host_box), ""), > + `HBox( > + `PushButton(`id(`host_add), "Add"), > + `PushButton(`id(`host_del), "Del"), > + `PushButton(`id(`host_edit), "Edit") > + ) > + )), > + `HSpacing(), > + `Frame(_("Sync File"), > + `VBox( > + `SelectionBox(`id(`include_box), ""), > + `HBox( > + `PushButton(`id(`include_add), "Add"), > + `PushButton(`id(`include_del), "Del"), > + `PushButton(`id(`include_edit), "Edit"), > + `PushButton(`id(`include_suggest), "Add > Suggested Files") Translation marks missing > + ) > + )) > + ), > + `HBox( > + `PushButton(`id(`generate_key), `opt(`hstretch), > _("Generate Pre-Shared-Keys")), > + `PushButton(`id(`csync2_switch), `opt(`hstretch), "") > + ) > + ); > +} > + > + > +// return 1 if csync2 is not installed well > +// return 2 if csync2 is OFF > +// return 3 if csync2 is ON wow. how about boolean: nil, false, true? > +integer csync2_status() > +{ > + map ret = nil; > + > + ret = (map)SCR::Execute(.target.bash_output, "/sbin/chkconfig csync2"); see Service::Enabled > + y2milestone("chkconfig csync2 = %1", ret); > + if (issubstring(ret["stderr"]:"", "command not found") == true) return > 1; > + if (issubstring(ret["stderr"]:"", "unknown service") == true) return 1; > + if (issubstring(ret["stdout"]:"", "off") == true) return 2; > + > + return 3; > +} > + > +void csync2_turn_off() > +{ > + SCR::Execute(.target.bash_output, "/sbin/chkconfig csync2 off"); Service::Disable > + if (SuSEFirewall::HaveService(csync2_port, "TCP", "EXT")) > + SuSEFirewall::RemoveService(csync2_port, "TCP", "EXT"); > +} > + > +void csync2_turn_on() > +{ > + SCR::Execute(.target.bash_output, "/sbin/chkconfig csync2 on"); Service::Enable > + if (!SuSEFirewall::HaveService(csync2_port, "TCP", "EXT")) > + SuSEFirewall::AddService(csync2_port, "TCP", "EXT"); > +} > + > +void fill_csync_entries() > +{ > + integer i = 0; > + integer ret = 0; > + integer current = 0; > + list<term> items = []; > + > + // remove duplicated elements > + Cluster::csync2_host = Cluster::csync2_host + []; > + Cluster::csync2_include = Cluster::csync2_include + []; > + > + i = 0; > + items = []; > + foreach(string value, Cluster::csync2_host, { > + items = add(items, `item(`id(i), value)); > + i = i + 1; > + }); > + current = (integer)UI::QueryWidget(`host_box, `CurrentItem); > + if (current == nil) current = 0; > + if (current >= i) current = i - 1; > + UI::ChangeWidget(`host_box, `Items, items); > + UI::ChangeWidget(`host_box, `CurrentItem, current); > + > + i = 0; > + items = []; > + foreach(string value, Cluster::csync2_include, { > + items = add(items, `item(`id(i), value)); > + i = i + 1; > + }); > + current = (integer)UI::QueryWidget(`include_box, `CurrentItem); > + if (current == nil) current = 0; > + if (current >= i) current = i - 1; > + UI::ChangeWidget(`include_box, `Items, items); > + UI::ChangeWidget(`include_box, `CurrentItem, current); > + > + ret = csync2_status(); > + UI::ChangeWidget(`id(`csync2_switch), `Enabled, (ret != 1)); > + if (ret == 1) > + UI::ChangeWidget(`id(`csync2_switch), `Label, "Csync2 Status > Unknown"); > + if (ret == 2) > + UI::ChangeWidget(`id(`csync2_switch), `Label, "Turn csync2 ON"); > + if (ret == 3) > + UI::ChangeWidget(`id(`csync2_switch), `Label, "Turn csync2 > OFF"); _() missing > +} > + > + > +any Csync2Dialog() > +{ > + any ret = nil; > + > + my_SetContents("csync2", csync2_layout()); > + > + > + while(true) { > + fill_csync_entries(); > + > + ret = UI::UserInput(); > + > + if (ret == `abort || ret == `cancel) { > + if (ReallyAbort()) break; > + continue; > + } > + > + if (ret == `next || ret == `back) { > + break; > + } > + > + if (ret == `wizardTree) > + ret = (string)UI::QueryWidget(`id(`wizardTree), > `CurrentItem); > + > + if (contains(DIALOG, (string)ret)) { > + ret = symbolof(toterm(ret)); > + //SaveCsync2(); > + break; > + } else { > + Wizard::SelectTreeItem("csync2"); > + continue; > + } > + > + if (ret == `host_add) { > + ret = text_input_dialog(_("Input a new host"), ""); > + if (ret == `cancel) continue; > + Cluster::csync2_host = add(Cluster::csync2_host, > (string)ret); > + } > + > + if (ret == `host_edit) { > + integer current = 0; > + string str = ""; > + > + current = (integer)UI::QueryWidget(`host_box, > `CurrentItem); > + ret = text_input_dialog(_("Edit a host"), > Cluster::csync2_host[current]:""); > + if (ret == `cancel) continue; > + Cluster::csync2_host[current] = (string)ret; > + } > + > + if (ret == `host_del) { > + integer current = 0; > + current = (integer)UI::QueryWidget(`host_box, > `CurrentItem); > + Cluster::csync2_host = remove(Cluster::csync2_host, > current); > + } > + > + if (ret == `include_add) { > + ret = text_input_dialog(_("Input a new sync file"), ""); > + if (ret == `cancel) continue; > + Cluster::csync2_include = add(Cluster::csync2_include, > (string)ret); > + } > + > + if (ret == `include_edit) { > + integer current = 0; > + > + current = (integer)UI::QueryWidget(`include_box, > `CurrentItem); > + ret = text_input_dialog(_("Edit a sync file"), > Cluster::csync2_include[current]:""); > + if (ret == `cancel) continue; > + Cluster::csync2_include[current] = (string)ret; > + } > + > + if (ret == `include_del) { > + integer current = 0; > + current = (integer)UI::QueryWidget(`include_box, > `CurrentItem); > + Cluster::csync2_include = > remove(Cluster::csync2_include, current); > + } > + > + if (ret == `include_suggest) { > + Cluster::csync2_include = Cluster::csync2_include + > csync2_suggest_files; > + } > + > + if (ret == `generate_key) { > + string key_file = Cluster::csync2_key_file; > + > + // key file exist > + if (SCR::Read(.target.size, key_file) > 0) { > + if (!Popup::YesNo(sformat(_("Key file %1 > already exist.\nDo you want to overwrite it?"), key_file))) > + continue; > + > + // remove exist key file > + if (SCR::Execute(.target.remove, key_file) == > false) { > + Popup::Message(sformat(_("Delete key > file %1 failed."), key_file)); > + continue; > + } > + } > + > + // generate key file > + ret = SCR::Execute(.target.bash, sformat("csync2 -k > %1", key_file)); > + if (ret == 0) > + Popup::Message(sformat(_("Key file %1 is > generated.\nPlease copy this file to all members of the cluster."), > key_file)); > + else > + Popup::Message("Key generation failed."); _() > + } > + > + if (ret == `csync2_switch) { > + string label = ""; > + label = (string)UI::QueryWidget(`csync2_switch, `Label); > + if (issubstring(label, "OFF")) csync2_turn_off(); > + if (issubstring(label, "ON")) csync2_turn_on(); > + } > + } > + > + return ret; > +} > /* EOF */ > } > > > Modified: trunk/cluster/src/helps.ycp > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/helps.ycp?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/src/helps.ycp (original) > +++ trunk/cluster/src/helps.ycp Wed Jun 15 05:14:10 2011 > @@ -50,6 +50,13 @@ > <p><b><big>Booting</big></b><br>Starting openais > service during boot or not</p> > <p><b><big>Start mgmtd</big></b><br>Mgmtd daemon is a > standalone service daemon. It is required by the GUI</p> > "), > + > + "csync2" : _(" > + <p><b><big>Sync Host</big></b><br>The hostnames used here must > be the local hostnames of the cluster nodes. That means you must use exactly > the same string as printed out by the hostname command.</p> > + <p><b><big>Sync File</big></b><br>The full absolute filename to > be synced.</p> > + <p><b><big>Pre-Shared-Keys</big></b><br>Authentication is > performed using the IP addresses and pre-shared-keys in Csync2. The key file > is generated with csync2 -k /etc/csync2/key_hagroup. The file key_hagroup > should be copied to all members of the cluster manually after it's > created.</p> > + "), > + > /* Read dialog help 1/2 */ > "read" : _("<p><b><big>Initializing cluster Configuration</big></b><br> > Please wait...<br></p> > > Modified: trunk/cluster/src/wizards.ycp > URL: > http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/wizards.ycp?rev=64362&r1=64361&r2=64362&view=diff > ============================================================================== > --- trunk/cluster/src/wizards.ycp (original) > +++ trunk/cluster/src/wizards.ycp Wed Jun 15 05:14:10 2011 > @@ -41,7 +41,8 @@ > map Aliases = $[ > "communication": ``(CommunicationDialog()), > "security": ``(SecurityDialog()), > - "service": ``(ServiceDialog()) > + "service": ``(ServiceDialog()), > + "csync2": ``(Csync2Dialog()) > ]; > > > @@ -86,7 +87,8 @@ > "ws_start" : "communication", > "communication": $[ `next:"security", `back:"communication", > `abort:`abort ], > "security": $[ `next:"service", `back:"communication", > `abort:`abort ], > - "service": $[ `next:`next, `back:"security", `abort:`abort ], > + "service": $[ `next:"csync2", `back:"security", `abort:`abort ], > + "csync2" : $[ `next:`next, `back:"service", `abort:`abort ], > ]; > > any ret = Sequencer::Run(Aliases, sequence); > > -- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > -- Martin Vidner, YaST developer http://en.opensuse.org/User:Mvidner Kuracke oddeleni v restauraci je jako fekalni oddeleni v bazenu
pgpkI5TFxkJNE.pgp
Description: PGP signature
