#!/usr/bin/php -q 'http://localhost/pub/plugins?buffer_length=1', CURLOPT_UNIX_SOCKET_PATH => '/var/run/nginx.socket', CURLOPT_POST => 1, CURLOPT_RETURNTRANSFER => true ]); foreach ($messages as $message) { curl_setopt($com, CURLOPT_POSTFIELDS, $message); curl_exec($com); } curl_close($com); } function is_hdd($disk) { $disk = explode('/',$disk); $disk = preg_replace('/^(sd[a-z]+|nvme[0-9]+n1)p?1$/','$1',end($disk)); return file_get_contents("/sys/block/$disk/queue/rotational")==1; } function zfs_info($name) { $trim = preg_replace('/(.$)/',' $1',exec("zfs list -Ho used $name"))."iB"; $bytes = exec("zfs list -Hpo used $name"); exec("zpool list -vHP $name|grep -Po '^\s+\K/\S+'",$devs); foreach ($devs as &$dev) if (is_hdd($dev)) $dev = ''; return "/mnt/$name: $trim ($bytes bytes) trimmed on ".implode(', ',array_filter($devs)); } function zfs_trim($write) { if (!file_exists('/proc/spl/kstat/zfs/arcstats')) return; exec("zfs list -d0 -Ho name",$pools); foreach ($pools as $name) { if ($write) { write("/mnt/$name: ... \r"); if (exec("zpool trim -w $name 2>&1")=='') write(zfs_info($name)."\r","\n"); else write("\r"); } else { if (exec("zpool trim -w $name 2>&1")=='') echo zfs_info($name)."\n"; } } } function xfs_btrfs_trim($write) { exec("findmnt -lnt btrfs,xfs -o target,source|awk '\$2!~\"\\\\[\"{print \$1,\$2}'",$mounts); foreach ($mounts as $mount) { [$target,$source] = explode(' ',$mount); if (is_hdd($source)) continue; if ($write) write("$target: ... \r"); $trim = exec("fstrim -v $target 2>/dev/null"); if ($write) { if ($trim) write("$trim on $source\r","\n"); else write("\r"); } else { if ($trim) echo("$trim on $source\n"); } } } write(_("TRIM operation started")."\n","\n","\n"); // trim btrfs, xfs xfs_btrfs_trim(true); // trim zfs zfs_trim(true); write(_("Finished")."\n",'_DONE_',''); ?>