PageRenderTime 43ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/pulse2/web/modules/msc/includes/bundle_widgets.php

https://github.com/vmasilva/mmc
PHP | 411 lines | 351 code | 31 blank | 29 comment | 29 complexity | 3daa1cdfa1a7c0b68331504fdcad6b9c MD5 | raw file
Possible License(s): GPL-2.0
  1. <?
  2. /*
  3. * (c) 2004-2007 Linbox / Free&ALter Soft, http://linbox.com
  4. * (c) 2007 Mandriva, http://www.mandriva.com
  5. *
  6. * $Id$
  7. *
  8. * This file is part of Mandriva Management Console (MMC).
  9. *
  10. * MMC is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * MMC is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with MMC; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  23. */
  24. class RenderedMSCBundleChoice {
  25. function RenderedMSCBundleChoice() {
  26. $this->err = array();
  27. }
  28. function treatPost() {
  29. $members = isset($_POST["lmembers"]) ? unserialize(base64_decode($_POST["lmembers"])) : null;
  30. $nonmemb = isset($_POST["lnonmemb"]) ? unserialize(base64_decode($_POST["lnonmemb"])) : null;
  31. $this->list = isset($_POST["list"]) ? unserialize(base64_decode($_POST["list"])) : null;
  32. if (!is_array($this->list)) {
  33. $this->loadList();
  34. }
  35. if (isset($_POST["bdeluser_x"])) {
  36. if (isset($_POST["members"])) {
  37. foreach ($_POST["members"] as $member) {
  38. unset($members[$member]);
  39. }
  40. }
  41. } elseif (isset($_POST["badduser_x"])) {
  42. if (isset($_POST["nonmemb"])) {
  43. foreach ($_POST["nonmemb"] as $nm) {
  44. $members[$nm] = $this->list[$nm];
  45. }
  46. }
  47. } elseif (isset($_POST["bconfirm"])) {
  48. header("Location: " . urlStrRedirect($this->set_order_uri, array('list'=>base64_encode(serialize($this->list)))));
  49. } else {
  50. $members = array();
  51. $nonmemb = $this->list;
  52. }
  53. ksort($members);
  54. reset($members);
  55. ksort($nonmemb);
  56. $this->diff = array_diff_assoc($nonmemb, $members);
  57. natcasesort($this->diff);
  58. $this->members = $members;
  59. $this->nonmemb = $nonmemb;
  60. }
  61. function display_start() {
  62. ?>
  63. <form method="post">
  64. <input name='name' value='<?php echo $this->name ?>' type='hidden'/>
  65. <div id="grouplist">
  66. <table style="border: none;" cellspacing="0">
  67. <tr>
  68. <td style="border: none;">
  69. <div class="list">
  70. <h3><?php echo $this->title_left; ?></h3>
  71. <select multiple size="15" class="list" name="nonmemb[]">
  72. <?php
  73. foreach ($this->diff as $idx => $value) {
  74. print "<option value=\"".$idx."\">".$value."</option>\n";
  75. }
  76. ?>
  77. </select>
  78. <br/>
  79. </div>
  80. </td>
  81. <td style="border: none;">
  82. <div>
  83. <input type="image" name="bdeluser" style="padding: 5px;" src="img/common/icn_arrowleft.gif" value="<--" /><br/>
  84. <input type="image" name="badduser" style="padding: 5px;" src="img/common/icn_arrowright.gif" value = "-->"/>
  85. </div>
  86. </td>
  87. <td style="border: none;">
  88. <div class="list" style="padding-left: 10px;">
  89. <h3><?php echo $this->title_right; ?></h3>
  90. <select multiple size="15" class="list" name="members[]">
  91. <?php
  92. foreach ($this->members as $idx => $member) {
  93. if ($member == "") { unset($this->members[$idx]); continue; }
  94. echo "<option value=\"".$idx."\">".$member."</option>\n";
  95. }
  96. ?>
  97. </select>
  98. <br/>
  99. </div>
  100. <div class="clearer"></div>
  101. </td>
  102. </tr>
  103. </table>
  104. </div>
  105. <input type="hidden" name="lnonmemb" value="<?php echo base64_encode(serialize($this->nonmemb)); ?>" />
  106. <input type="hidden" name="lmembers" value="<?php echo base64_encode(serialize($this->members)); ?>" />
  107. <input type="hidden" name="list" value="<?php echo base64_encode(serialize($this->list)); ?>" />
  108. <?
  109. }
  110. function display_end() {
  111. ?>
  112. <input type="submit" name="bsort_bundle" class="btnPrimary" value="<?php echo _T("Set order", "msc"); ?>" />
  113. </form>
  114. <style type="text/css">
  115. <!--
  116. #grouplist
  117. {
  118. color: #666;
  119. background-color: #F0F4F7;
  120. border: solid 1px #CCC;
  121. padding: 10px 5px 5px 10px;
  122. margin: 0 5px 20px 0;
  123. width: 632px;
  124. }
  125. #grouplist div.list
  126. {
  127. float: left;
  128. }
  129. select.list
  130. {
  131. width: 250px;
  132. }
  133. -->
  134. </style>
  135. <?
  136. }
  137. function display_error() {
  138. if ($this->err) {
  139. new NotifyWidgetFailure(implode('<br/>', array_merge($this->err, array(_T("Please contact your administrator.", "msc")))));
  140. }
  141. }
  142. }
  143. class RenderedMSCBundleChoiceM extends RenderedMSCBundleChoice {
  144. function RenderedMSCBundleChoiceM($machine) {
  145. $this->machine = $machine;
  146. $this->title_right = _T('Actions in bundle', 'msc');
  147. $this->title_left = _T('Possible actions', 'msc');
  148. $this->treatPost();
  149. }
  150. function loadList() {
  151. $filter = array('machine'=>$this->machine->hostname, 'uuid'=>$this->machine->uuid);
  152. list($count, $packages) = advGetAllPackages($filter, 0, -1);
  153. $this->list = array();
  154. foreach ($packages as $c_package) {
  155. $p_api = new ServerAPI($c_package[2]);
  156. if ($c_package[0]['ERR'] && $c_package[0]['ERR'] == 'PULSE2ERROR_GETALLPACKAGE') {
  157. $this->err[] = sprintf(_T("MMC failed to contact package server %s.", "msc"), $c_package[0]['mirror']);
  158. } else {
  159. $this->list[$c_package[0]['id'].'##'.base64_encode(serialize($p_api->toURI()))] = $c_package[0]['label'] . " (" . $c_package[0]['version'] . ")";
  160. }
  161. }
  162. }
  163. function display() {
  164. parent::display_start();
  165. parent::display_end();
  166. parent::display_error();
  167. }
  168. }
  169. class RenderedMSCBundleChoiceG extends RenderedMSCBundleChoice {
  170. function RenderedMSCBundleChoiceG($group) {
  171. $this->group = $group;
  172. $this->title_right = _T('Actions in bundle', 'msc');
  173. $this->title_left = _T('Possible actions', 'msc');
  174. $this->treatPost();
  175. }
  176. function loadList() {
  177. $filter = array('group'=>$this->group->id);
  178. list($count, $packages) = advGetAllPackages($filter, 0, -1);
  179. $this->list = array();
  180. foreach ($packages as $c_package) {
  181. $p_api = new ServerAPI($c_package[2]);
  182. if ($c_package[0]['ERR'] && $c_package[0]['ERR'] == 'PULSE2ERROR_GETALLPACKAGE') {
  183. $this->err[] = sprintf(_T("MMC failed to contact package server %s.", "msc"), $c_package[0]['mirror']);
  184. } else {
  185. $this->list[$c_package[0]['id'].'##'.base64_encode(serialize($p_api->toURI()))] = $c_package[0]['label'] . " (" . $c_package[0]['version'] . ")";
  186. }
  187. }
  188. }
  189. function display() {
  190. parent::display_start();
  191. parent::display_end();
  192. parent::display_error();
  193. }
  194. }
  195. // SORT BUNDLE WIDGETS
  196. class RenderedMSCBundleSortParent {
  197. function RenderedMSCBundleSortParent() {
  198. $this->input_pre = 'si_';
  199. $this->buttons = array(
  200. array('blaunch_bundle', _T("Launch Bundle", "msc"), "btnPrimary")
  201. );
  202. }
  203. function initCount() {
  204. $this->count_members = count($this->members);
  205. $this->c = array();
  206. $i = 1;
  207. while ($i < $this->count_members+1) { $this->c[] = $i; $i+=1; }
  208. }
  209. function get_sort_order() {
  210. $orders = array();
  211. foreach ($_POST as $k => $v) {
  212. if (preg_match("/^".$this->input_pre."/", $k)) {
  213. $id_papi = base64_decode(preg_replace("/^".$this->input_pre."/", "", $k));
  214. list($id, $papid) = preg_split('/##/', $id_papi);
  215. $p_api = new ServerAPI();
  216. $p_api->fromURI(unserialize(base64_decode($papid)));
  217. $orders[$id_papi] = array($p_api, $id, $v);
  218. }
  219. }
  220. return $orders;
  221. }
  222. function check_sort_order($orders) { # check if order is valid (no loop, no jumps, ...)
  223. return True;
  224. }
  225. function display() {
  226. $orders = array();
  227. $i = 1;
  228. if ($_POST["badvanced_bundle"] != '') { # advanced mode: keep previously given order if possible
  229. foreach ($this->members as $pid => $plabel) {
  230. $orders[$pid] = $_POST[$this->input_pre.base64_encode($pid)];
  231. }
  232. } else { # standard mode: generate order
  233. foreach ($this->members as $pid => $plabel) {
  234. $orders[$pid] = $i;
  235. $i++;
  236. }
  237. }
  238. $this->display_ordered($orders);
  239. }
  240. function display_ordered($orders) {
  241. $f = new ValidatingForm();
  242. $f->push(new Table());
  243. foreach ($this->members as $pid => $plabel) {
  244. $select = new SelectItem($this->input_pre.base64_encode($pid));
  245. $select->setElements($this->c);
  246. $select->setElementsVal($this->c);
  247. $select->setSelected($orders[$pid]);
  248. $f->add(new TrFormElement($plabel, $select, array()));
  249. }
  250. foreach ($this->getHidden() as $w) {
  251. $f->add($w[0], $w[1]);
  252. }
  253. $this->display_options($f);
  254. $f->pop();
  255. foreach ($this->buttons as $b) {
  256. $f->addButton($b[0], $b[1], $b[2]);
  257. }
  258. $f->display();
  259. }
  260. }
  261. class RenderedMSCBundleSort extends RenderedMSCBundleSortParent {
  262. function RenderedMSCBundleSort() {
  263. parent::RenderedMSCBundleSortParent();
  264. $this->buttons []= array('badvanced_bundle', _T("Advanced launch bundle", "msc"), "btnPrimary");
  265. $this->buttons []= array('bcancel_bundle', _T("Cancel bundle creation", "msc"), "btnSecondary");
  266. }
  267. function display_options($f) {
  268. $f->add(new HiddenTpl("lmembers"), array("value" => base64_encode(serialize($this->members)), "hide" => True));
  269. $f->add(new HiddenTpl("create_directory"), array("value" => 'on', "hide" => True));
  270. $f->add(new HiddenTpl("start_script"), array("value" => 'on', "hide" => True));
  271. $f->add(new HiddenTpl("clean_on_success"), array("value" => 'on', "hide" => True));
  272. $f->add(new HiddenTpl("do_reboot"), array("value" => '', "hide" => True));
  273. $f->add(new HiddenTpl("bundle_title"), array("value" => get_new_bundle_title(count($this->members)),"hide" => True));
  274. $f->add(new HiddenTpl("next_connection_delay"), array("value" => web_def_delay(), "hide" => True));
  275. $f->add(new HiddenTpl("max_connection_attempt"), array("value" => web_def_attempts(), "hide" => True));
  276. $f->add(new HiddenTpl("maxbw"), array("value" => web_def_maxbw(), "hide" => True));
  277. $f->add(new HiddenTpl("copy_mode"), array("value" => web_def_mode(), "hide" => True));
  278. $f->add(new HiddenTpl("deployment_intervals"), array("value" => web_def_deployment_intervals(), "hide" => True));
  279. $halt = web_def_issue_halt_to();
  280. foreach ($halt as $h) {
  281. $f->add(new HiddenTpl("issue_halt_to_".$h), array("value" => 'on', "hide" => True));
  282. }
  283. $check = new TrFormElement(_T('awake', 'msc'), new CheckboxTpl("do_wol"));
  284. $f->add($check, array("value" => web_def_awake() ? "checked" : ""));
  285. $check = new TrFormElement(_T('invent.', 'msc'), new CheckboxTpl("do_inventory"));
  286. $f->add($check, array("value" => web_def_inventory() ? "checked" : ""));
  287. }
  288. }
  289. class RenderedMSCBundleSortM extends RenderedMSCBundleSort {
  290. function RenderedMSCBundleSortM($machine, $members) {
  291. parent::RenderedMSCBundleSort();
  292. $this->machine = $machine;
  293. $this->members = $members;
  294. $this->initCount();
  295. }
  296. function getHidden() {
  297. return array(
  298. array(new HiddenTpl("uuid"), array("value" => $this->machine->uuid, "hide" => True)),
  299. array(new HiddenTpl("hostname"), array("value" => $this->machine->hostname, "hide" => True))
  300. );
  301. }
  302. }
  303. class RenderedMSCBundleSortG extends RenderedMSCBundleSort {
  304. function RenderedMSCBundleSortG($group, $members) {
  305. parent::RenderedMSCBundleSort();
  306. $this->group = $group;
  307. $this->members = $members;
  308. $this->initCount();
  309. }
  310. function getHidden() {
  311. return array(array(new HiddenTpl("gid"), array("value" => $this->group->id, "hide" => True)));
  312. }
  313. }
  314. class RenderedMSCBundleSortAdv extends RenderedMSCBundleSortParent {
  315. function RenderedMSCBundleSortAdv() {
  316. parent::RenderedMSCBundleSortParent();
  317. }
  318. function display_options($f) {
  319. $f->add(new HiddenTpl("lmembers"), array("value" => base64_encode(serialize($this->members)), "hide" => True));
  320. $f->add(new TrFormElement(_T('Bundle title', 'msc'), new InputTpl('bundle_title')), array("value" => $_POST['bundle_title']));
  321. $f->add(new TrFormElement(_T('Wake on lan', 'msc'), new CheckboxTpl("do_wol")), array("value" => $_POST['do_wol'] == 'on' ? 'checked' : ''));
  322. $f->add(new TrFormElement(_T('Start the script', 'msc'), new CheckboxTpl("start_script")), array("value" => 'checked'));
  323. $f->add(new TrFormElement(_T('Delete files after a successful execution', 'msc'), new CheckboxTpl("clean_on_success")), array("value" => 'checked'));
  324. $f->add(new TrFormElement(_T('Start inventory', 'msc'), new CheckboxTpl("do_inventory")), array("value" => $_POST['do_inventory'] == 'on' ? 'checked' : ''));
  325. $f->add(new TrFormElement(_T('Halt client after', 'msc'), new CheckboxTpl("issue_halt_to_done", _T("done", "msc"))), array("value" => $_POST['issue_halt_to_done'] == 'on' ? 'checked' : ''));
  326. /*$f->add(new TrFormElement('', new CheckboxTpl("issue_halt_to_failed", _T("failed", "msc"))), array("value" => $_POST['issue_halt_to_failed'] == 'on' ? 'checked' : ''));
  327. $f->add(new TrFormElement('', new CheckboxTpl("issue_halt_to_over_time", _T("over time", "msc"))), array("value" => $_POST['issue_halt_to_over_time'] == 'on' ? 'checked' : ''));
  328. $f->add(new TrFormElement('', new CheckboxTpl("issue_halt_to_out_of_interval", _T("out of interval", "msc"))), array("value" => $_POST['issue_halt_to_out_of_interval'] == 'on' ? 'checked' : ''));*/
  329. $f->add(new TrFormElement(_T('Delay betwen connections (minutes)', 'msc'), new InputTpl("next_connection_delay")), array("value" => $_POST['next_connection_delay']));
  330. $f->add(new TrFormElement(_T('Maximum number of connection attempt', 'msc'), new InputTpl("max_connection_attempt")), array("value" => $_POST['max_connection_attempt']));
  331. $f->add(new TrFormElement(_T('Command parameters', 'msc'), new InputTpl('parameters')), array("value" => ''));
  332. $f->add(new TrFormElement(_T('Beginning of validity', 'msc'), new DynamicDateTpl('start_date')), array('ask_for_now' => 1));
  333. $f->add(new TrFormElement(_T('End of validity', 'msc'), new DynamicDateTpl('end_date')), array('ask_for_never' => 1));
  334. $f->add(new TrFormElement(_T('Deployment interval', 'msc'), new InputTpl('deployment_intervals')), array("value" => $_POST['deployment_intervals']));
  335. $f->add(new TrFormElement(_T('Max bandwidth (b/s)', 'msc'), new NumericInputTpl('maxbw')), array("value" => web_def_maxbw()));
  336. $f->add(new HiddenTpl("create_directory"), array("value" => 'on', "hide" => True));
  337. if (web_force_mode()) {
  338. $f->add(new HiddenTpl("copy_mode"), array("value" => web_def_mode(), "hide" => True));
  339. } else {
  340. $rb = new RadioTpl("copy_mode");
  341. $rb->setChoices(array(_T('push', 'msc'), _T('push / pull', 'msc')));
  342. $rb->setvalues(array('push', 'push_pull'));
  343. $rb->setSelected($_POST['copy_mode']);
  344. $f->add(new TrFormElement(_T('Copy Mode', 'msc'), $rb));
  345. }
  346. /* Only display local proxy button on a group and if allowed */
  347. if (isset($_GET['gid']) && strlen($_GET['gid']) && web_allow_local_proxy()) {
  348. $f->add(new TrFormElement(_T('Deploy using a local proxy', 'msc'),
  349. new CheckboxTpl("local_proxy")), array("value" => ''));
  350. }
  351. }
  352. }
  353. class RenderedMSCBundleSortAdvM extends RenderedMSCBundleSortAdv {
  354. function RenderedMSCBundleSortAdvM($machine, $members) {
  355. parent::RenderedMSCBundleSortAdv();
  356. $this->machine = $machine;
  357. $this->members = $members;
  358. $this->buttons []= array('bcancel_bundle', _T("Cancel bundle creation", "msc"), "btnSecondary");
  359. $this->initCount();
  360. }
  361. function getHidden() {
  362. return array(
  363. array(new HiddenTpl("uuid"), array("value" => $this->machine->uuid, "hide" => True)),
  364. array(new HiddenTpl("hostname"), array("value" => $this->machine->hostname, "hide" => True))
  365. );
  366. }
  367. }
  368. class RenderedMSCBundleSortAdvG extends RenderedMSCBundleSortAdv {
  369. function RenderedMSCBundleSortAdvG($group, $members) {
  370. parent::RenderedMSCBundleSortAdv();
  371. $this->group = $group;
  372. $this->members = $members;
  373. $this->buttons []= array('bcancel_bundle', _T("Cancel bundle creation", "msc"), "btnSecondary");
  374. $this->initCount();
  375. }
  376. function getHidden() {
  377. return array(array(new HiddenTpl("gid"), array("value" => $this->group->id, "hide" => True)));
  378. }
  379. }
  380. ?>