Привет!
Я новичок, не программист и врятли кодганибудь им буду, просьба отнестись с понимаем..В 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 дуб но простые вещи то должны работать...
возможно не хватает прав
http://ru.php.net/manual/en/function.exec.php
изучи возвращаемые значения после выполнения
> возможно не хватает прав
> http://ru.php.net/manual/en/function.exec.php
> изучи возвращаемые значения после выполненияв том же каталоге, где лежит delele.php
создаю тестовый test.phptest.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 скрипт - папка на диске удаляется !
>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 запускать свои скрипты. Сильно надеюсь, что я неправильно вас понял
>>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 - загадка!
> почему тоже самое на работает в середине кода 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 ?>тоже будет отлично работать. Так понятнее ?