pronto.ee

Tomorrow will be cancelled due to lack of interest

Probleemid WordPressiga SSH võtmes

Wordpress

Wordpress

WordPress on väga tore tarkvara, kuid aeg-ajalt suudab ta ikka korralikult välja vihastada. Seekordseks põhjuseks on SSH automaatne uuendamine. Kui te veel ei tea, siis on WordPressi võimalik uuendada kolmel viisil: FTP, FTPS ja SSH. FTP on saatanast, seda ei pea ilmselt kellelegi kordama — lõviosa kurja saadetakse Internetis korda sellega, et liigutatakse oma andmeid üle krüpteerimata kanali. FTPS ei ole mul tehniliselt võimalik ning järgi jääb seega SSH.

Ma võtsin täna kätte ja upgradesin oma serverit (tänud Tarkile). Nüüd on mul kõik vajalik kraam serveris olemas ning kui ma WordPressi uuendama lähen, siis ilmub kolmanda võimalusena ka SSH. Ometigi kui ma seda kasutan, saan ma järgneva veateate:

Unpacking the update.

Could not copy file: /srv/vhost/pronto.ee/wp-content/upgrade/wordpress-2.8.6/wordpress/wp-includes/js/codepress/engines/khtml.js

Installation Failed

Nii palju kui ma otsinud olen praeguseks on selgunud, et selle veateate põhjuseks on selline asi nagu meetod, kuidas faile kopeeritakse. On kellelgi ideid, kuidas sellest sitast saia teha? Ma saan installeerida osasi faile ja osasi uuendusi, aga mitte kõiki. Ühe põhjusena pakuti välja, et süsteem ei oska kopeerida 0 pikkusega faile.

UUENDUS:

Ise küsin, ise vastan. WordPressi SSH2 uuenduste koodis on kohutavalt labane viga. Nimelt faile kopeerides vaatab süsteem, kas infot õnnestus ühest failist teise kantida ja kui ei õnnestunud, siis annab vea. Paraku 0 pikkusega failides pole midagi kopeerida ning kui ei teostata explicit testi, siis saadaksegi vale tulemus. Põhimõtteliselt võib öelda, et PHP-s 0 == false, mis antud kontekstis on vale vastus. Et asja tööle saada, tõmmake lahti wp-admin/includes/class-wp-filesystem-ssh2.php, leidke sealt selline funktsioon:

function put_contents($file, $contents, $type = '' ) {
    $file = ltrim($file, '/');
    return file_put_contents('ssh2.sftp://' . $this->sftp_link . '/' . $file, $contents);
}

ja asendage see selle koodilõiguga:

function put_contents($file, $contents, $type = '' ) {
    $file = ltrim($file, '/');
    if  (file_put_contents('ssh2.sftp://' . $this->sftp_link . '/' . $file, $contents) !== false)
        return true;
    else
        return false;
}

UUENDUS 2:

Tundub, et see bugi on parandatud juba mõne aja eest, aga millegipärast pole seda peetud vajalikuks lisada vaheversioonidesse ning on märgitud muudatusena peatselt saabuva v2.9 verstaposti juurde. WordPressi ametlik parandus on pisut elegantsem kui minu oma:

function put_contents($file, $contents, $type = '' ) {
    $file = ltrim($file, '/');
    return false !== file_put_contents('ssh2.sftp://' . $this->sftp_link . '/' . $file, $contents);
}

Post a comment