Van Windows naar ownCloud – met behoud van bestandsnamen

Bij het migreren van de bestanden op een Windows-server naar een (Linux-based) Owncloud-server, moet je bij elke stap die je zet, letten op de character encoding; anders veranderen je ideeën zomaar in idee?n, idee√´n – of dingen met nog vreemdere letters. Ja, ook in 2018 moet dat nog. Vooral als je een of meer Apple-systemen in gebruik hebt.

Wie cloud based storage wil gaan gebruiken, maar liever niet een betaald account neemt bij een van de groten (Amazon, Apple, Google, Microsoft), kan best eens Owncloud overwegen. Een prima systeem, met clients voor Windows, Linux, Apple, Android en IOS, en als dat niet genoeg is, dan is ook de broncode vrij beschikbaar. Met behulp van zogeheten “external storage” kun je bovendien andere netwerkservers beschikbaar maken in je eigen Owncloud.

Als je een owncloud-server geïnstalleerd hebt, zul je je oude data naar de server willen kopiëren. De gemakkelijkste manier omdat te doen is om de data zelf, via een desktop-machine, naar Owncloud te slepen. Bij kleine hoeveelheden, een paar honderd megabyte bijvoorbeeld, kan dat best. Maar wat doe je, als het kopiëren halverwege spaak loopt? Omdat het sluitingstijd is, omdat er een netwerkhik is, omdat je automatisch uitgelogd wordt, omdat de computer ge-upgrade wordt. Of gewoon, omdat het computers zijn, die nu eenmaal nooit doen wat jij wilt.

De betere methode is om rsync te gebruiken. Dan kun je de synchronisatie naar believen afbreken en hervatten. Maar let op: er staan je een paar geniepige character encoding problemen te wachten.

Van \\server naar /owncloud

In een notendop handel je als volgt.

# aankoppelen Windows-share
mount -t cifs -o iocharset=utf8,username=.... '\\SERVER\Share' /mnt
# synchroniseren bestanden
rsync -a /mnt/ /var/www/owncloud/data/..(ownclouduser)../files/
# owncloud index in orde maken
sudo -u www-data php /var/www/owncloud/occ files:scan ..(ownclouduser)..

Hieronder de extra stappen die je moet zetten om de character encoding op orde te krijgen.

Mac-bestanden op de Windows-server

Die zagen we al eerder langskomen: Macintosh codeert een paar lettertekens net wat anders dan andere systemen. Dat is problematisch – je eindigt met directories die niet benaderbaar zijn onder Linux. De oplossing is eenvoudig: gebruik de optie mapchars bij het mounten:

mount -t cifs -o iocharset=utf8,username=...,mapchars '\\SERVER\Share' /mnt/

Hierna kun je met rsync de bestanden synchroniseren.

Mac-UTF8 en normale UTF-8

Nu de bestanden op de Linux-machine staan, is er, wonderlijk genoeg, nog steeds een probleem met bestandsnamen met non-ASCII-lettertekens (letters met trema’s, accenten en andere franje). De achtergrond is complex – maar toch goed begrijpelijk, en wordt hier uiterst helder uitgelegd. Inderdaad: wat elke programmeur over Unicode moet weten. Lezen dus!

Als je namelijk klakkeloos de owncloud-indexing aanzet, loop je na enige tijd vast op de volgende melding:

Exception during scan: ErrorException: Undefined index: size
#0 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(420): OCA\Files\Command\Scan->exceptionErrorHandler(8, 'Undefined index...', '/var/www/ownclo...', 420, Array)
#1 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(381): OC\Files\Cache\Scanner->handleChildren('files', true, 3, '22643', true, 691188)
#2 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(384): OC\Files\Cache\Scanner->scanChildren('files', true, 3, '22643', true)
#3 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(315): OC\Files\Cache\Scanner->scanChildren('', true, 3, '22641', true)
#4 /var/www/owncloud/lib/private/Files/Utils/Scanner.php(238): OC\Files\Cache\Scanner->scan('', true, 3)
#5 /var/www/owncloud/apps/files/lib/Command/Scan.php(224): OC\Files\Utils\Scanner->scan('/ownclouduser', false)
#6 /var/www/owncloud/apps/files/lib/Command/Scan.php(310): OCA\Files\Command\Scan->scanFiles('ownclouduser', '/ownclouduser', false, Object(Symfony\Component\Console\Output\ConsoleOutput), false, false)
#7 /var/www/owncloud/lib/composer/symfony/console/Command/Command.php(262): OCA\Files\Command\Scan->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#8 /var/www/owncloud/core/Command/Base.php(159): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/owncloud/lib/composer/symfony/console/Application.php(826): OC\Core\Command\Base->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#10 /var/www/owncloud/lib/composer/symfony/console/Application.php(189): Symfony\Component\Console\Application->doRunCommand(Object(OCA\Files\Command\Scan), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#11 /var/www/owncloud/lib/composer/symfony/console/Application.php(120): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#12 /var/www/owncloud/lib/private/Console/Application.php(161): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#13 /var/www/owncloud/console.php(106): OC\Console\Application->run()
#14 /var/www/owncloud/occ(11): require_once('/var/www/ownclo...')
#15 {main}

Lang verhaal kort: er bestaan twee versies van UTF8: NFC (wat staat voor “Normalization Form canonical Composition”) en NFD (“… Decomposition”). De Mac gebruikt D, de rest van de wereld C. Owncloud kan niet zomaar overweg met de “D”-versie.

Wanneer je een Mac tot je beschikking hebt voor de synchronisatie met rsync, dan zou je daarbij de optie –iconv kunnen gebruiken. Dan laat je rsync, via de iconv-functiebibliotheek, de conversie uitvoeren. Je rsync-commando wordt dan zoiets als:

rsync -a --iconv=utf-8-mac,utf-8 /mnt/ owncloud:/var/www/owncloud/data/ownclouduser/files/

Ongelukkigerwijze kent iconv onder Linux de karakterset “utf-8-mac” niet, zodat deze methode onder Linux niet werkt:

iconv_open("UTF-8", "utf-8-mac") failed

Daar ga je anders tewerk, je gebruikt het commando convmv. Synchroniseer eerst de bestanden zoals je dat al eerder deed. Draai dan convmv, als volgt:

convmv -f utf8 -t utf8 --nfc -r /var/www/owncloud/data/ownclouduser/files/

Uit de manpage van convmv:

--nfc
 target files will be normalization form C for UTF-8 (Linux etc.)
--nfd
 target files will be normalization form D for UTF-8 (OS X etc.).

De optie -r is simpelweg recursive. Wil je de conversie daadwerkelijk laten plaatsvinden, dan gebruik je de optie –notest.

Indexeren

Nu owncloud nog de indexing laten fixen, als volg:

sudo -u www-data php /var/www/owncloud/occ files:scan ..(ownclouduser)..

Als het goed is, krijg je nu geen foutmeldingen en kun je de bestanden gebruiken vanuit Owncloud.