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 / modules / CWMServiceStart.ycp < prev    next >
Text File  |  2006-11-29  |  18KB  |  631 lines

  1. /**
  2.  * File:    modules/CWMServiceStart.ycp
  3.  * Package:    Common widget manipulation, service start widget
  4.  * Summary:    Routines for service start widget handling
  5.  * Authors:    Jiri Srain <jsrain@suse.cz>
  6.  *
  7.  * $Id: CWMServiceStart.ycp 23465 2005-05-18 13:59:02Z jsrain $
  8.  *
  9.  */
  10.  
  11. {
  12.  
  13. module "CWMServiceStart";
  14. textdomain "base";
  15.  
  16. import "CWM";
  17. import "Mode";
  18. import "ProductFeatures";
  19. import "Service";
  20.  
  21.  
  22. // private variables
  23.  
  24. /**
  25.  * Label saying that service is running
  26.  */
  27. string service_is_running = "";
  28.  
  29. /**
  30.  * Label saying that service is stopped
  31.  */
  32. string service_is_stopped = "";
  33.  
  34. /**
  35.  * Last status of the service
  36.  */
  37. boolean last_status = nil;
  38.  
  39.  
  40. // private functions
  41.  
  42. /**
  43.  * Update the displayed status of the service
  44.  * @param widget a map describing the widget
  45.  */
  46. void UpdateServiceStatusWidget (map<string,any> widget) {
  47.     if (! UI::WidgetExists (`id ("_cwm_service_status_rp")))
  48.     return;
  49.     if (Mode::config ())
  50.     {
  51.         UI::ChangeWidget (`id ("_cwm_start_service_now"), `Enabled, false);
  52.         UI::ChangeWidget (`id ("_cwm_stop_service_now"), `Enabled, false);
  53.     // service status - label
  54.         UI::ReplaceWidget (`id ("_cwm_service_status_rp"), `Label (_("Unavailable")));
  55.     }
  56.     else
  57.     {
  58.         boolean status = 0 == Service::Status (widget["service_id"]:"");
  59.     if (status != last_status)
  60.     {
  61.         UI::ChangeWidget (`id ("_cwm_start_service_now"),
  62.         `Enabled,
  63.         ! status);
  64.         UI::ChangeWidget (`id ("_cwm_stop_service_now"),
  65.         `Enabled,
  66.         status);
  67.         UI::ReplaceWidget (`id ("_cwm_service_status_rp"),
  68.         `Label (status
  69.             ? service_is_running
  70.             : service_is_stopped
  71.         )
  72.         );
  73.         last_status = status;
  74.     }
  75.     }
  76. }
  77.  
  78. /**
  79.  * Update the widget displaying if LDAP support is active
  80.  * @param widget a map describing the widget
  81.  */
  82. define void UpdateLdapWidget (map<string,any> widget) {
  83.     if (! UI::WidgetExists (`id ("_cwm_use_ldap")))
  84.     return;
  85.     boolean() get_use_ldap = (boolean())
  86.     widget["get_use_ldap"]:nil;
  87.     boolean use_ldap = get_use_ldap ();
  88.     UI::ChangeWidget (`id ("_cwm_use_ldap"), `Value, use_ldap);
  89. }
  90.  
  91. /**
  92.  * Handle the "Use LDAP" check box
  93.  * @param widget a map describing the widget
  94.  * param event_id any the ID of the occurred event
  95.  */
  96. define void HandleLdap (map<string,any> widget, any event_id) {
  97.     if (event_id == "_cwm_use_ldap")
  98.     {
  99.     void(boolean) set_use_ldap = (void(boolean))
  100.         widget["set_use_ldap"]:nil;
  101.         boolean use_ldap = (boolean)UI::QueryWidget (`id ("_cwm_use_ldap"), `Value);
  102.     set_use_ldap (use_ldap);
  103.     UpdateLdapWidget (widget);
  104.     }
  105. }
  106.  
  107. // public functions
  108.  
  109. // automatic service start-up related functions
  110.  
  111. /**
  112.  * Init function of the widget
  113.  * @param map widget a widget description map
  114.  * @param key strnig the widget key
  115.  */
  116. global void AutoStartInit (map<string,any> widget, string key) {
  117.     if (! UI::WidgetExists (`id ("_cwm_service_startup")))
  118.     {
  119.     y2error ("Widget _cwm_service_startup does not exist");
  120.     return;
  121.     }
  122.     boolean() get_auto_start = (boolean())widget["get_service_auto_start"]:nil;
  123.     boolean auto_start = get_auto_start ();
  124.     UI::ChangeWidget (`id ("_cwm_service_startup"), `CurrentButton,
  125.     auto_start
  126.         ? "_cwm_startup_auto"
  127.         : "_cwm_startup_manual");
  128. }
  129.  
  130. /**
  131.  * Store function of the widget
  132.  * @param map widget a widget description map
  133.  * @param key strnig the widget key
  134.  * @param event map that caused widget data storing
  135.  */
  136. global void AutoStartStore (map<string,any> widget, string key, map event) {
  137.     if (! UI::WidgetExists (`id ("_cwm_service_startup")))
  138.     {
  139.     y2error ("Widget _cwm_service_startup does not exist");
  140.     return;
  141.     }
  142.     boolean auto_start
  143.     = UI::QueryWidget (`id ("_cwm_service_startup"), `CurrentButton)
  144.         == "_cwm_startup_auto";
  145.     void(boolean) set_auto_start
  146.     = (void(boolean))widget["set_service_auto_start"]:nil;
  147.     set_auto_start(auto_start);
  148. }
  149.  
  150. /**
  151.  * Init function of the widget
  152.  * @param key strnig the widget key
  153.  */
  154. global void AutoStartInitWrapper (string key) {
  155.     AutoStartInit (CWM::GetProcessedWidget (), key);
  156. }
  157.  
  158. /**
  159.  * Store function of the widget
  160.  * @param key strnig the widget key
  161.  * @param event map that caused widget data storing
  162.  */
  163. global void AutoStartStoreWrapper (string key, map event) {
  164.     AutoStartStore (CWM::GetProcessedWidget (), key, event);
  165. }
  166.  
  167. /**
  168.  * Get the template for the help text to the auto start widget
  169.  * @return string help text template with %1 and %2 placeholders
  170.  */
  171. global string AutoStartHelpTemplate () {
  172.     // help text for service auto start widget
  173.     // %1 and %2 are button labels
  174.     // %1 is eg. "On -- Start Service when Booting"
  175.     // %2 is eg. "Off -- Start Service Manually"
  176.     // (both without quotes)
  177.     return _("<p><b><big>Service Start</big></b><br>
  178. To start the service every time your computer is booted, set
  179. <b>%1</b>. Otherwise set <b>%2</b>.</p>");
  180. }
  181.  
  182. /**
  183.  * Get the help text to the auto start widget
  184.  * @return string help text
  185.  */
  186. global string AutoStartHelp () {
  187.     return sformat (AutoStartHelpTemplate (),
  188.     // part of help text - radio button label, NO SHORTCUT!!!
  189.     _("During Boot"),
  190.     // part of help text - radio button label, NO SHORTCUT!!!
  191.     _("Manually"));
  192. }
  193.  
  194. /**
  195.  * Get the widget description map of the widget for service auto starting
  196.  * settings
  197.  * @param settings a map of all parameters needed to create the widget properly
  198.  * <pre>
  199.  *
  200.  * - "get_service_auto_start" : boolean () -- function that returns if the
  201.  *          service is set for automatical start-up
  202.  * - "set_service_auto_start" : void (boolean) -- function that takes as
  203.  *          an argument boolean value saying if the service is started
  204.  *          automatically during booting
  205.  * - "start_auto_button" : string -- label of the radio button to start
  206.  *          the service automatically when booting
  207.  * - "start_manual_button" : string -- label of the radio button to start
  208.  *          the service only manually
  209.  * - "help" : string -- custom help for the widget. If not specified, generic
  210.  *          help is used
  211.  *
  212.  * </pre>
  213.  * Additional settings:
  214.  * - "help" : string -- help to the whole widget. If not specified, generic help
  215.  *          is used (button labels are patched correctly)
  216.  * </pre>
  217.  * @return map the widget description map
  218.  */
  219. global map<string,any> CreateAutoStartWidget (map<string,any> settings) {
  220.     string help = "";
  221.     string start_auto_button
  222.     // radio button
  223.     = settings["start_auto_button"]:_("During Boot");
  224.     string start_manual_button
  225.     // radio button
  226.     = settings["start_manual_button"]:_("Manually");
  227.     if (haskey (settings, "help"))
  228.     {
  229.     help = settings["help"]:"";
  230.     }
  231.     else
  232.     {
  233.     help = AutoStartHelp ();
  234.     }
  235.  
  236.     // Frame label (service starting)
  237.     term booting = `VBox (
  238.     // frame
  239.     `Frame (_("Service Start"),
  240.         `Left (`RadioButtonGroup (`id ("_cwm_service_startup"), `VBox (
  241.         `VSpacing (0.4),
  242.         `Left (`RadioButton (`id ("_cwm_startup_auto"),
  243.             `opt (`notify),
  244.             start_auto_button)),
  245.         `Left (`RadioButton (`id ("_cwm_startup_manual"),
  246.             `opt (`notify),
  247.             start_manual_button)),
  248.         `VSpacing (0.4)
  249.         )))
  250.     )
  251.     );
  252.  
  253.     if (! (haskey (settings, "set_service_auto_start")
  254.     && haskey (settings, "get_service_auto_start")))
  255.     {
  256.     booting = `VBox ();
  257.     help = "";
  258.     }
  259.  
  260.     map<string,any> ret = (map<string,any>)union (settings, $[
  261.     "widget" : `custom,
  262.     "custom_widget" : booting,
  263.     "help" : help,
  264.     "init" : AutoStartInitWrapper,
  265.     "store" : AutoStartStoreWrapper,
  266.     ]);
  267.  
  268.     return ret;
  269. }
  270.  
  271. // service status and immediate actions related functions
  272.  
  273. /**
  274.  * Handle the immediate start and stop of the service
  275.  * @param widget a map describing the widget
  276.  * @param key strnig the widget key
  277.  * @param event_id any the ID of the occurred event
  278.  * @return always nil
  279.  */
  280. global symbol StartStopHandle (map<string,any> widget, string key, map event) {
  281.     any event_id = event["ID"]:nil;
  282.     if (event_id == "_cwm_start_service_now")
  283.     {
  284.     if (haskey (widget, "start_now_action"))
  285.     {
  286.         void () start_now_func = (void())widget["start_now_action"]:nil;
  287.         start_now_func ();
  288.     }
  289.     else
  290.     {
  291.         Service::Restart (widget["service_id"]:"");
  292.     }
  293.     sleep (500);
  294.     }
  295.     else if (event_id == "_cwm_stop_service_now")
  296.     {
  297.     if (haskey (widget, "stop_now_action"))
  298.     {
  299.         void () stop_now_func = (void())widget["stop_now_action"]:nil;
  300.         stop_now_func ();
  301.     }
  302.     else
  303.     {
  304.         Service::Stop (widget["service_id"]:"");
  305.     }
  306.     sleep (500);
  307.     }
  308.     else if (event_id == "_cwm_save_settings_now")
  309.     {
  310.     void() func = (void())widget["save_now_action"]:nil;
  311.     func ();
  312.     sleep (500);
  313.     }
  314.     UpdateServiceStatusWidget (widget);
  315.     return nil;
  316. }
  317.  
  318. /**
  319.  * Init function of the widget
  320.  * @param map widget a widget description map
  321.  * @param key strnig the widget key
  322.  */
  323. global void StartStopInit (map<string,any> widget, string key) {
  324.     last_status = nil;
  325.     service_is_running
  326.     // service status - label
  327.     = widget["service_running_label"]:_("Service is running");
  328.     service_is_stopped
  329.     // service status - label
  330.     = widget["service_not_running_label"]:_("Service is not running");
  331.     UpdateServiceStatusWidget (widget);
  332. }
  333.  
  334. /**
  335.  * Handle the immediate start and stop of the service
  336.  * @param key strnig the widget key
  337.  * @param event_id any the ID of the occurred event
  338.  * @return always nil
  339.  */
  340. global symbol StartStopHandleWrapper (string key, map event) {
  341.     return StartStopHandle (CWM::GetProcessedWidget (), key, event);
  342. }
  343.  
  344. /**
  345.  * Init function of the widget
  346.  * @param key strnig the widget key
  347.  */
  348. global void StartStopInitWrapper (string key) {
  349.     StartStopInit (CWM::GetProcessedWidget (), key);
  350. }
  351.  
  352. /**
  353.  * Get the template for the help text to the start/stop widget
  354.  * @param restart_displayed shold be true if "Save and restart" is displayed
  355.  * @return string help text template with %1 and %2 placeholders
  356.  */
  357. global string StartStopHelpTemplate (boolean restart_displayed) {
  358.     // help text for service status displaying and switching  widget 1/2
  359.     // %1 and %2 are push button labels
  360.     // %1 is eg. "Start the Service Now"
  361.     // %2 is eg. "Stop the Service Now"
  362.     // (both without quotes)
  363.     string help = _("<p><b><big>Switch On or Off</big></b><br>
  364. To start or stop the service immediately, use 
  365. <b>%1</b> or <b>%2</b>.</p>");
  366.     if (restart_displayed)
  367.     {
  368.     // help text for service start widget 2/2, optional
  369.     // %3 is push button label, eg. "Save Changes and Restart Service Now"
  370.     // (without quotes)
  371.     // note: %3 is correct, do not replace with %1!!!
  372.     help = help + _("<p>To save all changes and restart the
  373. service immediately, use <b>%3</b>.</p>
  374. ");
  375.     }
  376.     return help;
  377. }
  378.  
  379. /**
  380.  * Get the help text to the start/stop widget
  381.  * @param restart_displayed shold be true if "Save and restart" is displayed
  382.  * @return string help text
  383.  */
  384. global string StartStopHelp (boolean restart_displayed) {
  385.     return sformat (StartStopHelpTemplate (restart_displayed),
  386.     // part of help text - push button label, NO SHORTCUT!!!
  387.     _("Start the Service Now"),
  388.     // part of help text - push button label, NO SHORTCUT!!!
  389.     _("Stop the Service Now"),
  390.     // part of help text - push button label, NO SHORTCUT!!!
  391.     _("Save Changes and Restart Service Now"));
  392. }
  393.  
  394. /**
  395.  * Get the widget description map for immediate service start/stop
  396.  * and appropriate actions
  397.  * @param settings a map of all parameters needed to create the widget properly
  398.  * <pre>
  399.  *
  400.  * - "service_id" : string -- service identifier for Service:: functions.
  401.  *          If not specified, immediate actions buttons are not displayed.
  402.  * - "save_now_action" : void () -- function that causes saving of all settings
  403.  *          and restarting the service. If key is missing, the button
  404.  *          is not displayed
  405.  * - "start_now_action" : void () -- function that causes starting the service
  406.  *          If not specified, generic function using "service_id" is used
  407.  *          instead
  408.  * - "stop_now_action" : void () -- function that causes stopping the service
  409.  *          If not specified, generic function using "service_id" is used
  410.  *          instead
  411.  * - "service_running_label" : string -- label to be displayed if the service
  412.  *          is running.
  413.  * - "service_not_running_label" : string -- label to be displayed if the
  414.  *          service is stopped.
  415.  * - "start_now_button" : string -- label for the push button for immediate
  416.  *          service start
  417.  * - "stop_now_button" : string -- label for the push button for immediate
  418.  *          service stop
  419.  * - "save_now_button" : string -- label for the push button for immediate
  420.  *          settings saving and service restarting
  421.  * - "help" : string -- help to the widget. If not specified, generic help
  422.  *          is used (button labels are patched correctly)
  423.  * </pre>
  424.  * @return map the widget description map
  425.  */
  426. global define map<string,any> CreateStartStopWidget (map<string,any> settings) {
  427.     string help = "";
  428.     string start_now_button
  429.     // push button for immediate service starting
  430.     = settings["start_now_button"]:_("&Start the Service Now");
  431.     string stop_now_button
  432.     // push button for immediate service stopping
  433.     = settings["stop_now_button"]:_("S&top the Service Now");
  434.     string save_now_button
  435.     = settings["save_now_button"]:
  436.     // push button for immediate saving of the settings and service starting
  437.         _("S&ave Changes and Restart Service Now");
  438.     boolean display_save_now = haskey (settings, "save_now_action");
  439.  
  440.     if (haskey (settings, "help"))
  441.     {
  442.     help = settings["help"]:"";
  443.     }
  444.     else
  445.     {
  446.     help = StartStopHelp (display_save_now);
  447.     }
  448.  
  449.     term save_now_button_term =
  450.     display_save_now
  451.         ? `PushButton (`id ("_cwm_save_settings_now"),
  452.         `opt (`hstretch),
  453.         save_now_button)
  454.         : `VBox ();
  455.  
  456.     term immediate_actions = `VBox (
  457.     // Frame label (stoping starting service)
  458.     `Frame ( _("Switch On and Off"),
  459.         `Left (`HSquash (`VBox (
  460.         `HBox (
  461.             // Current status
  462.             `Label (_("Current Status: ")),
  463.             `ReplacePoint (`id ("_cwm_service_status_rp"), `Label ("")),
  464.             `HStretch ()
  465.         ),
  466.         `PushButton (`id ("_cwm_start_service_now"),
  467.             `opt (`hstretch),
  468.             start_now_button),
  469.         `PushButton (`id ("_cwm_stop_service_now"),
  470.             `opt (`hstretch),
  471.             stop_now_button),
  472.         save_now_button_term
  473.         )))
  474.     )
  475.     );
  476.  
  477.     if (! haskey (settings, "service_id"))
  478.     {
  479.     immediate_actions = `VBox ();
  480.     help = "";
  481.     }
  482.  
  483.     map<string,any> ret = (map<string,any>)union (settings, $[
  484.     "widget" : `custom,
  485.     "custom_widget" : immediate_actions,
  486.     "help" : help,
  487.     "init" : StartStopInitWrapper,
  488.     "handle" : StartStopHandleWrapper,
  489.     "handle_events" : [ `timeout, "_cwm_start_service_now",
  490.         "_cwm_stop_service_now", "_cwm_save_settings_now" ],
  491.     ]);
  492.  
  493.     if (haskey (settings, "service_id"))
  494.     ret["ui_timeout"] = 5000;
  495.     return ret;
  496. }
  497.  
  498. // ldap enablement widget
  499.  
  500. /**
  501.  * Init function of the widget
  502.  * @param map widget a widget description map
  503.  * @param key strnig the widget key
  504.  */
  505. global define void LdapInit (map<string,any> widget, string key) {
  506.     UpdateLdapWidget (widget);
  507. }
  508.  
  509. /**
  510.  * Handle function of the widget
  511.  * @param map widget a widget description map
  512.  * @param key strnig the widget key
  513.  * @param event map event to be handled
  514.  * @return symbol for wizard sequencer or nil
  515.  */
  516. global symbol LdapHandle (map<string,any> widget, string key, map event) {
  517.     any ret = event["ID"]:nil;
  518.     if (ret == "_cwm_use_ldap")
  519.     {
  520.     HandleLdap (widget, ret);
  521.     return nil;
  522.     }
  523.     return nil;
  524. }
  525.  
  526.  
  527. /**
  528.  * Init function of the widget
  529.  * @param key strnig the widget key
  530.  */
  531. global define void LdapInitWrapper (string key) {
  532.     LdapInit (CWM::GetProcessedWidget (), key);
  533. }
  534.  
  535. /**
  536.  * Handle function of the widget
  537.  * @param map widget a widget description map
  538.  * @param key strnig the widget key
  539.  * @param event map event to be handled
  540.  * @return symbol for wizard sequencer or nil
  541.  */
  542. global define symbol LdapHandleWrapper (string key, map event) {
  543.     return LdapHandle (CWM::GetProcessedWidget (), key, event);
  544. }
  545.  
  546. /**
  547.  * Get the template for the help text to the LDAP enablement widget
  548.  * @return string help text template with %1 and %2 placeholders
  549.  */
  550. global string EnableLdapHelpTemplate () {
  551.     // help text for LDAP enablement widget
  552.     // %1 is button label, eg. "LDAP Support Active" (without quotes)
  553.     return _("<p><b><big>LDAP Support</big></b><br>
  554. To store the settings in LDAP instead of native configuration files,
  555. set <b>%1</b>.</p>");
  556. }
  557.  
  558. /**
  559.  * Get the help text to the LDAP enablement widget
  560.  * @return string help text
  561.  */
  562. global string EnableLdapHelp () {
  563.     return sformat (EnableLdapHelpTemplate (),
  564.     // part of help text - check box label, NO SHORTCUT!!!
  565.     _("LDAP Support Active"));
  566. }
  567.  
  568. /**
  569.  * Get the widget description map of the LDAP enablement widget
  570.  * TODO: Find a file to move to
  571.  * @param settings a map of all parameters needed to create the widget properly
  572.  * <pre>
  573.  *
  574.  * LDAP support:
  575.  * - "get_use_ldap" : boolean () -- function to return current status
  576.  *          of the LDAP support. If not set, LDAP check-box is not shown.
  577.  * - "set_use_ldap" : void (boolean) -- function to set the LDAP usage
  578.  *          and report errors in case of fails. Status will be rechecked
  579.  *          via "get_use_ldap". If not set, LDAP check-box is not shown.
  580.  * - "use_ldap_checkbox" : string -- label of the chcek box to set if LDAP
  581.  *          support is active.
  582.  * - "help" : string -- help to the widget. If not specified, generic help
  583.  *          is used (button labels are patched correctly)
  584.  * </pre>
  585.  * @return map the widget description map
  586.  */
  587. global map<string,any> CreateLdapWidget (map<string,any> settings) {
  588.     string help = "";
  589.     string use_ldap_checkbox
  590.     // check box
  591.     = settings["use_ldap_checkbox"]:_("&LDAP Support Active");
  592.     if (haskey (settings, "help"))
  593.     {
  594.     help = settings["help"]:"";
  595.     }
  596.     else
  597.     {
  598.     help = EnableLdapHelp ();
  599.     }
  600.  
  601.     // check box
  602.     term ldap_settings = `VBox (
  603.     `VSpacing (1),
  604.     `Left (`CheckBox (`id ("_cwm_use_ldap"),
  605.         `opt (`notify),
  606.         use_ldap_checkbox))
  607.     );
  608.  
  609.     if (! (haskey (settings, "get_use_ldap")
  610.     && haskey (settings, "set_use_ldap")
  611.     && ProductFeatures::GetFeature ("globals", "ui_mode") != "simple"))
  612.     {
  613.     ldap_settings = `VBox ();
  614.     help = "";
  615.     }
  616.  
  617.     map<string,any> ret = (map<string,any>)union (settings, $[
  618.     "widget" : `custom,
  619.     "custom_widget" : ldap_settings,
  620.     "help" : help,
  621.     "init" : LdapInitWrapper,
  622.     "handle" : LdapHandleWrapper,
  623.     "handle_events" : [ "_cwm_use_ldap" ],
  624.     ]);
  625.  
  626.     return ret;
  627. }
  628.  
  629. // EOF
  630. }
  631.