connect_error) { die('Connection failed: ' . $conn->connect_error); } $conn->set_charset('utf8'); return $conn; } /** Helper: Initialise SFTP connection */ function initializeSFTP(): SFTP { global $SFTP_HOST, $SFTP_USER, $SFTP_PASS; $sftp = new SFTP($SFTP_HOST); if (!$sftp->login($SFTP_USER, $SFTP_PASS)) { die('Login Failed'); } return $sftp; } /** Helper: Initialise SSH connection */ function getSSHConnection(): SSH2 { global $SSH_HOST, $SSH_USER, $SSH_PASS; $ssh = new SSH2($SSH_HOST); if (!$ssh->login($SSH_USER, $SSH_PASS)) { die('SSH login failed'); } return $ssh; } /** Utility: Normalise a path */ function normalizePath(string $path): string { $parts = array_filter(explode('/', $path), fn($part) => $part !== '' && $part !== '.'); $stack = []; foreach ($parts as $part) { if ($part === '..') { array_pop($stack); } else { $stack[] = $part; } } return '/' . implode('/', $stack); } ?>