Oude owncloud-versie, upgrade PHP naar 7.2, het werkt niet meer

Ingediend door Dirk Hornstra op 19-nov-2018 20:44

Ik had dus Owncloud 8.2.9.4 draaien, op een subdomein. Voor het hoofddomein en andere subdomeinen moest ik de PHP versie omhoog schroeven (van versie 5.6 meteen maar door naar 7.2 zodat we weer bij zijn). De code van 8.2.9.4 ondersteunt deze versie niet. Dus proberen om de meest recente versie van Owncloud eroverheen te zetten, versie 10.0.10.4. Die kapt meteen in het bijwerken-scherm, je kunt niet zomaar van versie 8 naar 10. Dus de code van versie 9.0.11 erop zetten en dat proberen, dat werkt dan ook weer niet. Daar zit je dan, wat gaan we doen?

Eerst een back-up maken van de database. Ook maar even een backup van de /config/config.php zodat ik de databasegegevens nog bij de hand heb. Vervolgens de map data (waar al je afbeeldingen e.d. in staan) hernoemen naar data1. Hierna alle bestanden en submappen verwijderen, behalve die data1 dus. Daarna de hele database leeg gooien. Hierna kopieer je alle bestanden van de Owncloud 10.0.10.4 installatie op de server. Time to kick some ass and chew bubble-gum!

De installatie doorloop ik, let erop dat je jouw gebruiker dezelfde naam geeft als die je bij de oude installatie had. Je hebt een mySQL-backup, dus dat kun je terug zien in de tabel oc_group_user en is ook de naam van de map in de map data1. Als de installatie gelukt is (ik krijg een 500-server-error maar na een reload wel netjes het inlogscherm) kun je inloggen. Maar dan heb je nog niet je bestanden. Log dus maar weer uit. Dat gaan we eerst herstellen.

Stel dat jouw naam "cloudbeheerder" is, dan heb je nu in de map data een map "cloudbeheerder" staan. Hernoem die naar "cloudbeheerder_nieuw". Sleep vervolgens de map "cloudbeheerder" uit je data1 map naar de data map. Zo, je bestanden staan klaar. Dan ga je vervolgens naar de database. Je moet de tabel oc_filecache leeg maken en die vervolgens vullen met de statements die in je mySQL-backup staan. Dus:


truncate table oc_filecache

// vervolgens alle INSERT INTO `oc_filecache` (`fileid`, `storage`, `path`, `path_hash`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`, `checksum`) VALUES ..... statements

Als je dan inlogt zie je je mappen weer terug en ook al je bestanden. Yes! Maar helaas, niet bij alle afbeeldingen zie je thumbnails. Volgens wat Google-zoekacties kun je ook niet met een CRON-taak zorgen dat Owncloud die zelf genereert. Vervelend! Ik heb nog de app "Gallery geïnstalleerd" (leg ik aan het einde uit), maar helaas, ook die kijkt alleen naar bestaande afbeeldingen. Dus ik moet ze op één of andere manier zelf kunnen maken.

Kijken in de core hoe dit werkt. Daar word je ook niet blij van, veel zaken via Ajax en geen 1-2-3 locatie te vinden. 

We gaan op zoek. Ik kom daarbij uit op de volgende locatie:
/apps/files/lib/Controller

Hier heb je een ApiController.php.
Daar zie je een functie getThumbnail, die iets doet met een $this->previewManager->createPreview.

Dat zit dan weer in /lib/private/PreviewManager.php.
$file = $this->rootFolder->getUserFolder($user->getUID())->getParent()->get($file);
$preview = new Preview('', '/', $file, $maxX, $maxY, $scaleUp);

Die Preview bestaat als class in /lib/private/Preview.php
Als je dat bestand wat doorbladert kom je langs de functie generatePreview die ook wat met thumbnailmappen doet. Eens kijken wat ik kan doen.

Ik maak een map cron en plaats daar een regeneratethumbs.php in. In dat PHP bestand zet ik een deel van de code die in index.php in de root staat (alleen moet je even met een chdir terug naar de root:



<?php

    chdir("..");
    require_once './lib/base.php';
    var_dump(OC::$server);
?>

Ok, allemaal output, dus er is een object waar we wat mee kunnen. Gauw die var_dump weer weg halen, want die info wil je niet publiekelijk online hebben!

Ik krijg dit wel aan de praat, genereer zelfs een thumbnail, maar ik zie het niet terug, nog steeds geen icoon bij het bestand.

Wat me nu wel ineens opvalt is dat de .jpg-bestanden geen problemen hebben en het alleen de .png bestanden zijn waarbij ik geen afbeelding zie.

Inspecteer ik mijn netwerkverkeer, dan zie ik dat de aanroep van de map "verjaardag" een stuk XML terug geeft. En daar staat bij de JPEG bestanden deze tag: <d:getcontenttype>image/jpeg</d:getcontenttype>, maar bij de PNG bestanden deze: <d:getcontenttype>application/octet-stream</d:getcontenttype>. Het lijkt dus alsof het bestandstype niet goed "gemapt" wordt. En natuurlijk, ik heb de oude dump geïmporteerd. Daarbij heb je in de tabel oc_filecache een veld mimetype die gekoppeld zit aan de tabel oc_mimetypes. In de oude versie van ownCloud had image/png de ID 9, maar dat is nu niet meer zo, in deze versie heeft dit type bestand ID 8 ( SELECT * FROM oc_mimetypes ). Dus geen gedoe met CRON-jobs, hergeneratie maar een simpele update op de database: UPDATE `oc_filecache` SET mimetype=8 WHERE path like '%.png' and mimetype=9

Dit lost het op, ik krijg weer beeld. Mocht je nog iets met hergeneratie van thumbnails willen doen, in onderstaand stukje code moet je wel ingelogd zijn en zul je waarschijnlijk aan moeten passen, maar het laat je zien dat het kan:

 

<?php

    chdir("..");
    require_once './lib/base.php';

    echo "zet m op dirk!";

    try {

        $previewManager = (OC::$server->getPreviewManager());
// als je ingelogd bent pakt hij zelf al als basis het pad /data/jouwloginnaam/

        $file = "files/img/verjaardag/plaatje.png";

//var_dump($previewManager->createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false));
// je ziet hier de default aanroep qua grootte en scaleup

        $preview = $previewManager->createPreview($file);

        //var_dump($preview);
// deze var_dump geeft allemaal data terug, niet nodig, maar mocht je willen debuggen, dan kun je er vast wat mee.
    }
    catch (Exception $e) {
        var_dump($e);
    }

    echo "yow!";

?>

Nog even terugkomend op het installeren van de app "Gallery". In de oude-releases op Github staan de versies tot Owncloud versie 9, dus die hoef je niet te proberen. Ga naar de Github-locatie: link en klik op Clone or Download (de groene knop). Kies dan vervolgens voor Download ZIP.  Pak dat bestand uit en kopieer die bestanden via FTP naar de map /apps/gallery (die map gallery moet je zelf nog even aanmaken). Ga dan vervolgens in Owncloud rechtsboven naar Instellingen, Apps en klik op Toon uitgeschakelde apps. In het volgende scherm kun je de app "Gallery" actief maken.