#!/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); } /* Check if the disk is an HDD based on rotational flag */ function is_hdd($disk) { /* Ensure $disk is properly extracted */ $disk = trim($disk); /* Extract the last part of the path */ $disk = explode('/', $disk); $disk = preg_replace('/^(sd[a-z]+|nvme[0-9]+n1)p?1$/', '$1', end($disk)); /* Validate the extracted disk name */ if (strpos($disk, ' ') !== false || empty($disk)) { return false; } $file = "/sys/block/$disk/queue/rotational"; $result = false; if (file_exists($file)) { $result = trim(file_get_contents($file)) == '1'; } return $result; } 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"; } } } /* Perform fstrim on XFS and Btrfs filesystems */ function xfs_btrfs_trim($write) { /* Use findmnt with JSON output and jq to ensure accurate parsing */ exec("findmnt -lnt btrfs,xfs -J | jq -r '.filesystems[] | select(.source | test(\"^/dev/\")) | \"\\(.target)\\t\\(.source)\"'", $mounts); foreach ($mounts as $mount) { /* Split using tab as the delimiter */ $parts = explode("\t", $mount, 2); /* Ensure we have both target and source */ if (count($parts) < 2) continue; [$target, $source] = $parts; $target_escaped = escapeshellarg($target); /* Ensure $source is valid */ if (empty($source)) continue; /* Resolve the actual device backing the mount */ $device = trim(exec("findmnt -no SOURCE " . escapeshellarg($target))); /* Skip if we cannot resolve a device */ if (empty($device)) continue; /* Check if the device is an HDD */ if (is_hdd($device)) continue; if ($write) write("$target: ... \r"); $trim = exec("fstrim -v $target_escaped 2>/dev/null"); /* Handle output based on mode (write or echo) */ 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_',''); ?>