Mercurial > hg > rc1
comparison vendor/pear/crypt_gpg/Crypt/GPG/ProcessControl.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
| author | Charlie Root |
|---|---|
| date | Thu, 04 Jan 2018 15:50:29 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1e000243b222 |
|---|---|
| 1 <?php | |
| 2 | |
| 3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ | |
| 4 | |
| 5 /** | |
| 6 * A class for monitoring and terminating processes | |
| 7 * | |
| 8 * PHP version 5 | |
| 9 * | |
| 10 * LICENSE: | |
| 11 * | |
| 12 * This library is free software; you can redistribute it and/or modify | |
| 13 * it under the terms of the GNU Lesser General Public License as | |
| 14 * published by the Free Software Foundation; either version 2.1 of the | |
| 15 * License, or (at your option) any later version. | |
| 16 * | |
| 17 * This library is distributed in the hope that it will be useful, | |
| 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 20 * Lesser General Public License for more details. | |
| 21 * | |
| 22 * You should have received a copy of the GNU Lesser General Public | |
| 23 * License along with this library; if not, see | |
| 24 * <http://www.gnu.org/licenses/> | |
| 25 * | |
| 26 * @category Encryption | |
| 27 * @package Crypt_GPG | |
| 28 * @author Michael Gauthier <mike@silverorange.com> | |
| 29 * @copyright 2013 silverorange | |
| 30 * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 | |
| 31 * @link http://pear.php.net/package/Crypt_GPG | |
| 32 */ | |
| 33 | |
| 34 // {{{ class Crypt_GPG_ProcessControl | |
| 35 | |
| 36 /** | |
| 37 * A class for monitoring and terminating processes by PID | |
| 38 * | |
| 39 * This is used to safely terminate the gpg-agent for GnuPG 2.x. This class | |
| 40 * is limited in its abilities and can only check if a PID is running and | |
| 41 * send a PID SIGTERM. | |
| 42 * | |
| 43 * @category Encryption | |
| 44 * @package Crypt_GPG | |
| 45 * @author Michael Gauthier <mike@silverorange.com> | |
| 46 * @copyright 2013 silverorange | |
| 47 * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 | |
| 48 * @link http://pear.php.net/package/Crypt_GPG | |
| 49 */ | |
| 50 class Crypt_GPG_ProcessControl | |
| 51 { | |
| 52 // {{{ protected properties | |
| 53 | |
| 54 /** | |
| 55 * The PID (process identifier) being monitored | |
| 56 * | |
| 57 * @var integer | |
| 58 */ | |
| 59 protected $pid; | |
| 60 | |
| 61 // }}} | |
| 62 // {{{ __construct() | |
| 63 | |
| 64 /** | |
| 65 * Creates a new process controller from the given PID (process identifier) | |
| 66 * | |
| 67 * @param integer $pid the PID (process identifier). | |
| 68 */ | |
| 69 public function __construct($pid) | |
| 70 { | |
| 71 $this->pid = $pid; | |
| 72 } | |
| 73 | |
| 74 // }}} | |
| 75 // {{{ public function getPid() | |
| 76 | |
| 77 /** | |
| 78 * Gets the PID (process identifier) being controlled | |
| 79 * | |
| 80 * @return integer the PID being controlled. | |
| 81 */ | |
| 82 public function getPid() | |
| 83 { | |
| 84 return $this->pid; | |
| 85 } | |
| 86 | |
| 87 // }}} | |
| 88 // {{{ isRunning() | |
| 89 | |
| 90 /** | |
| 91 * Checks if the process is running | |
| 92 * | |
| 93 * If the <kbd>posix</kbd> extension is available, <kbd>posix_getpgid()</kbd> | |
| 94 * is used. Otherwise <kbd>ps</kbd> is used on UNIX-like systems and | |
| 95 * <kbd>tasklist</kbd> on Windows. | |
| 96 * | |
| 97 * @return boolean true if the process is running, false if not. | |
| 98 */ | |
| 99 public function isRunning() | |
| 100 { | |
| 101 $running = false; | |
| 102 | |
| 103 if (function_exists('posix_getpgid')) { | |
| 104 $running = false !== posix_getpgid($this->pid); | |
| 105 } elseif (PHP_OS === 'WINNT') { | |
| 106 $command = 'tasklist /fo csv /nh /fi ' | |
| 107 . escapeshellarg('PID eq ' . $this->pid); | |
| 108 | |
| 109 $result = exec($command); | |
| 110 $parts = explode(',', $result); | |
| 111 $running = (count($parts) > 1 && trim($parts[1], '"') == $this->pid); | |
| 112 } else { | |
| 113 $result = exec('ps -p ' . escapeshellarg($this->pid) . ' -o pid='); | |
| 114 $running = (trim($result) == $this->pid); | |
| 115 } | |
| 116 | |
| 117 return $running; | |
| 118 } | |
| 119 | |
| 120 // }}} | |
| 121 // {{{ terminate() | |
| 122 | |
| 123 /** | |
| 124 * Ends the process gracefully | |
| 125 * | |
| 126 * The signal SIGTERM is sent to the process. The gpg-agent process will | |
| 127 * end gracefully upon receiving the SIGTERM signal. Upon 3 consecutive | |
| 128 * SIGTERM signals the gpg-agent will forcefully shut down. | |
| 129 * | |
| 130 * If the <kbd>posix</kbd> extension is available, <kbd>posix_kill()</kbd> | |
| 131 * is used. Otherwise <kbd>kill</kbd> is used on UNIX-like systems and | |
| 132 * <kbd>taskkill</kbd> is used in Windows. | |
| 133 * | |
| 134 * @return void | |
| 135 */ | |
| 136 public function terminate() | |
| 137 { | |
| 138 if (function_exists('posix_kill')) { | |
| 139 posix_kill($this->pid, 15); | |
| 140 } elseif (PHP_OS === 'WINNT') { | |
| 141 exec('taskkill /PID ' . escapeshellarg($this->pid)); | |
| 142 } else { | |
| 143 exec('kill -15 ' . escapeshellarg($this->pid)); | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 // }}} | |
| 148 } | |
| 149 | |
| 150 // }}} | |
| 151 | |
| 152 ?> |
