home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / runlevel_proposal.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  287 lines

  1. /**
  2.  * File:    clients/runlevel_proposal.ycp
  3.  * Package:    System Services (Runlevel) (formerly known as Runlevel Editor)
  4.  * Summary:    Default runlevel proposal
  5.  * Authors:    Michal Svec <msvec@suse.cz>
  6.  *
  7.  * $Id: runlevel_proposal.ycp 33299 2006-10-10 09:39:23Z locilka $
  8.  */
  9.  
  10. {
  11.  
  12. textdomain "runlevel";
  13.  
  14. import "Label";
  15. import "RunlevelEd";
  16. import "Summary";
  17. import "Arch";
  18. import "ProductFeatures";
  19. import "Linuxrc";
  20. import "Mode";
  21. import "Wizard";
  22. import "Popup";
  23.  
  24. /* The main () */
  25. y2milestone("----------------------------------------");
  26. y2milestone("Runlevel proposal started");
  27. y2milestone("Arguments: %1", WFM::Args());
  28.  
  29. string func = (string) WFM::Args(0);
  30. map param = (map) WFM::Args(1);
  31. map ret = $[];
  32.  
  33. // Bugzilla #166918
  34. boolean CheckSelectedRunlevel (string selected_runlevel) {
  35.     if (selected_runlevel == nil) {
  36.     y2error("CheckSelectedRunlevel(nil)");
  37.     return true;
  38.     }
  39.  
  40.     boolean vnc = Linuxrc::vnc ();
  41.     boolean ssh = Linuxrc::usessh ();
  42.  
  43.     // VNC needs runlevel 5
  44.     if (vnc && selected_runlevel != "5") {
  45.     y2warning("VNC nstallation, but selected mode is %1", selected_runlevel);
  46.     return Popup::YesNo (
  47.         sformat (
  48.         // popup question, %1 means the current runlevel (number)
  49.         _("VNC needs runlevel 5 to run correctly.
  50. No graphical system login will be available
  51. after the computer is rebooted.
  52.  
  53. Are you sure you want to use runlevel %1 instead?"),
  54.         selected_runlevel
  55.         )
  56.     );
  57.     // SSH (installation) needs network
  58.     } else if (ssh && ! contains(["3", "5"], selected_runlevel)) {
  59.     y2warning("SSHD nstallation, but selected mode is %1", selected_runlevel);
  60.     return Popup::YesNo (
  61.         sformat (
  62.         // popup question, %1 means the current runlevel (number)
  63.         _("SSH needs running network.
  64. You have selected a non-network runlevel.
  65. Recommended runlevels are 3 or 5.
  66.  
  67. Are you sure you want to use %1 instead?"),
  68.         selected_runlevel
  69.         )
  70.     );
  71.     }
  72.     
  73.     return true;
  74. }
  75.  
  76. define symbol RLDialog () {
  77.  
  78.     term known_runlevels = `VBox();
  79.     string currently_selected_runlevel = "";
  80.  
  81.     list <term> runlevels = (list <term>) sort (RunlevelEd::getDefaultPicker (`proposal));
  82.  
  83.     foreach (term one_runlevel, runlevels, {
  84.     string current_id = one_runlevel[0,0]:"";
  85.  
  86.     known_runlevels = add (known_runlevels,
  87.         `Left (`RadioButton (
  88.         `id (current_id),
  89.         sformat ("&%1", one_runlevel[1]:"")
  90.         ))
  91.     );
  92.     
  93.     if ((boolean) one_runlevel[2]:false == true)
  94.         currently_selected_runlevel = current_id;
  95.     });
  96.     
  97.     // dialog caption
  98.     string title =  _("Set Default Runlevel");
  99.  
  100.     term contents = `VBox (
  101.     `RadioButtonGroup (`id (`selected_runlevel), `Frame (
  102.         // frame label
  103.         _("Available Runlevels"),
  104.         `HSquash (
  105.         `MarginBox (
  106.             0.5, 0.5,
  107.             known_runlevels
  108.         )
  109.         )
  110.     ))
  111.     );
  112.  
  113.     // made by rwalter@novell.com, bug #206664 comment #8
  114.     // help for runlevel - installation proposal, part 1
  115.     string help = _("<p><b><big>Selecting the Default Runlevel</big</b></p>") +
  116.     
  117.     // help for runlevel - installation proposal, part 2
  118.     _("<p>The runlevel is the setting that helps determine which services are
  119. available by default. Select the level that includes the services this system
  120. should allow when the system starts.</p>") +
  121.  
  122.     // help for runlevel - installation proposal, part 3
  123.     _("<p>Runlevel <b>2</b> allows multiple users to log in to the system locally, but
  124. no network or network services are available.  This setting is rarely used as
  125. the default.</p>") +
  126.  
  127.     // help for runlevel - installation proposal, part 4
  128.     _("<p>Runlevel <b>3</b> allows both local and remote logins and enables the
  129. network and any configured network services.  This setting does not start the
  130. graphical login manager, so graphical user interfaces cannot be used
  131. immediately.</p>") +
  132.  
  133.     // help for runlevel - installation proposal, part 5
  134.     _("<p>Runlevel <b>5</b> is the most common default runlevel for workstations.  In
  135. addition to the network, it starts the X display manager, which allows
  136. graphical logins.  It also starts any other configured services.</p>") +
  137.  
  138.     // help for runlevel - installation proposal, part 6
  139.     _("<p>If you are not sure what to select, runlevel <b>5</b> is generally a good
  140. choice for workstations.  Runlevel <b>3</b> is often used on servers that do
  141. not have a monitor and should not use graphical interfaces.</p>");
  142.  
  143.     Wizard::CreateDialog ();
  144.     Wizard::SetTitleIcon ("yast-runlevel");
  145.     Wizard::HideAbortButton ();
  146.     Wizard::SetContentsButtons (title, contents, help, Label::CancelButton(), Label::AcceptButton());
  147.  
  148.     if (currently_selected_runlevel != "" && currently_selected_runlevel != nil) {
  149.     UI::ChangeWidget (`id (`selected_runlevel), `CurrentButton, currently_selected_runlevel);
  150.     }
  151.  
  152.     symbol dialog_ret = nil;
  153.  
  154.     while (true) {
  155.     any ret = UI::UserInput();
  156.     y2milestone ("UI Ret: %1", ret);
  157.     
  158.     if (ret == `next || ret == `ok) {
  159.         string selected_runlevel = (string) UI::QueryWidget (`id(`selected_runlevel), `CurrentButton);
  160.  
  161.         // if the selected runlevel is OK
  162.         // or user explicitly accepts the wrong runlevel...
  163.         if (CheckSelectedRunlevel (selected_runlevel)) {
  164.         dialog_ret = `next;
  165.         RunlevelEd::default_runlevel = selected_runlevel;
  166.         break;
  167.         // next loop
  168.         } else {
  169.         continue;
  170.         }
  171.     } else {
  172.         dialog_ret = `back;
  173.         break;
  174.     } 
  175.     }
  176.     y2milestone("Selected Runlevel: %1", RunlevelEd::default_runlevel);
  177.  
  178.     Wizard::CloseDialog();
  179.  
  180.     return dialog_ret;
  181. }
  182.  
  183. /* create a textual proposal */
  184. if(func == "MakeProposal") {
  185.     boolean force_reset = param["force_reset"]:false;
  186.  
  187.     string warning = "";
  188.  
  189.     // find out proposal parameters, ie. what it depends on
  190.     // some architectures don't have X at all
  191.     boolean x11_needed = Arch::x11_setup_needed ();        // constant
  192.     boolean x11_selected = Pkg::IsSelected ("xorg-x11");    // variable
  193.     // But if we install over VNC, we want RL 5 (and kdm) even though
  194.     // there's no X.
  195.  
  196.     boolean vnc = Linuxrc::vnc ();                // constant
  197.     boolean ssh = Linuxrc::usessh ();                // constant
  198.  
  199.     // we can be overriden
  200.     string forced_runlevel = (string)ProductFeatures::GetFeature("globals", "runlevel");
  201.     y2milestone ("x11_setup_needed: %1, x11_selected: %2, vnc: %3, ssh %4, forced: '%5'",
  202.          x11_needed, x11_selected, vnc, ssh, forced_runlevel);
  203.  
  204.     // check only what the user can change at this time
  205.     // Initially the module variables are nil so the condition triggers
  206.     if (RunlevelEd::x11_selected != x11_selected ||
  207.     force_reset)
  208.     {
  209.     // update parameters
  210.     RunlevelEd::x11_selected = x11_selected;
  211.  
  212.     // do the proposal
  213.     if (! Mode::autoinst()) {
  214.             RunlevelEd::default_runlevel = ((x11_needed && x11_selected) || vnc) ? "5": "3";
  215.         // ssh installation, no X-configuration possible, #149071
  216.         if (ssh) RunlevelEd::default_runlevel = "3";
  217.     }
  218.  
  219.     if (forced_runlevel != "") {
  220.         RunlevelEd::default_runlevel = forced_runlevel;
  221.     }
  222.  
  223.  
  224.     }
  225.  
  226.     // Bugzilla #166918
  227.     if (vnc && RunlevelEd::default_runlevel != "5") {
  228.     warning = warning +
  229.         // proposal warning, VNC needs runlevel 5, but the selected one is not 5
  230.         _("<li>VNC needs runlevel 5 to run correctly.
  231. No graphical system login will be available after the computer is rebooted.</li>");
  232.     }
  233.     if (ssh && ! contains (["3", "5"], RunlevelEd::default_runlevel)) {
  234.     warning = warning +
  235.         // proposal warning, SSH needs runlevel 3 or 5, but the selected one is neither one of them
  236.         _("<li>SSH needs runlevel 3 or 5, but you have currently selected a non-network one.</li>");
  237.     }
  238.  
  239.     string proposal = RunlevelEd::ProposalSummary ();
  240.  
  241.     ret = $[
  242.     "preformatted_proposal" : proposal,
  243.     ];
  244.  
  245.     // set warning, if it is not empty
  246.     if (warning != "") {
  247.     ret["warning_level"] = `warning;
  248.     ret["warning"]       = "<ul>" + warning + "</ul>";
  249.     }
  250. }
  251. /* run the module */
  252. else if(func == "AskUser") {
  253.     map stored = RunlevelEd::Export();
  254.     symbol result = RLDialog();
  255.     if (result != `next) RunlevelEd::Import (stored);
  256.     y2debug("stored=%1", stored);
  257.     y2debug("result=%1", result);
  258.     ret = $[ "workflow_sequence" : result ];
  259. }
  260. /* create titles */
  261. else if(func == "Description") {
  262.     ret = $[
  263.     /* Rich text title */
  264.     "rich_text_title" : _("Default Runlevel"),
  265.     /* MenuButton title */
  266.     "menu_title" : _("Default &Runlevel"),
  267.     "id" : "runlevel",
  268.     ];
  269. }
  270. /* write the proposal */
  271. else if(func == "Write") {
  272.     y2milestone ("Not writing yet, will be done in inst_finish");
  273. }
  274. /* unknown function */
  275. else {
  276.     y2error("unknown function: %1", func);
  277. }
  278.  
  279. /* Finish */
  280. y2debug("ret=%1",ret);
  281. y2milestone("Runlevel proposal finished");
  282. y2milestone("----------------------------------------");
  283. return ret;
  284.  
  285. /* EOF */
  286. }
  287.