URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7014
[ Назад ]

Исходное сообщение
"PHP код не выполняет perl скрипт "

Отправлено kostya_rlw , 08-Окт-10 13:08 
Привет!
Я новичок, не программист и врятли кодганибудь им буду, просьба отнестись с понимаем..

В PHP полез потому что хочу кое что подправить в существующем коде.

Есть такой продукт на PHP -  PostfixAdmin - для управления почтовым сервером. В нем создаются\удадяются аккаунты и проч.
Я хочу подправить оду вещь там. По умолчанию когда в PostfixAdmin удаляется аккаунт, то сам почтовый ящик с HDD не удаляется. Но есть скрипт на Perl коотрый это делает, он отлично работает.
   Я пытаюсь запустить этот Perl скрипт из PHP сразу полсе дого как PostfixAdmin удаяет аккаунт из БД.

Деляю это так:

1. Объявляю переменную:  
   43  $my_del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");

2. Запускаю ее после того места когда удяляется запись из БД:
   149              echo $my_del;
  

Но удаления не происходит!

Для тестов поставил еще такую конструкцию:

    44  $my_touch = exec ("/usr/local/bin/sudo -u postfix touch /tmp/file.202");
   150              echo $my_touch;

Она выполняется - т.е. файл создается!!


оригинальный код (с моими вставками: 43, 149, 44, 150):

delete.php

  
     1  <?php
     2  /**
     3   * Postfix Admin
     4   *
     5   * LICENSE
     6   * This source file is subject to the GPL license that is bundled with
     7   * this package in the file LICENSE.TXT.
     8   *
     9   * Further details on the project are available at :
    10   *     http://www.postfixadmin.com or http://postfixadmin.sf.net
    11   *
    12   * @version $Id: delete.php 853 2010-08-02 20:50:29Z christian_boltz $
    13   * @license GNU GPL v2 or later.
    14   *
    15   * File: delete.php
    16   * Used to delete admins, domains, mailboxes and aliases.
    17   * Note: if a domain is deleted, all mailboxes and aliases belonging
    18   * to the domain are also removed.
    19   *
    20   * Template File: message.php
    21   *
    22   * Template Variables:
    23   *
    24   * tMessage
    25   *
    26   * Form POST \ GET Variables:
    27   *
    28   * fTable
    29   * fDelete
    30   * fDomain
    31   */
    32
    33  require_once('common.php');
    34
    35  authentication_require_role('admin');
    36
    37  $SESSID_USERNAME = authentication_get_username();
    38  $error = 0;
    39
    40  $fTable  = escape_string (safeget('table') ); # see the if blocks below for valid values
    41  $fDelete = escape_string (safeget('delete'));
    42  $fDomain = escape_string (safeget('domain'));
    43  $my_del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");
    44  $my_touch = exec ("/usr/local/bin/sudo -u postfix touch /tmp/file.202");
    45  $error=0;
    46
    47  if ($fTable == "admin")
    48  {
    49      authentication_require_role('global-admin');
    50      $fWhere = 'username';
    51      $result_admin = db_delete ($table_admin,$fWhere,$fDelete);
    52      $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete);
    53
    54      if (!($result_admin == 1) and ($result_domain_admins >= 0))
    55      {
    56          $error = 1;
    57          $tMessage = $PALANG['pAdminDelete_admin_error'];
    58      }
    59      else
    60      {
    61          $url = "list-admin.php";
    62          header ("Location: $url");
    63      }
    64  } # ($fTable == "admin")
    65  elseif ($fTable == "domain")
    66  {
    67      authentication_require_role('global-admin');
    68      $fWhere = 'domain';
    69      $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete);
    70      $result_alias = db_delete ($table_alias,$fWhere,$fDelete);
    71      $result_mailbox = db_delete ($table_mailbox,$fWhere,$fDelete);
    72      $result_alias_domain = db_delete($table_alias_domain,'alias_domain',$fDelete);
    73      $result_log = db_delete ($table_log,$fWhere,$fDelete);
    74      if ($CONF['vacation'] == "YES")
    75      {
    76          $result_vacation = db_delete ($table_vacation,$fWhere,$fDelete);
    77      }
    78      $result_domain = db_delete ($table_domain,$fWhere,$fDelete);
    79
    80      if (!$result_domain || !domain_postdeletion($fDelete))
    81      {
    82          $error = 1;
    83          $tMessage = $PALANG['pAdminDelete_domain_error'];
    84      }
    85      else
    86      {
    87          $url = "list-domain.php";
    88          header ("Location: $url");
    89      }
    90  } # ($fTable == "domain")
    91  elseif ($fTable == "alias_domain")
    92  {
    93      authentication_require_role('global-admin');
    94      $table_domain_alias = table_by_key('alias_domain');
    95      $fWhere = 'alias_domain';
    96      $fDelete = $fDomain;
    97      if(db_delete($table_domain_alias,$fWhere,$fDelete)) {
    98          $url = "list-domain.php";
    99          header ("Location: $url");
   100      }
   101  } # ($fTable == "alias_domain")
   102
   103  elseif ($fTable == "alias" or $fTable == "mailbox")
   104  {
   105
   106      if (!check_owner ($SESSID_USERNAME, $fDomain))
   107      {
   108          $error = 1;
   109          $tMessage = $PALANG['pDelete_domain_error'] . "<b>$fDomain</b>!</span>";
   110      }
   111      elseif (!check_alias_owner ($SESSID_USERNAME, $fDelete))
   112      {
   113          $error = 1;
   114          $tMessage = $PALANG['pDelete_alias_error'] . "<b>$fDelete</b>!</span>";
   115      }
   116      else
   117      {
   118          if ($CONF['database_type'] == "pgsql") db_query('BEGIN');
   119          /* there may be no aliases to delete */
   120          $result = db_query("SELECT * FROM $table_alias WHERE address = '$fDelete' AND domain = '$fDomain'");
   121          if($result['rows'] == 1) {
   122              $result = db_query ("DELETE FROM $table_alias WHERE address='$fDelete' AND domain='$fDomain'");
   123              db_log ($SESSID_USERNAME, $fDomain, 'delete_alias', $fDelete);
   124          }
   125
   126          /* is there a mailbox? if do delete it from orbit; it's the only way to be sure */
   127          $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'");
   128          if ($result['rows'] == 1)
   129          {
   130              $result = db_query ("DELETE FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'");
   131
   132              $postdel_res=mailbox_postdeletion($fDelete,$fDomain);
   133              if ($result['rows'] != 1 || !$postdel_res)
   134              {
   135                  $error = 1;
   136                  $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> (";
   137                  if ($result['rows']!=1)
   138                  {
   139                      $tMessage.='mailbox';
   140                      if (!$postdel_res) $tMessage.=', ';
   141                  }
   142                  if (!$postdel_res)
   143                  {
   144                      $tMessage.='post-deletion';
   145                  }
   146                  $tMessage.=')</span>';
   147
   148              }
   149              echo $my_del;
   150              echo $my_touch;
   151              db_log ($SESSID_USERNAME, $fDomain, 'delete_mailbox', $fDelete);
   152              $result = db_query("SELECT * FROM $table_quota WHERE username='$fDelete'");
   153              if($result['rows'] >= 1) {
   154                  db_query ("DELETE FROM $table_quota WHERE username='$fDelete'");
   155              }
   156              $result = db_query("SELECT * FROM $table_quota2 WHERE username='$fDelete'");
   157              if($result['rows'] == 1) {
   158                  db_query ("DELETE FROM $table_quota2 WHERE username='$fDelete'");
   159              }
   160          }
   161          $result = db_query("SELECT * FROM $table_vacation WHERE email = '$fDelete' AND domain = '$fDomain'");
   162          if($result['rows'] == 1) {
   163              db_query ("DELETE FROM $table_vacation WHERE email='$fDelete' AND domain='$fDomain'");
   164              db_query ("DELETE FROM $table_vacation_notification WHERE on_vacation ='$fDelete' "); /* should be caught by cascade, if PgSQL */
   165          }
   166
   167      }
   168
   169      if ($error != 1)
   170      {
   171          if ($CONF['database_type'] == "pgsql") db_query('COMMIT');
   172          header ("Location: list-virtual.php?domain=$fDomain");
   173          exit;
   174      } else {
   175          $tMessage .= $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> (physical mail)!</span>";
   176          if ($CONF['database_type'] == "pgsql") db_query('ROLLBACK');
   177      }
   178  }
   179  else
   180  {
   181      flash_error($PALANG['invalid_parameter']);
   182  }
   183
   184
   185  include ("templates/header.php");
   186  include ("templates/menu.php");
   187  include ("templates/message.php");
   188  include ("templates/footer.php");
   189
   190  /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
   191  ?>


--- При этом если создаю отдельный тестовый файл ----


test.php


     1  <?php
     2  $del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");
     3  echo $del;
     4  ?>
    


то он выполняется !! ящики удаляются
Получается, что это код именно PostfixAdmin где блокирует выполнение perl ?
Может где что какая то функция это блокирует?    


Логически напрашивается вывод что гдето в коде PastfixAdmin-a стоим блокировка или что то еще..

Помогите плз разобраться, я PHP дуб но простые вещи то должны работать...


Содержание

Сообщения в этом обсуждении
"PHP код не выполняет perl скрипт "
Отправлено Pahanivo , 08-Окт-10 13:26 
возможно не хватает прав
http://ru.php.net/manual/en/function.exec.php
изучи возвращаемые значения после выполнения


"PHP код не выполняет perl скрипт "
Отправлено kostya_rlw , 08-Окт-10 13:30 
> возможно не хватает прав
> http://ru.php.net/manual/en/function.exec.php
> изучи возвращаемые значения после выполнения

в том же каталоге, где лежит delele.php
создаю тестовый test.php

test.php


     1  <?php
     2  $del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");
     3  echo $del;
     4  ?>
    


вызваю его браузером - от отрабатыват Perl скрипт - папка на диске удаляется !


"PHP код не выполняет perl скрипт "
Отправлено TyLLIKAH , 08-Окт-10 14:30 
>1. Объявляю переменную:  
>   43  $my_del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data->dist/mailadmin/ADDITIONS/cleanupdirs.pl");
>2. Запускаю ее после того места когда удяляется запись из БД:
>   149              echo $my_del;

Глупость, конечно. Но предположу: у меня создалось впечатление из ваших объяснений, что вы пытаетесь командой echo запускать свои скрипты. Сильно надеюсь, что я неправильно вас понял


"PHP код не выполняет perl скрипт "
Отправлено kostya_rlw , 08-Окт-10 14:50 
>>1. Объявляю переменную:  
>>   43  $my_del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data->dist/mailadmin/ADDITIONS/cleanupdirs.pl");
>>2. Запускаю ее после того места когда удяляется запись из БД:
>>   149              echo $my_del;
> Глупость, конечно. Но предположу: у меня создалось впечатление из ваших объяснений, что
> вы пытаетесь командой echo запускать свои скрипты. Сильно надеюсь, что я
> неправильно вас понял

Вот так отлbчно работает:

тестовый test.php

     1  <?php
     2  $del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");
     3  echo $del;
     4  ?>


почему тоже самое на работает в середине кода PostfixAdmin - загадка!


"PHP код не выполняет perl скрипт "
Отправлено TyLLIKAH , 08-Окт-10 15:03 
> почему тоже самое на работает в середине кода PostfixAdmin - загадка!

Команда echo выводит код, возвращённый командой exec и всё. Команда exec выполняется не в 149й строке, а в 43й.

т.е.  
1  <?php
2  $del = exec ("/usr/local/bin/sudo -u postfix /usr/bin/perl /usr/local/www/data-dist/mailadmin/ADDITIONS/cleanupdirs.pl");
3  ?>

тоже будет отлично работать. Так понятнее ?