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 / include / iscsi-client / widgets.ycp < prev    next >
Text File  |  2006-11-29  |  16KB  |  457 lines

  1. {
  2.  textdomain "iscsi-client";
  3.  
  4.  boolean stat = false;
  5.  string curr_rec = "";
  6.  boolean bg_finish = false;
  7.  
  8.  
  9. // function for run command in background
  10. list <string> runInBg(string command){
  11.     bg_finish=false;
  12.     y2milestone("Start command %1 in background", command);
  13.     list <string> stdout = [];
  14.     integer return_code = nil;
  15.     boolean started = (boolean)SCR::Execute(.background.run_output_err, command);
  16.     if (!started) {
  17.         y2error("Cannot run command");
  18.     stat = false;
  19.         return [];
  20.     }
  21.     integer time_spent = 0;
  22.     boolean cont_loop = true;
  23.     integer script_time_out = 10000;
  24.     integer sleep_step = 20;
  25.     while (cont_loop && ((boolean) SCR::Read(.background.output_open))) {
  26.         if (time_spent >= script_time_out) {
  27.             Popup::Error(_("Command timed-out"));
  28.             cont_loop = false;
  29.         }
  30.         time_spent = time_spent + sleep_step;
  31.         sleep(sleep_step);
  32.     }
  33.     y2milestone("Time spent: %1 msec", time_spent);
  34.     stdout = (list<string>)(SCR::Read(.background.newout));
  35. //y2internal("stdout %1", stdout);
  36.     if (cont_loop) {
  37.     return_code = (integer) SCR::Read(.background.status);
  38.     if (return_code == 255) {
  39.         stat = false;
  40.         Popup::Error( ( (list<string>)SCR::Read(.background.newerr) )[0]:"" );
  41.         }
  42.         else stat = true;
  43.     }
  44.       else {
  45.         // killing the process if it still runs
  46.         if ((boolean) SCR::Read(.background.output_open)) SCR::Execute(.background.kill, "");
  47.     }
  48.  bg_finish=true;
  49.  return stdout;
  50. }
  51.  
  52. // validation for authentication dialog entry
  53. boolean checkAuthEntry(){
  54.  y2milestone("Check entries for authentication");
  55.  boolean ret = true;
  56.  boolean auth_none = (boolean) UI::QueryWidget(`id(`auth_none), `Value);
  57.  boolean auth_in = (boolean) UI::QueryWidget(`id(`auth_in), `Value);
  58.  boolean auth_out = (boolean) UI::QueryWidget(`id(`auth_out), `Value);
  59.  string user_in = tostring( UI::QueryWidget(`id(`user_in), `Value) );
  60.  string pass_in = tostring( UI::QueryWidget(`id(`pass_in), `Value) );
  61.  string user_out = tostring( UI::QueryWidget(`id(`user_out), `Value) );
  62.  string pass_out = tostring( UI::QueryWidget(`id(`pass_out), `Value) );
  63.  if (auth_none) return true;
  64.   else {
  65.    if  (auth_in){
  66.     if (size(user_in)==0) {
  67.      Popup::Error(_("Insert the username."));
  68.      UI::SetFocus(`id(`user_in));
  69.      return false;
  70.     }
  71.     if(size(pass_in)==0) {
  72.      Popup::Error(_("Insert the password."));
  73.      UI::SetFocus(`id(`pass_in));
  74.      return false;
  75.     }
  76.    }
  77.    if  (auth_out){
  78.     if (size(user_out)==0) {
  79.      Popup::Error(_("Insert the username."));
  80.      UI::SetFocus(`id(`user_out));
  81.      return false;
  82.     }
  83.     if(size(pass_out)==0) {
  84.      Popup::Error(_("Insert the password."));
  85.      UI::SetFocus(`id(`pass_out));
  86.      return false;
  87.     }
  88.    }
  89.   }
  90.  return ret;
  91. }
  92.  
  93.  
  94. // init table of connected sessions
  95. void initConnectedTable(string key){
  96.     if (IscsiClient::readSessions()== false) Popup::Error(_("Error While Connecting iscsid"));
  97.      integer row_current = (integer) UI::QueryWidget(`connected, `CurrentItem);
  98.      list <term> items = [];
  99.      integer row = 0;
  100.      foreach(string s, IscsiClient::sessions, {
  101.      list<string> row_in_string = splitstring(s, " ");
  102.     string record = deletechars(row_in_string[0]:"", "[]");
  103.     items = add(items, `item(`id(row), row_in_string[1]:"", row_in_string[2]:"", IscsiClient::getStartupStatus(record)));
  104.       row = row + 1;
  105.      });
  106.         UI::ChangeWidget (`id (`connected), `Items, items);
  107.     UI::ChangeWidget(`connected, `CurrentItem, row_current);
  108.         UI::SetFocus (`id (`connected));
  109. }
  110.  
  111. // get record identificator from selected row
  112. string getRecord(){
  113.  string record = "";
  114.  any sel_item = UI::QueryWidget(`id(`connected), `CurrentItem);
  115.  if (sel_item != nil){
  116.      integer current = tointeger(sel_item);
  117.      record = (splitstring(IscsiClient::sessions[current]:"", " " ))[0]:"";
  118.      record = deletechars(record, "[]");
  119.     }
  120.  return record;
  121. }
  122.  
  123. // handle for table of connected sessions
  124. symbol handleConnectedTable (string key, map event){
  125.  if (event["EventReason"]:"" == "Activated"){
  126.  string record = "";
  127.  switch((symbol)event["ID"]:nil){
  128.   case(`add):
  129.         // add a new target, discovery
  130.         // goto DiscAuthDialog("client")) ()
  131.         y2milestone("Goto dicovered authentication dialog");
  132.         return `add;
  133.   case(`del):
  134.         // delete (logout from) connected target
  135.         record = getRecord();
  136.         if (size( record )>0){
  137.           if (Popup::ContinueCancel(_("Really log out from the selected target?")))
  138.             if ( !(IscsiClient::deleteRecord( record )) ) Popup::Error(_("Error occurred while logging out from the selected target."));
  139.             else {
  140.                 y2milestone("Delete record %1", record);
  141.                 initConnectedTable("");
  142.                  }
  143.         } else Popup::Error(_("No record found."));
  144.         break;
  145.   case(`toggle):
  146.         // change manual/automatic status of connected target
  147.         record = getRecord();
  148.         if (size( record )>0){
  149.         y2milestone("toggle record %1", record);
  150.         string startup = IscsiClient::getStartupStatus(record);
  151.         if (size(startup)>0){
  152.          if (startup == "manual"){
  153.                  y2milestone("Change status for %1 to %2", record, "automatic");
  154.                  IscsiClient::setStartupStatus(record, "automatic");
  155.                 }
  156.             else {
  157.                 y2milestone("Change status for %1 to %2", record, "manual");
  158.                 IscsiClient::setStartupStatus(record, "manual");
  159.                  }
  160.           initConnectedTable("");
  161.          }
  162.         } else Popup::Error(_("No record found."));
  163.         break;
  164.   }
  165.  }
  166.  // if nothing selected - disable some buttons, otherwise enable them
  167.  if( getRecord() == ""){
  168.    UI::ChangeWidget (`id (`del), `Enabled, false);
  169.    UI::ChangeWidget (`id (`toggle), `Enabled, false);
  170.  
  171.   } else {
  172.    UI::ChangeWidget (`id (`del), `Enabled, true);
  173.    UI::ChangeWidget (`id (`toggle), `Enabled, true);
  174.  
  175.     }
  176.  return nil;
  177. }
  178.  
  179. // ***************** add table ***************************
  180.  
  181. // set incoming widget status
  182. void setAuthIn(boolean status){
  183.  UI::ChangeWidget(`id(`user_in),`Enabled, status );
  184.  UI::ChangeWidget(`id(`pass_in),`Enabled, status );
  185.  UI::ChangeWidget(`id(`auth_in),`Value, status );
  186.  if(status) UI::ChangeWidget(`id(`auth_none),`Value, !status );
  187. }
  188.  
  189. // set outgoing widget status
  190. void setAuthOut(boolean status){
  191.  UI::ChangeWidget(`id(`user_out),`Enabled, status );
  192.  UI::ChangeWidget(`id(`pass_out),`Enabled, status );
  193.  UI::ChangeWidget(`id(`auth_out),`Value, status );
  194.  if(status) UI::ChangeWidget(`id(`auth_none),`Value, !status );
  195. }
  196.  
  197. // disable both incoming and outgoing
  198. void initDiscAuth(string key){
  199.  setAuthIn(false);
  200.  setAuthOut(false);
  201. }
  202.  
  203. void initConnAuth(string key){
  204.  setAuthIn(false);
  205.  setAuthOut(false);
  206.  map<string, any> auth = IscsiClient::getNode(curr_rec);
  207.  if (size(auth)>0)
  208.   {
  209. //   y2internal("%1", auth);
  210.     UI::ChangeWidget(`id(`user_in),`Value, auth["username_in"]:"" );
  211.     UI::ChangeWidget(`id(`pass_in),`Value, auth["password_in"]:"" );
  212.    if ((size(auth["username_in"]:"")>0)&&(size(auth["password_in"]:"")>0)) setAuthOut(true);
  213.    UI::ChangeWidget(`id(`user_out),`Value, auth["username"]:"" );
  214.    UI::ChangeWidget(`id(`pass_out),`Value, auth["password"]:"" );
  215.    if ((size(auth["username"]:"")>0)&&(size(auth["password"]:"")>0)) setAuthOut(true);
  216.   }
  217. }
  218. // handle for enable/disable widgets in authentication dialog
  219. symbol handleDiscAuth(string key, map event){
  220.  if (event["EventReason"]:"" == "ValueChanged"){
  221.  boolean status = false;
  222.  switch((symbol)event["ID"]:nil){
  223.   case(`auth_none):
  224.         status = (boolean)UI::QueryWidget(`id(`auth_none), `Value);
  225.         setAuthIn(!status);
  226.         setAuthOut(!status);
  227.         break;
  228.   case(`auth_in):
  229.         status = (boolean)UI::QueryWidget(`id(`auth_in), `Value);
  230.         setAuthIn(status);
  231.         break;
  232.   case(`auth_out):
  233.         status = (boolean)UI::QueryWidget(`id(`auth_out), `Value);
  234.         setAuthOut(status);
  235.         break;
  236.   }
  237.  }
  238.  return nil;
  239. }
  240.  
  241. boolean validateDiscAuth(string key, map event){
  242.  return checkAuthEntry();
  243. }
  244. // *******************Server Location ***********************
  245.  
  246. // do discovery to selected portal
  247. boolean validateServerLocation(string key, map event){
  248.  boolean ret = true;
  249.  string ip = tostring(UI::QueryWidget(`hostname, `Value));
  250.  string port = tostring(UI::QueryWidget(`port, `Value));
  251.  // validate IP address
  252.  if (size(ip)==0) {
  253.         Popup::Error(_("Insert the IP address."));
  254.         UI::SetFocus(`hostname);
  255.         return false;
  256.         }
  257.  // validate port number
  258.  if (size(port)==0) {
  259.         Popup::Error(_("Insert the port."));
  260.         UI::SetFocus(`port);
  261.         return false;
  262.         }
  263.  // store old config
  264.  IscsiClient::getConfig();
  265.  
  266.  boolean auth_none = (boolean) UI::QueryWidget(`id(`auth_none), `Value);
  267.  boolean auth_in = (boolean) UI::QueryWidget(`id(`auth_in), `Value);
  268.  boolean auth_out = (boolean) UI::QueryWidget(`id(`auth_out), `Value);
  269.  string user_in = tostring( UI::QueryWidget(`id(`user_in), `Value) );
  270.  string pass_in = tostring( UI::QueryWidget(`id(`pass_in), `Value) );
  271.  string user_out = tostring( UI::QueryWidget(`id(`user_out), `Value) );
  272.  string pass_out = tostring( UI::QueryWidget(`id(`pass_out), `Value) );
  273.  
  274.  if (auth_none){
  275.   user_in  = "";
  276.   pass_in  = "";
  277.   user_out = "";
  278.   pass_out = "";
  279.  }
  280.  if (!auth_in){
  281.   user_in  = "";
  282.   pass_in  = "";
  283.  }
  284.  if (!auth_out){
  285.   user_out  = "";
  286.   pass_out  = "";
  287.  }
  288.  
  289.  // write authentication data
  290.  IscsiClient::saveConfig(user_in, pass_in, user_out, pass_out);
  291.  
  292.  bg_finish=false;
  293.  // discovery with authentication
  294.  IscsiClient::targets = runInBg( sformat("iscsiadm -m discovery -t st -p %1:%2", ip, port) );
  295.  while(!bg_finish){};
  296.  // restore old config
  297.  IscsiClient::oldConfig();
  298.  
  299.  return stat;
  300. }
  301.  
  302.  
  303. // ********************* discovered table *******************
  304.  
  305. // enable [ connect, delete ] buttons only for not connected items
  306. boolean setDiscoveredButtons(){
  307.    list <string> params = [];
  308.    any selected = UI::QueryWidget(`discovered, `CurrentItem);
  309.    if (selected != nil) { params = splitstring( IscsiClient::discovered[tointeger(selected)]:"", " " ); }
  310.         else  { params = []; }
  311.  if ((params==[])||(IscsiClient::connected( deletechars(params[0]:"", "[]") ))){
  312.    UI::ChangeWidget (`id (`connect), `Enabled, false);
  313.    UI::ChangeWidget (`id (`delete), `Enabled, false);
  314.   } else{
  315.        UI::ChangeWidget (`id (`connect), `Enabled, true);
  316.        UI::ChangeWidget (`id (`delete), `Enabled, true);
  317.     }
  318. }
  319.  
  320. // initialize widget with discovered targets
  321. void initDiscoveredTable(string key){
  322.      list <term> items = [];
  323.      integer row = 0;
  324.      foreach(string s, IscsiClient::getDiscovered(), {
  325.      list<string> row_in_string = splitstring(s, " ");
  326. //        string record = deletechars(row_in_string[0]:"", "[]");
  327.         items = add(items, `item(`id(row), row_in_string[1]:"", row_in_string[2]:"", 
  328.         (IscsiClient::connected( deletechars(row_in_string[0]:"", "[]") ))?_("True"):_("False") ));
  329.       row = row + 1;
  330.      });
  331.  
  332.   UI::ChangeWidget (`id (`discovered), `Items, items);
  333.   UI::SetFocus (`id (`discovered));
  334.   setDiscoveredButtons();
  335. }
  336.  
  337. // handling widget with discovered targets
  338. symbol handleDiscoveredTable (string key, map event){
  339.    list <string> params = [];
  340.    any selected = UI::QueryWidget(`discovered, `CurrentItem);
  341.    if (selected != nil) { params = splitstring( IscsiClient::discovered[tointeger(selected)]:"", " " ); }
  342.     else  { params = []; }
  343.    curr_rec = deletechars(params[0]:"", "[]");
  344.  if ( event["EventReason"]:"" == "Activated" ){
  345.   // connect new target
  346.   if ( event["ID"]:nil == `connect) {
  347.    // check if not already connected
  348.    if ( IscsiClient::connected( curr_rec ) == true){
  349.      Popup::Error(_("The target is already connected."));
  350.      return nil;
  351.     }
  352.    // goto ConnAuthDialog("discovered") (initDiscAuth)
  353.    return `conn;
  354.   }
  355.   // discovery target ConnAuthDialog("client") (initDiscAuth)
  356.   if ( event["ID"]:nil == `discovery) {
  357.    return `disc;
  358.   }
  359.   // delete connected item
  360.   if ( event["ID"]:nil == `delete) {
  361.    if ((params == [])||(!IscsiClient::connected( curr_rec ))){
  362.      SCR::Execute (.target.bash_output,sformat("iscsiadm -m node -r %1 --op=delete", deletechars(params[0]:"", "[]")), $[] );
  363.      IscsiClient::readSessions();
  364.      initDiscoveredTable("");
  365.    if (selected != nil) { params = splitstring( IscsiClient::discovered[tointeger(selected)]:"", " " ); }
  366.         else  { params = []; }
  367.     }
  368.   }
  369.  }
  370.  setDiscoveredButtons();
  371.  return nil;
  372. }
  373.  
  374. //******************* target table *************************
  375.  
  376. // initialize dialog for all targets from portal (connected/disconnected)
  377. void initTargetTable(string key){
  378.      list <term> items = [];
  379.      integer row = 0;
  380.      foreach(string s, IscsiClient::targets, {
  381.      list<string> row_in_string = splitstring(s, " ");
  382.         string record = deletechars(row_in_string[0]:"", "[]");
  383.         items = add(items, `item(`id(row), row_in_string[1]:"", row_in_string[2]:"",
  384.         (IscsiClient::connected( record ))?_("True"):_("False") ));
  385.       row = row + 1;
  386.      });
  387.         UI::ChangeWidget (`id (`targets), `Items, items);
  388.         UI::SetFocus (`id (`targets));
  389. }
  390.  
  391. // handle dialog for all targets from portal (connected/disconnected) - only connect button ;)
  392. symbol handleTargetTable (string key, map event){
  393.  //enable/disable connect button according target is or not already connected
  394.  list <term> items =(list <term>)UI::QueryWidget(`targets, `Items);
  395.  if ((items[(integer)UI::QueryWidget(`targets, `CurrentItem)]:nil)[3]:"" == _("True")) UI::ChangeWidget(`connect, `Enabled, false);
  396.     else UI::ChangeWidget(`connect, `Enabled, true);
  397.  
  398.  
  399.  if ( event["EventReason"]:"" == "Activated" ){
  400.   if ( event["ID"]:nil == `connect) {
  401.    // check if is not already connected
  402.    list <string> params = splitstring( IscsiClient::targets[(integer)UI::QueryWidget(`targets, `CurrentItem)]:"", " " );
  403.    if ( IscsiClient::connected( deletechars(params[0]:"", "[]") ) == true){
  404.     Popup::Error(_("The target is already connected."));
  405.    } else {
  406.      curr_rec = deletechars(params[0]:"", "[]");
  407.     // goto ConnAuthDialog("discovered") (initDiscAuth())
  408.      return `conn_auth;
  409.     }
  410.   }
  411.  }
  412.  return nil;
  413. }
  414.  
  415. //***************** connection autentication *******************
  416.  
  417. // login to target with authentication
  418. global boolean validateConnAuth(string key, map event){
  419.  boolean ret = true;
  420.  boolean auth_none = (boolean) UI::QueryWidget(`id(`auth_none), `Value);
  421.  boolean auth_in = (boolean) UI::QueryWidget(`id(`auth_in), `Value);
  422.  boolean auth_out = (boolean) UI::QueryWidget(`id(`auth_out), `Value);
  423.  string user_in = tostring( UI::QueryWidget(`id(`user_in), `Value) );
  424.  string pass_in = tostring( UI::QueryWidget(`id(`pass_in), `Value) );
  425.  string user_out = tostring( UI::QueryWidget(`id(`user_out), `Value) );
  426.  string pass_out = tostring( UI::QueryWidget(`id(`pass_out), `Value) );
  427.  
  428.  if (!auth_none){
  429.   if(!checkAuthEntry()) return false;
  430.  
  431.   if (auth_in){
  432.    IscsiClient::setValue(curr_rec, "node.session.auth.username_in", user_in);
  433.    IscsiClient::setValue(curr_rec, "node.session.auth.password_in", pass_in);
  434.   } else{
  435.        IscsiClient::setValue(curr_rec, "node.session.auth.username_in", "");
  436.        IscsiClient::setValue(curr_rec, "node.session.auth.password_in", "");
  437.    }
  438.   if (auth_out){
  439.    IscsiClient::setValue(curr_rec, "node.session.auth.username", user_out);
  440.    IscsiClient::setValue(curr_rec, "node.session.auth.password", pass_out);
  441.    IscsiClient::setValue(curr_rec, "node.session.auth.authmethod", "CHAP");
  442.   } else {
  443.        IscsiClient::setValue(curr_rec, "node.session.auth.username", "");
  444.        IscsiClient::setValue(curr_rec, "node.session.auth.password", "");
  445.        IscsiClient::setValue(curr_rec, "node.session.auth.authmethod", "");
  446.     }
  447.  } else IscsiClient::setValue(curr_rec, "node.session.auth.authmethod", "None");
  448.  
  449.   runInBg(sformat("iscsiadm -m node -r %1 --login", curr_rec));
  450.   if(!stat) ret = false;
  451.   if (ret) IscsiClient::readSessions();
  452.  return ret;
  453. }
  454.  
  455.  
  456. }
  457.