From: Max Semenik Date: Sat, 7 Oct 2017 02:50:45 +0000 (-0700) Subject: Get rid of $IP in Command X-Git-Tag: 1.31.0-rc.0~1842^2 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/banques/?a=commitdiff_plain;h=7c3d3d54bd6bc15e376ec981bdc1658d6a2828d2;hp=ce65e570c5b72c0cd948de01a3b881cffc4f7be3;p=lhc%2Fweb%2Fwiklou.git Get rid of $IP in Command Change-Id: Iccfe1b79963462f9cad80ff327ccd574ee1122c5 --- diff --git a/includes/limit.sh b/includes/limit.sh deleted file mode 100755 index d71e660387..0000000000 --- a/includes/limit.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash -# -# Resource limiting wrapper for command execution -# -# Why is this in shell script? Because bash has a setrlimit() wrapper -# and is available on most Linux systems. If Perl was distributed with -# BSD::Resource included, we would happily use that instead, but it isn't. - -# Clean up cgroup -cleanup() { - # First we have to move the current task into a "garbage" group, otherwise - # the cgroup will not be empty, and attempting to remove it will fail with - # "Device or resource busy" - if [ -w "$MW_CGROUP"/tasks ]; then - GARBAGE="$MW_CGROUP" - else - GARBAGE="$MW_CGROUP"/garbage-`id -un` - if [ ! -e "$GARBAGE" ]; then - mkdir -m 0700 "$GARBAGE" - fi - fi - echo $BASHPID > "$GARBAGE"/tasks - - # Suppress errors in case the cgroup has disappeared due to a release script - rmdir "$MW_CGROUP"/$$ 2>/dev/null -} - -updateTaskCount() { - # There are lots of ways to count lines in a file in shell script, but this - # is one of the few that doesn't create another process, which would - # increase the returned number of tasks. - readarray < "$MW_CGROUP"/$$/tasks - NUM_TASKS=${#MAPFILE[*]} -} - -log() { - echo limit.sh: "$*" >&3 - echo limit.sh: "$*" >&2 -} - -MW_INCLUDE_STDERR= -MW_USE_LOG_PIPE= -MW_CPU_LIMIT=0 -MW_CGROUP= -MW_MEM_LIMIT=0 -MW_FILE_SIZE_LIMIT=0 -MW_WALL_CLOCK_LIMIT=0 - -# Override settings -eval "$2" - -if [ -n "$MW_INCLUDE_STDERR" ]; then - exec 2>&1 -fi -if [ -z "$MW_USE_LOG_PIPE" ]; then - # Open a dummy log FD - exec 3>/dev/null -fi - -if [ "$MW_CPU_LIMIT" -gt 0 ]; then - ulimit -t "$MW_CPU_LIMIT" -fi -if [ "$MW_MEM_LIMIT" -gt 0 ]; then - if [ -n "$MW_CGROUP" ]; then - # Create cgroup - if ! mkdir -m 0700 "$MW_CGROUP"/$$; then - log "failed to create the cgroup." - MW_CGROUP="" - fi - fi - if [ -n "$MW_CGROUP" ]; then - echo $$ > "$MW_CGROUP"/$$/tasks - if [ -n "$MW_CGROUP_NOTIFY" ]; then - echo "1" > "$MW_CGROUP"/$$/notify_on_release - fi - # Memory - echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.limit_in_bytes - # Memory+swap - # This will be missing if there is no swap - if [ -e "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes ]; then - echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes - fi - else - ulimit -v "$MW_MEM_LIMIT" - fi -else - MW_CGROUP="" -fi -if [ "$MW_FILE_SIZE_LIMIT" -gt 0 ]; then - ulimit -f "$MW_FILE_SIZE_LIMIT" -fi -if [ "$MW_WALL_CLOCK_LIMIT" -gt 0 -a -x "/usr/bin/timeout" ]; then - /usr/bin/timeout $MW_WALL_CLOCK_LIMIT /bin/bash -c "$1" 3>&- - STATUS="$?" - if [ "$STATUS" == 124 ]; then - log "timed out executing command \"$1\"" - fi -else - eval "$1" 3>&- - STATUS="$?" -fi - -if [ -n "$MW_CGROUP" ]; then - updateTaskCount - - if [ $NUM_TASKS -gt 1 ]; then - # Spawn a monitor process which will continue to poll for completion - # of all processes in the cgroup after termination of the parent shell - ( - while [ $NUM_TASKS -gt 1 ]; do - sleep 10 - updateTaskCount - done - cleanup - ) >&/dev/null < /dev/null 3>&- & - disown -a - else - cleanup - fi -fi -exit "$STATUS" - diff --git a/includes/shell/Command.php b/includes/shell/Command.php index fd8f6a0ca7..cefe573762 100644 --- a/includes/shell/Command.php +++ b/includes/shell/Command.php @@ -199,8 +199,6 @@ class Command { * @throws ShellDisabledError */ public function execute() { - global $IP; - $this->everExecuted = true; $profileMethod = $this->method ?: wfGetCaller(); @@ -235,7 +233,7 @@ class Command { $filesize = intval( $this->limits['filesize'] ); if ( $time > 0 || $mem > 0 || $filesize > 0 || $wallTime > 0 ) { - $cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' . + $cmd = '/bin/bash ' . escapeshellarg( __DIR__ . '/limit.sh' ) . ' ' . escapeshellarg( $cmd ) . ' ' . escapeshellarg( "MW_INCLUDE_STDERR=" . ( $this->useStderr ? '1' : '' ) . ';' . diff --git a/includes/shell/limit.sh b/includes/shell/limit.sh new file mode 100755 index 0000000000..d71e660387 --- /dev/null +++ b/includes/shell/limit.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# +# Resource limiting wrapper for command execution +# +# Why is this in shell script? Because bash has a setrlimit() wrapper +# and is available on most Linux systems. If Perl was distributed with +# BSD::Resource included, we would happily use that instead, but it isn't. + +# Clean up cgroup +cleanup() { + # First we have to move the current task into a "garbage" group, otherwise + # the cgroup will not be empty, and attempting to remove it will fail with + # "Device or resource busy" + if [ -w "$MW_CGROUP"/tasks ]; then + GARBAGE="$MW_CGROUP" + else + GARBAGE="$MW_CGROUP"/garbage-`id -un` + if [ ! -e "$GARBAGE" ]; then + mkdir -m 0700 "$GARBAGE" + fi + fi + echo $BASHPID > "$GARBAGE"/tasks + + # Suppress errors in case the cgroup has disappeared due to a release script + rmdir "$MW_CGROUP"/$$ 2>/dev/null +} + +updateTaskCount() { + # There are lots of ways to count lines in a file in shell script, but this + # is one of the few that doesn't create another process, which would + # increase the returned number of tasks. + readarray < "$MW_CGROUP"/$$/tasks + NUM_TASKS=${#MAPFILE[*]} +} + +log() { + echo limit.sh: "$*" >&3 + echo limit.sh: "$*" >&2 +} + +MW_INCLUDE_STDERR= +MW_USE_LOG_PIPE= +MW_CPU_LIMIT=0 +MW_CGROUP= +MW_MEM_LIMIT=0 +MW_FILE_SIZE_LIMIT=0 +MW_WALL_CLOCK_LIMIT=0 + +# Override settings +eval "$2" + +if [ -n "$MW_INCLUDE_STDERR" ]; then + exec 2>&1 +fi +if [ -z "$MW_USE_LOG_PIPE" ]; then + # Open a dummy log FD + exec 3>/dev/null +fi + +if [ "$MW_CPU_LIMIT" -gt 0 ]; then + ulimit -t "$MW_CPU_LIMIT" +fi +if [ "$MW_MEM_LIMIT" -gt 0 ]; then + if [ -n "$MW_CGROUP" ]; then + # Create cgroup + if ! mkdir -m 0700 "$MW_CGROUP"/$$; then + log "failed to create the cgroup." + MW_CGROUP="" + fi + fi + if [ -n "$MW_CGROUP" ]; then + echo $$ > "$MW_CGROUP"/$$/tasks + if [ -n "$MW_CGROUP_NOTIFY" ]; then + echo "1" > "$MW_CGROUP"/$$/notify_on_release + fi + # Memory + echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.limit_in_bytes + # Memory+swap + # This will be missing if there is no swap + if [ -e "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes ]; then + echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes + fi + else + ulimit -v "$MW_MEM_LIMIT" + fi +else + MW_CGROUP="" +fi +if [ "$MW_FILE_SIZE_LIMIT" -gt 0 ]; then + ulimit -f "$MW_FILE_SIZE_LIMIT" +fi +if [ "$MW_WALL_CLOCK_LIMIT" -gt 0 -a -x "/usr/bin/timeout" ]; then + /usr/bin/timeout $MW_WALL_CLOCK_LIMIT /bin/bash -c "$1" 3>&- + STATUS="$?" + if [ "$STATUS" == 124 ]; then + log "timed out executing command \"$1\"" + fi +else + eval "$1" 3>&- + STATUS="$?" +fi + +if [ -n "$MW_CGROUP" ]; then + updateTaskCount + + if [ $NUM_TASKS -gt 1 ]; then + # Spawn a monitor process which will continue to poll for completion + # of all processes in the cgroup after termination of the parent shell + ( + while [ $NUM_TASKS -gt 1 ]; do + sleep 10 + updateTaskCount + done + cleanup + ) >&/dev/null < /dev/null 3>&- & + disown -a + else + cleanup + fi +fi +exit "$STATUS" +