123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <?php
- # $Id$
- /**
- * class to handle add and edit in Cli
- *
- * extends the "Shell" class
- */
-
- class CliEdit extends Shell {
- public $handler_to_use = "";
- public $new = 0;
-
-
- /**
- * Execution method always used for tasks
- */
- public function execute() {
- if (empty($this->args)) {
- $this->__interactive();
- } else {
- $this->__handle_params();
- }
- }
-
- /**
- * non-interactive mode
- * read, check and handle all --* parameters
- * The list of allowed params is based on $handler->struct
- */
- private function __handle_params() {
- $handler = new $this->handler_to_use($this->new);
- $form_fields = $handler->getStruct();
- $id_field = $handler->getId_field();
-
- $values = array();
- $param_error = 0;
-
- foreach ($this->params as $key => $val) {
- $key = preg_replace('/^-/', '', $key); # allow --param, not only -param
- $key = str_replace('-', '_', $key); # allow --foo-bar even if field is named foo_bar
-
- if (isset($form_fields[$key]) && $form_fields[$key]['editable'] && $form_fields[$key]['display_in_form'] && $key != $id_field) {
- if ($form_fields[$key]['type'] == 'txtl') {
- $values[$key] = explode(',', $val);
- } elseif ($form_fields[$key]['type'] == 'bool') {
- if (strtolower($val) == 'y') {
- $val = 1;
- } # convert y to 1
- if (strtolower($val) == 'n') {
- $val = 0;
- } # convert n to 0
- $values[$key] = $val; # don't modify any other value - *Handler will complain if it's invalid ;-)
- } else {
- $values[$key] = $val;
- }
- } elseif ($key == 'webroot') {
- # always set, ignore
- } else { # not editable, unknown field etc.
- $param_error = 1;
- $this->err("invalid parameter --$key => $val");
- }
- }
-
- if ($param_error) {
- $this->_stop(1);
- }
-
- $this->__handle($this->args[0], $values);
- }
-
- /**
- * Interactive mode
- */
- private function __interactive() {
- $handler = new $this->handler_to_use($this->new);
-
- $form_fields = $handler->getStruct();
- $id_field = $handler->getId_field();
-
- $values[$id_field] = '';
- while ($form_fields[$id_field]['editable'] != 0) { # endlees loop - except if input is valid or id_field is not editable (like auto_increment)
- $question = $form_fields[$id_field]['label'] . ":";
- if ($form_fields[$id_field]['desc'] != '') {
- $question .= "\n(" . $form_fields[$id_field]['desc'] . ')';
- }
-
- $values[$id_field] = $this->in($form_fields[$id_field]['label'] . ':');
-
- if ($handler->init($values[$id_field])) {
- break;
- } else {
- $this->err($handler->errormsg);
- # always use a fresh handler to avoid problems with previous error messages
- $handler = new $this->handler_to_use($this->new);
- }
- }
-
- # update $form_fields (needed for example to display the correct allowed quota)
- # TODO: doesn't (always?) work - wrong time for the refresh?
- # $handler->set(array());
- $form_fields = $handler->getStruct();
-
- foreach ($form_fields as $key => $field) {
- if ($field['editable'] && $field['display_in_form'] && $key != $id_field) {
- while (0==0) { # endlees loop - except if input is valid
- $question = $field['label'] . ':';
- if ($field['desc'] != '') {
- $question .= "\n(" . $field['desc'] . ')';
- }
-
- if ($field['type'] == 'bool') {
- $values[$key] = $this->in($question, array('y', 'n'));
-
- if ($values[$key] == 'y') {
- $values[$key] = 1;
- } else {
- $values[$key] = 0;
- }
- } elseif ($field['type'] == 'enum') {
- $optiontxt = array();
- $optionlist = array();
-
- foreach ($field['options'] as $optionkey => $optionval) {
- // $this->in hates number 0
- $optionkey = $optionkey + 1;
- $optiontxt[] = '['.$optionkey.'] - '.$optionval;
- $optionlist[] = $optionkey;
- }
-
- $question .= "\n" . join("\n", $optiontxt) . "\n";
-
- $values[$key] = $this->in($question, $optionlist);
-
- $values[$key] = $field['options'][$values[$key]-1]; # convert int to option name
- } elseif ($field['type'] == 'txtl') {
- $values[$key] = array();
- $nextval = $this->in($question);
- while ($nextval != '') {
- if ($nextval != '') {
- $values[$key][] = $nextval;
- }
- $nextval = $this->in("");
- }
- } else {
- $values[$key] = $this->in($question);
- }
-
- if (is_null($values[$key])) { # TODO: insull() is probably obsoleted by change in Shell class
- echo "*** value of $key is NULL - this should not happen! ***";
- }
-
- if ($values[$key] == '' && (!$this->new)) { # edit mode
- unset($values[$key]); # empty input - don't change
- }
-
- # always use a fresh handler to avoid problems with previous error messages
- $handler = new $this->handler_to_use($this->new);
- $handler->init($values[$id_field]);
-
- $handler->set($values);
-
- if (isset($handler->errormsg[$key])) { # only check the errormessage for this field
- $this->err($handler->errormsg[$key]);
- } else {
- break;
- }
- } # end while
- } # end if $field[editable] etc.
- } # end foreach
-
- $this->__handle($values[$id_field], $values);
- }
-
- /**
- * (try to) store values
- */
- private function __handle($id, $values) {
- $handler = new $this->handler_to_use($this->new);
- if (!$handler->init($id)) {
- $this->err($handler->errormsg);
- return;
- }
-
- if (!$handler->set($values)) {
- $this->err($handler->errormsg);
- return;
- }
-
- if (!$handler->store()) {
- $this->err($handler->errormsg);
- } else {
- $this->out("");
- $this->out($handler->infomsg);
- $this->hr();
- }
- return;
- }
-
- /**
- * Displays help contents
- */
- public function help() {
- if ($this->new) {
- $cmd = 'add';
- $cmdtext = 'Adds';
- } else {
- $cmd = 'update';
- $cmdtext = 'Changes';
- }
-
- $module = preg_replace('/Handler$/', '', $this->handler_to_use);
- $module = strtolower($module);
-
- $this->out(
- "Usage:
-
- postfixadmin-cli $module $cmd
-
- $cmdtext $module in interactive mode.
-
- - or -
-
- postfixadmin-cli $module $cmd <address> --option value --option2 value [...]
-
- $cmdtext $module in non-interactive mode.
-
- Available options are:
- "
- );
-
- $handler = new $this->handler_to_use($this->new);
-
- $form_fields = $handler->getStruct();
- $id_field = $handler->getId_field();
-
- foreach ($form_fields as $key => $field) {
- if ($field['editable'] && $field['display_in_form'] && $key != $id_field) {
- $optkey = str_replace('_', '-', $key);
- $this->out(" --$optkey");
- $this->out(" " . $field['label']);
- if ($field['desc']) {
- $this->out(" " . $field['desc']);
- }
- $this->out("");
- }
- }
-
-
-
- $this->_stop();
- }
- }
- /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
|