Contents
-
Archiver un site drupal
- Si le site est sketch, mettre un htpasswd...
- Faire un backup!
- Faire un dernier ménage du site
-
Prendre une copie statique du site
- Téléchargement les pages qui répondent avec une erreur(404, 500, etc.)
- Ré-écriture les nom des fichiers sans le query string
- Ré-écriture de liens http vers https
- Supression des query string encodé dans les liens
- Plusieurs URLs dans le source
- Sites multilingues
- S'assurer que les images et fichiers CSS sont en place
- QA, faire que les pages matchent
- Configurer Apache pour le nouveau site
- Désactiver l'ancien site drupal
- Bonus points: redirect /foo to /foo.html
- Redirecting to the archive site
- Exemples
- Drupal 6 EOL
- Archiver un wordpress
- Autres solutions
1. Archiver un site drupal
Voir aussi
1.1. Si le site est sketch, mettre un htpasswd...
Dans l'htaccess, mettre
AuthUserFile /var/alternc/html/C/COMPTE/asdf.net/.htpasswd AuthType Basic AuthName "My Files" Require valid-user
Pi faire genre htpasswd .htpasswd jsmith ; t'facon, tu vas oublier le mot de passe.
1.2. Faire un backup!
Garder une archive de l'ancien site au complet quelque part.
1.3. Faire un dernier ménage du site
1.3.1. Annoncer la fossiliation
S'il est encore possible de poster du contenu, mettez une petite annonce sur la page principale, c'est votre dernière chance - après c'est plus difficile en HTML...
1.3.2. Désactiver chaque element interactif sur le site
Il faut désactiver le bloc pour se connecter, les commentaires, et les modules qui génèrent un nombre infini de liens (calendar, faceted search, etc). Voir la Drupal/d4cheatsheet pour plus de détails ici
1.3.3. Vérifier la santé de la base de donnée
Optionnel.
Éliminer un maximum de lien relatif (voir script sanitization.php)
Ajouter une base (http://www.startyourdev.com/HTML/Balise-BASE.html) au thème
- Effacer la cache
1.3.4. php deprecation errors on pages
Pour une raison que j'ignore, ce procédure fait jaillir plein d'erreurs @ereg is deprecated@ - j'ai appliqué le fix sur http://drupal.org/node/514334#comment-1832692 pour régler ça.
1.4. Prendre une copie statique du site
mkdir /var/aegir/sites-statiques/www.foo.org cd /var/aegir/sites-statiques nice wget --mirror -e robots=off --page-requisites --adjust-extension -nv --base=./ --convert-links --directory-prefix=./ -H -D www.foo.org,foo.org http://www.foo.org/
Explication des options :
--mirror : Turn on options suitable for mirroring. This option turns on recursion and time-stamping, sets infinite recursion depth and keeps FTP directory listings. It is currently equivalent to -r -N -l inf --no-remove-listing.
-e robots=off : Execute command as if it were a part of .wgetrc. A command thus invoked will be executed after the commands in .wgetrc, thus taking precedence over them.
Par défaut c'est robots=on et ça veut dire qu'on respecte ce que dit le "robots.txt". On veut forcer la copie du site, peu importe ce que dit le fichier.
--page-requisites : This option causes Wget to download all the files that are necessary to properly display a given HTML page. This includes such things as inlined images, sounds, and referenced stylesheets.
--adjust-extension : Pas clairement documentée : "save HTML/CSS documents with proper extensions"
-nv : No verbose. Turn off verbose without being completely quiet (use -q for that), which means that error messages and basic information still get printed.
--base=./ : Resolves relative links using URL as the point of reference, when reading links from an HTML file specified via the -i/--input-file option (together with --force-html, or when the input file was fetched remotely from a server describing it as HTML). This is equivalent to the presence of a "BASE" tag in the HTML input file, with URL as the value for the "href" attribute. For instance, if you specify http://foo/bar/a.html for URL, and Wget reads ../baz/b.html from the input file, it would be resolved to http://foo/baz/b.html.
--convert-links : After the download is complete, convert the links in the document to make them suitable for local viewing. This affects not only the visible hyperlinks, but any part of the document that links to external content, such as embedded images, links to style sheets, hyperlinks to non-HTML content, etc.
- Pas trop clair, semble faire des liens relatifs ?
--directory-prefix=./ : Pas documenté. Je crois que c'est l'endroit où les fichiers sont téléchargés.
-H : span-hosts : Enable spanning across hosts when doing recursive retrieving.
-D www.foo.org,foo.org : limite le -H en spécifiant quels domaines aller voir.
http://www.foo.org/ : La page d'accueil du site à obtenir.
Note: l'adresse de chaque page va changer, mais wget va ré-écrire les liens internes pour que ça ne brise pas le site.
Pour les sites qui utilise des liens autres que node/X or term/X partout, on peut forcer la téléchargement dans une manière de même:
Retrouver le nid maximal du site: drush @site sqlq "select max(nid) from node;"
Rouler
MAX_NODE=611 CUR_NODE=1 SITE="http://foo.bar" while [[ $CUR_NODE -le $MAX_NODE ]]; do echo "Node $CUR_NODE / $MAX_NODE" wget -N -e robots=off --page-requisites --html-extension -nv --base=./ --convert-links --directory-prefix=./ $SITE/node/$CUR_NODE CUR_NODE=$((CUR_NODE+1)) done
Retrouver le term maximal du site: drush @site sqlq "select max(tid) from term_data;
Rouler
MAX_TERM=68 CUR_TERM=1 SITE="http://foo.bar" while [[ $CUR_TERM -le $MAX_TERM ]]; do echo "Term $CUR_TERM / $MAX_TERM" wget -N -e robots=off --page-requisites --html-extension -nv --base=./ --convert-links --directory-prefix=./ $SITE/taxonomy/term/$CUR_TERM CUR_TERM=$((CUR_TERM+1)) done
1.4.1. Téléchargement les pages qui répondent avec une erreur(404, 500, etc.)
Parfois un CMS va afficher une page même avec un code http qui signale une erreur, pour ce faire avec wget nous devons ajouter le flag --content-on-error
1.4.2. Ré-écriture les nom des fichiers sans le query string
Wget va écrire parfois écrire les fichiers avec des query string (du genre ?tok=423432). Voici comment ré-écrire les fichier sans le query string:
find -name "*.*\?*" | while read filename; do mv "$filename" "${filename%\?*}"; done
1.4.3. Ré-écriture de liens http vers https
Si on prend une copie statique servie par http nous allons souvent avoir besoin de ré-écrire les liens dans les fichiers pour être https si nous servons le site statique par https. Voiçi la commande pour ré-écrire les lein http en https:
find . -not -path '*/\.*' -type f -print0 | xargs -0 sed -i 's/http:\/\//https:\/\//g'
Note: le -not -path '*/\.*' omet les fichiers caché commençant par un .
1.4.4. Supression des query string encodé dans les liens
Parfois, les ressources tel que les images ou autres fichiers vont avoir un timestamp comme suffixe dans un query string pour s'assurer que la ressource est chargée lorsque elle est modifiée. Lorsque ceci est ajouter par le CMS dans le fichier html le '?' est encodé comme %3F donc si on veux le suprimmer lorsque cellui-ci fait parti d'un lien html, on peut utiliser:
find . -not -path '*/\.*' -type f -print0 | xargs -0 sed -i 's/\%3F[^"]*//g'
Note: Il faut quand même faire attention et suprimant des query string dans les liens d'un fichier HTML puisque parfois elle peuvent contenir des données nécessaire pour le bon fonctionnment du site. Faire un grep %3F * peut être pas mal utile et il est déconseiller.
1.4.5. Plusieurs URLs dans le source
Des fois un site est disponible sur example.com et www.example.com. Normalement le contenu est écrit pour que seulement un URL est utilisé - mais, il est tout à fait possible que les personnes qui ont écrit le contenu on respecté ça.
Il il est des fois utile de repasser sur le source pour enlèver les références absoluent:
find . -iname "*.html" -and -type f -exec sed -i 's/http:\/\/www\.example\.\.ca//g' {} +
1.4.6. Sites multilingues
Pour les sites multilingues en Drupal 5, c'est plus complexe. Chaque page est disponible à deux places, avec et sans le préfixe d'url :
Il faut donc faire une liste des pages sous /fr/ et /es/ comme "/fr/blog" après avoir fait la copie du site, puis aller les chercher à la racine du site :
wget -e robots=off --page-requisites --html-extension --base=./ --convert-links --directory-prefix=./ -i urls.txt
Vous devez aussi --user=jsmith --password=XXXX si vous aviez un passwd.
C'est risqué d'utilisé robots=off, mais souvent les robots sont exclus des répertoires d'images des sites.
(Et si http://foo.org/es/blog existe aussi, qu'est-ce qu'on voit à http://foo.org/blog ? On voit le contenu dans la langue qu'on a choisi la dernière fois qu'on a visité le site! Si tu n'as pas un cookie du site pour déterminer la langue, le contenu sera présenté dans la langue par défaut du site.)
1.4.7. S'assurer que les images et fichiers CSS sont en place
J'ai eu besoin de copier manuellement les fichiers css inclus avec @import. Apparement il y a des problèmes avec les références externes dans les fichiers css avec url() aussi (il faut parfois les convertir en URLs absolus avec nom de domaine et chemin complet; à tester).
grep -rl '@import' . | sort | uniq > css-imports-to-copy.txt
Ou mieux:
grep -R '@import' * | cut -d ' ' -f 4 | cut -d '"' -f 2 | sort | uniq | grep http
En ajustant les coupes, on peut sortir les noms seulement.
Il faut aussi copier le répertoire files/ au complet.
Si les CSSs inclus sont brisés par "?j.css" à la fin (?j de drupal, .css de --adjust-extensions), on devrait enlèver les .css d'extra. La recette, c'est:
for A in `find . -iname "*css\??.css"` ; do mv -f $A `dirname $A`/`basename $A | cut -d '?' -f 1` ; done
On devrait faire la même opération pour les javascripts:
for A in `find . -iname "*js\??"` ; do mv -f $A `dirname $A`/`basename $A | cut -d '?' -f 1` ; done
for i in $(grep -R '@import' * | cut -d ' ' -f 4 | cut -d '"' -f 2 | cut -d '?' -f 1 | sort | uniq) ; do mkdir -p $(dirname $(echo "$i" | sed -r 's/^\///')) ; cp ../ciac.ca/biennale2011/$(echo "$i" | sed -r 's/^\///' | sed 's#contrib/##') $(dirname $(echo "$i" | sed -r 's/^\///')); done
1.5. QA, faire que les pages matchent
find . -name \*html\* -print0 | xargs -0 sed -i -e "s#src='../\([^']*\)'#src='\1'#g" find . -name \*html\* -print0 | xargs -0 sed -i -e 's#[sS][rR][cC]="../\([^"]*\)"#src="\1"#'
This stops a lot of dumb recursions: for e in en es fr ; do find . -name \*html -print0 | xargs -0 sed -i -e "s#href=\([\'\"]\)$e#href=\1/$e#g" ; done
Say the urls you're sucking are recurring, you might wanna batch change them:
find . -name \*html\* -print0 | xargs -0 sed -i "s#spip.php?page=\([a-zA-Z;_&=0-9]*\)\([\'\"#]\)#spip.php%3Fpage=\1.html\2#g" find . -name \*html\* -print0 | xargs -0 sed -i 's#http://\(ancien.SCHTROUMPH\|theoriginalsite\).qc.ca##g' # this doesn't really work at all, but I did it on the crawl, so I had to fix by hand below find . -name \*html\* -print0 | xargs -0 sed -i 's#http://www.SCHTROUMPH.qc.ca/spip.php?article\([0-9]*\)\&lang=fr#spip.php%3farticle\1\&lang=fr.html#g' find . -name \*html\* -print0 | xargs -0 sed -i 's#http://www.SCHTROUMPH.qc.ca/documents#documents#g' # we chopped the references to ancien.SCHTROUMPH.qc.ca which broke a lot of links find . -name \*html\* -print0 | xargs -0 sed -i "s#spip.php?article\([0-9]*\)\(\&\|\&\)lang=fr\([\'\"]\)#spip.php%3farticle\1\&lang=fr.html\3#g" find . -name \*html\* -print0 | xargs -0 sed -i 's#http://www.SCHTROUMPH.qc.ca/IMG#IMG#g'
Sometime some subpath doesn't get the proper index.html for i in `find . -maxdepth 1 -mindepth 1 -type d` ; do if [ -f "$i.html" ] ; then if [ -f "$i/index.html" ] ; then echo "NOPE\!"; else cp $i.html $i/index.html ; fi ; fi ; done
Sometimes there is hardlink on the pages that are then linking to the old site. for i in files nodes publications sites ; do find . -name \*htm -print0 | xargs -0 sed -ie "s#http://\(www1.\)\?SCHTROUMPH.qc.ca/$i#/$i#g" ; done
Oh well, it might make a mess...
wget --spider -o wget.log -e robots=off --wait 1 -r -p fossile.SCHTROUMPH.qc.ca grep -B2 "404 Not Found" wget.log | grep SCHTROUMPH
So yeah, fix it. grep -B2 "404 Not Found" wget.log | grep foss | grep -v 'connexion existante' | sed -e 's/--\(.*\)-- //' | sort | uniq | sed -e 's#fossile#live#g' > asdf.txt
But remember, we fucked with those file names, so we need to unfuck 'em back again: cat more-to-download | grep article | sed -e "s#%3\(f\|F\)#?#" | sed -e "s#.html##" > todownloadagain
To look at what's wrong. Use that one liner to download all the content to another dir:
wget -e robots=off --page-requisites --html-extension --base=./ --convert-links --directory-prefix=fart -i asdf.txt
However, you can't copy that directory straight with cp, as cp isn't porous ; default behavior is to overwrite directories. Even with -i. Use obscure shit such as:
find ancien.SCHTROUMPH.qc.ca -type f -exec cp '{}' . \;
But guess what, all those new fucking files have links that are fucking broken again. Redo all the steps above until all works. Fix the steps above if you realized that I didn't get everything.
Sometimes, the accented file names in the old parts of the site borked up. You can try shit such as: find . -print | while read name ; do mv -n \'$name\' \'`echo $name | sed -e 's/\xE9/é/g' | sed -e 's/\xE8/è/g' | sed -e 's/\xC9/É/g' | sed -e 's/\xEA/ê/g' | sed -e 's/\xE8/è/g' | sed -e 's/\xE0/à/g' | sed -e 's/\xFB/û/g' |sed -e 's/\xCA/Ê/g' | sed -e 's/\xE7/ç/g' | sed -e 's/\xC0/À/g'`\'; done
If you got here, you're a fucking padawan.
1.6. Configurer Apache pour le nouveau site
Sur Aegir, voir /var/aegir/config/server_master/apache/pre.d pour des modèles à suivre. Les fichiers dans ce répertoire seront lus par Apache mais ne sont pas gérés par Aegir.
<VirtualHost *:80> DocumentRoot /var/aegir/sites-statiques/www.foo.org ServerName statique.foo.org #ServerAlias foo.org #ServerAlias www.foo.org DirectoryIndex index.html AddDefaultCharset UTF-8 </VirtualHost>
Configurer un alias DNS (par exemple, statique.foo.org) et redémarrer Apache pour vérifier que tout marche comme il faut.
NB: l'utilisateur Aegir a le droit de rouler "sudo apache2ctl graceful"
1.7. Désactiver l'ancien site drupal
Il faut soit transférer le DNS (si le site était ailleurs) ou désactiver le site dans Aegir (si c'était sur la même machine).
NB: un site mentionné dans apache/pre.d prend précédence sur un site géré par aegir, donc il faut ajouter les vrais noms de domaine (enlever les ommentaires au début des lignes ServerAlias en haut) avant de désactiver le site dans aegir.
1.8. Bonus points: redirect /foo to /foo.html
You can just use Option MultiViews. It does that. Case closed.
1.8.1. Old crap
This will create a static copy of your site in which all internal links work, unless they were written as absolute links with the domain name (so a link to /bar will be re-written to /bar.html, but a link to http://foo.com/bar will not be rewritten). Also, external links to your site will of course not be rewritten. To avoid broken links, you can manually extract a list of all links and all files from the site:
find . -name \*html | sed 's/ /%20/g' | sed 's,^.\(.*\).html,Redirect 301 \1 \1.html,' > .htaccess
An alternative is to use rewrite rules:
RewriteEngine on RewriteCond %{HTTP_HOST} ^archive\.example\.org$ RewriteRule ^/$ http://archive.example.org/ [R=301,L] RewriteRule ^/(.*)/$ http://archive.example.org/$1.html [R=301,L]
Or even butter
find . -name \*html | sed 's/ /%20/g' | sed 's,^.\(.*\).html,RedirectMatch 301 "\1$" "\1.html",' > .htaccess99 cat .htaccess99 | awk '{ print length, $0 }' | sort -rn -s | cut -d" " -f2- | less > .htaccess2 # this is not necessary, but whatev mv .htaccess2 .htaccess
Exemple complet:
<VirtualHost *:80> DocumentRoot /var/aegir/sites-statiques/ericlint.uqam.ca ServerName ericlint2.uqam.ca ServerAlias ericlint2.aegirnt2.uqam.ca DirectoryIndex intro.html index.html index.php AddDefaultCharset UTF-8 RewriteEngine on RewriteRule ^/?$ /index.html [L,R=permanent] # Rewrite old-style URLS of the form 'node.php?id=x': RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{QUERY_STRING} ^id=([^&]+)$ RewriteRule node.php /index.php?q=node/view/%1 [L,R=permanent] # Rewrite old-style URLs of the form 'module.php?mod=x': RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{QUERY_STRING} ^mod=([^&]+)$ RewriteRule module.php /index.php?q=%1 [L,R=permanent] RewriteRule node/print/(.*)$ /node/view/$1 [L,R=permanent] <Directory /var/aegir/sites-statiques/ericlint.uqam.ca> Options +Indexes #Include /var/aegir/sites-statiques/ericlint.uqam.ca/.htaccess # to deal with directories indexes RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)/$ /$1.html [L,R=permanent] # clean URLs RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/?$ /$1.html [L,QSA] </Directory> <Directory /var/aegir/sites-statiques/ericlint.uqam.ca/.git> Order deny,allow Deny from all </Directory> </VirtualHost>
1.9. Redirecting to the archive site
In certain specific situations - ie when the client is abandoning drupal all together, I found it useful to stick rewrite rules in the new site to preserve links to old content.
Put this in .htaccess:
# Redirect requests for nodes to the archives RedirectMatch ^/node/(.+) http://archive.lapointelibertaire.org/node/$1
1.10. Exemples
1.11. Drupal 6 EOL
Ressources:
Migration Drupal 6 vers d7/8: https://www.drupal.org/node/2257723
Préparer une upgrade: https://www.drupal.org/node/2350603
Fossiliser avec Drush: https://www.drupal.org/node/1369242
2. Archiver un wordpress
Exemples de fossilisation WordPress:
34259 - fablabsnation.ca
38177 - summit.fabcity-montreal.quebec
38092 - imaginonsstmarc.org
Rt:1656910 - 3 sites absurdus.net pour Jonathan Lessard
2.1. Avant de downloader le site
À cette étape, on garde le site dans WordPress.
Faire un backup des fichiers courants ainsi que de la base de données, car on va probablement désactiver certains plugins, voire en installer d'autres.
Se connecter au WPAdmin et faire l'état des lieux (plugins utilisés, URL-rewriting etc). Attention le /wp-admin peut être caché, voir WordPress/Troubleshooting
2.1.1. Nettoyage en amont
Plutôt que d'essayer de faire des sed à toutes les sauces pour nettoyer le site fossilisé, il est possible de faire de la préparation en amont. Depuis l'interface admin WP il est possible par exemple de:
- désactiver les formulaires de commentaires et de contact
- désactiver les champs dans le site
- forcer une structure d'URL particulière, surtout pour les sites multilingues
2.1.1.1. Language Switcher
Le plugin qui gère les langues s'appelle "Language Switcher". Aller dans Settings > Language Switcher puis forcer les 2 options suivantes:
Check this box to force Language Switcher URL suffixes to use ? or &, if you are having trouble with permalink-style URL suffixes
- Check this box to force Language Switcher to put a language URL suffix on every link (by default, Language Switcher omits URL suffixes for your default language in some cases)
J'ai aussi changé pour que le slug soit "lang". Donc maintenant ça forcer que chaque page / lien contient "&lang=<lang>"
2.1.2. Lazy loading
Le "lazy load" fait en sorte que c'est seulement le haut de la page qui est téléchargé lorsqu'on charge une page. Le reste est téléchargé lorsqu'on navigue vers le bas. Si c'est activé, wget ne va pas télécharger toutes les images des pages, et donc, il va manquer beaucoup de choses dans la version statique.
Attention, il y a plein de plugins ou de thèmes qui peuvent implémenter leur propre version de lazy loading. Il va falloir faire des vérifications.
2.1.2.1. Lazy load par défaut dans WP v5.5+
Pour le désactiver, il faut soit installer un plugin qui le désactive, soit mettre un bout de code dans functions.php. Pour ce faire, aller dans le wp-admin, Apparence->Editeur de thèmes et mettre ceci à la fin du code: add_filter( 'wp_lazy_loading_enabled', 'return_false' );
2.1.2.2. Autres implémentations de lazy loading
Avant de trop fouiller, ça vaut la peine de désactiver tout les plugins qui vise à optimiser le site. Après ça. On peut faire d'autres vérifications.
Pour vérifier s'il y a pas un autre truc qui met en place du lazy load (thème ou plugins), on peut checker dans le code source de la page et chercher pour "lazy". Si c'est dans une classe CSS, on peut aller faire un grep dans le dossier "plugins/" de WordPress avec le nom de la classe. Le dossier dans lequel sont les fichiers qui contiennent la classe indique quel plugins ou thème met en place le lazy loading et on peut aller fouiller dans les options du dashboard pour le désactiver. Après avoir fait cette vérification, on peut se lancer avec le wget.
2.1.3. Sitemap
Certains sites ont un plugin pour générer un sitemap qui sera utilisé par les moteurs de recherche. Les sitemap peuvent généralement être trouvés à mondomaine.org/sitemap_index.xml ou quelque chose du genre. S'il y a un sitemap, il faut les télécharger avant de fermer WordPress. Ce ne sont généralement pas des fichiers présents dans l'arborescence, mais généré automatiquement lorsqu'on visite l'URL. Attention, il faut télécharger le fichier .xml et non pas une version html rendu par le navigateur. Aussi, wget n'est pas apte à suivre les liens du sitemap principal. Il faut donc les télécharger à la main. J'utilise wget avec le nom de chaque xml du sitemap. On garde ces fichiers de côté et on les ajoutera à la racine du dossier généré par le wget.
2.2. Télécharger le site
Prépare un command.sh comme suit:
date | tee -a wget.log nice wget \ --mirror \ -e robots=off \ --page-requisites \ --adjust-extension \ --trust-server-names \ -nv \ --base=./ \ --convert-links \ --directory-prefix=./ \ -H \ -D www.fablabsnation.ca https://www.fablabsnation.ca/ \ 2>&1 | tee -a wget.log date | tee -a wget.log
Notes:
--trust-server-names permet de sauvegarder le noms des pages en suivant l'URL rewriting (donc garder /2017/07/blah-blah.html plutôt que /index.html?p=1234)
-D permet de limiter les (sous-)domaines à scraper et donc est très important pour éviter de se retrouver à télécharger le Web au complet
2.3. Modifications post-wget
Une fois qu'on a téléchargé le site, il y a souvent des modifications de masse à appliquer aux fichiers.
2.3.1. Le domaine du base
Souvent, les liens contenus dans les pages font références aux pages du même site avec des liens absolus plutôt que des liens relatifs (p.ex. https://mondomaine.org/revolution/ plutôt que /revolution). Or, l'idée d'une page statique est généralement qu'on veut pouvoir la déplacer sans trop de problèmes. Il arrive souvent qu'on fossilise des sites d'un événement qui se reproduit à chaque année. Ces pages fossilisées devront donc avoir un autre domaine que ce qu'elles avait avant.
Pour régler ça, on va rouler des sed.
Attention, ces commandes ne sont probablement pas exhaustives
cd RacineDuWget find . -type f | xargs sed -i 's;<thumbnail_url>https://summit.fabcity-montreal.quebec/;<thumbnail_url>/;g' find . -type f | xargs sed -i 's;src="https://summit.fabcity-montreal.quebec/;src="/;g' find . -type f | xargs sed -i 's;url="https://summit.fabcity-montreal.quebec/;url="/;g' find . -type f | xargs sed -i 's;href="https://summit.fabcity-montreal.quebec/;href="/;g'
2.3.2. Enlever les références aux /index.html et préférer pointer vers les dossier
On préfère aussi généralement que les liens entre les pages du site ne pointent pas vers des URL /index.html, mais directement vers le dossier (p.ex.: mondomaine.org/revolution et non mondomaine.org/revolution/index.html). S'il y a un sitemap, il faut faire ce changement, sinon, c'est pas obligatoire. Pour ce faire, on peut rouler cette commande:
cd RacineDuWget find . -type f | xargs sed -i "s;/index.html;/;g"
2.3.3. background-images: url(index.html) dans les CSS
Des fois, il y des images chargées via les CSS dans le tag "background-image:" l'option "url()" qui ne sont pas téléchargées par wget. Dans ce cas, wget modifie le lien vers l'image par "index.html". Je n'ai pas trouvé d'autres façons que de régler le problèmes à la main. Pour voir s'il y a ce problème, on fait ce grep:
grep -lr "url(index.html)" RacineDuWget/*
Pour chaque fichier, on va devoir aller voir la page d'origine, trouver l'image, la télécharger, la placer au bon endroit dans l'arborescence et modifier "index.html" par le bon URL.
2.3.4. sitemap
À cette étape, on va reprendre les fichiers téléchargés plus tôt et les mettre dans la racine du dossier créé par wget. Attention, il va probablement manquer un fichier pour les CSS afin que les pages des sitemap s'affichent comme du monde. Pour le trouver, regarder les premières lignes des fichiers .xml. Il va y avoir une ligne semblable à ça: {{{<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//summit.fabcity-montreal.quebec/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl"?> }}}
On va donc recréer le path dans le nouveau dossier et aller chercher le fichier original dans les fichiers de WordPress. Enfin, pour s'assurer que le sitemap continue de marcher même si on déplace le site à un autre domaine, il faut modifier la ligne citée ci-haut pour enlever le domaine jusqu'à "wp-content". Pour reprendre le même exemple utilisé ci-haut, on veut que la ligne ressemble à ça: {{{<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="wp-content/plugins/wordpress-seo/css/main-sitemap.xsl"?> }}}
Pour faire rapide, on peut utiliser cette commande:
find . -maxdepth 1 -iname "*.xml" | xargs sed -i 's;//summit.fabcity-montreal.quebec/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl;wp-content/plugins/wordpress-seo/css/main-sitemap.xsl;g'
2.3.5. Ajuster les permissions du dossier
Une fois que tout est beau, on veut ajuster les permissions des fichiers en fontions du serveurs web. Pour un serveur avec AlternC, on veut utiliser fixperms.sh -u [UID]
Voilà, il manque juste à tester!
3. Autres solutions
La solution ci-haut dépend de wget pour faire l'archive, mais d'autres solutions existent:
Autistici's Crawl is what they use to archive dead sites into WARC files (also used by the Internet Archive) with pywb to display the archives
Hetritrix is the crawler used by the Internet Archive, but it's a huge Java thing that talks XML
Apache Nutch is another big Java thing, built on top of Hadoop. Similar: StormCrawler
HTTrack is another classic
HTTrack + Github Pages --> includes a pretty good pre-fossilising checklist
None of those can archive dynamic websites like Facebook, which require a client-side Javascript runtime to construct the pages. Consider wpull for this.
See also anarcat's documentation on the topic.
ArchiveBox serait un autre candidat potentiel pour archiver direct en html + media
3.1. Créer un WebArchive (warc) avec crawl
Installer crawl:
apt-get install crawl
Créer l'archive:
crawl https://example.com/
3.1.1. Comment servir un siteweb en format warc?
Options:
Liste d'autres outils: https://github.com/dhamaniasad/WARCTools
3.2. Extraire de la Wayback Machine
That thing does it all and well: https://github.com/hartator/wayback-machine-downloader
Mettons que les backups ont vraiment mal marché...
Ca m'a causé 2 problèmes:
- les css étaient sauvegardés en genre: asdf.css?patate=oui, fake ca loadait pas, fallait que mv asdf.css?patate=oui asdf.css
- même affaire pour le javascript
Pas toutes les images avaient été copiées, j'ai du rouler: for i in `find . -iname "*html"` ; do wget -x `cat $i | grep "img src=" | sed -e 's#img src="\([^"]*\)"#\n====\1===\n#g' | grep ==== | tr -d '=' | sed -e 's#http://asdf.com#https://web.archive.org/web/20160502204710/http://asdf.com/#'` ; done
Sinon, c'est pas pire
3.2.1. Expérience avec hexagram.uqam.ca (Drupal 6)
-- emmanuel 2021-05-10 06:28:46
Ref: Redmine: https://rt.koumbit.net/rt/Ticket/Display.html?id=1359752
- Cette méthode fonctionne bien mais il faut faire plusieurs ajustements tels que soulignés plus haut et il manquait malgré tout 400+ fichiers.
- J'essaierai probablement avec un spider la prochaine fois pour comparer. Il reste qu'avec cette méthode¯ on obtient un site qui va finir par être fonctionnel.
- Pour les fichiers qui ont un caractère en trop à la fin de leur nom après le ?, voici ce que j'ai fait.
# pour les caractères find . -name "*\?*" -type f (...) ./sites/all/modules/contrib/jquery_update/replace/jquery.min.js?K (...) find . -name "*\?[a-zA-Z]" -type f -exec rename -f 's/..$//' {} \; # pour les chiffres: find . -name "*\?[0-9]" -type f -exec rename -f -n 's/..$//' {} \;
- Il faut se débarasser des urls absolues pour les SRC et les HREF.
- L'url absolue peut aussi avoir un www devant le nom de domaine.
grep -ril '="http://hexagram.uqam.ca' * > urls.absolus.txt while read line ; do perl -i -ne 'print "$_\n\n" if s#src="http://hexagram.uqam.ca/#src="/#g' $line; done < urls.absolus.txt while read line ; do perl -i -ne 'print "$_\n\n" if s#href="http://hexagram.uqam.ca/#href="/#g' $line; done < urls.absolus.txt
- Il va sûrement manquer des fichiers images, alors on peut faire un rsync entre les répertoires ./files du site en prod et du site en fossilisation.
Pour Drupal 6 & 7 on peut installer le module URL List qui va lister toutes les urls.
URL list | Drupal.org : https://www.drupal.org/project/urllist
Ensuite à partir de cette liste d'urls (voir la doc du module, c'est un fichier texte qui est généré à par exemple http://hexagram.uqam.ca/urllist.txt), on créé une liste d'urls pour tester le site à fossiliser en remplaçant le nom de domaine en prod avec le nom de domaine du site dev.
$ while read url;do echo $url | perl -pe 's/uqam.ca/wpdev0.koumbit.net/';done < urllist.txt > urls.wpdev0.txt
Ensuite on teste pour les 404:
while read url; do echo "$url" >> curl.txt; curl -I 2>/dev/null $url |head -1 >> curl.txt; echo "" >> curl.txt; done < urls.wpdev0.tx # combien de 404? $ grep 404 curl.txt |wc -l
On va créé un fichier avec juste les 404:
$ grep -B1 404 curl.txt > 404.wpdev0.txt # ça va donner quelque chose comme ça: (...) -- http://hexagram.wpdev0.koumbit.net/taxonomy/term/140 HTTP/1.1 404 Not Found -- http://hexagram.wpdev0.koumbit.net/taxonomy/term/144 HTTP/1.1 404 Not Found -- http://hexagram.wpdev0.koumbit.net/taxonomy/term/145 HTTP/1.1 404 Not Found (...)
- Dans le site on va se créer un répertoire pour télécharger les fichiers manquants et pour ne pas risquer de gâcher le travail qu'on a fait précédemment.
$ grep http ../404.wpdev0.txt > 404.urls.wpdev0.txt $ perl -pi.bk -e 's/wpdev0.koumbit.net/uqam.ca/' 404.urls.wpdev0.tx $ ll total 76K -rw-rw-r--+ 1 emmanuel kt-ct 34K May 9 10:57 404.urls.wpdev0.txt -rw-rw-r--+ 1 emmanuel kt-ct 40K May 9 10:53 404.urls.wpdev0.txt.bk $ head 404.urls.wpdev0.txt http://hexagram.uqam.ca/content/activit%C3%A9-x-test http://hexagram.uqam.ca/content/portes-ouvertes-hexagramuqam http://hexagram.uqam.ca/content/si-joublie-mon-mot-de-passe http://hexagram.uqam.ca/content/project-x http://hexagram.uqam.ca/content/project-y (...)
- On va chercher les fichiers manquants avec wget (les args user/password s'il y a un .htaccess sur le site).
$ while read url; do wget --user='hexagram' --password='supersecret1234' $url;done < ../404.urls.wpdev0.tx
- On peut vérifier ce qu'on a reçu avec la liste originale et voir si on a attrapé toutes les pages.
$ ll |wc -l 434 $ cat 404.urls.wpdev0.txt |wc -l 495 # oups il manque plus de 60 fichiers ici
- On refait la routine avec les urls absolues pour SRC et HREF (voir plus haut).
- On bouge les fichiers dans leurs répertoires respectifs et on les renomme 'index.html'.
Par exemple drupal va comprendre cette url: http://hexagram.wpdev0.koumbit.net/taxonomy/term/137/
Mais pour un site fossilisé il faut: http://hexagram.wpdev0.koumbit.net/taxonomy/term/137/index.html
# exemple avec 'content' # on créé d'abord un fichier avec toutes les urls qui contiennent /content/ $ while read url; do echo $url | perl -ne 'print "$2\n" if m#/(content)/(.+)#';done < 404.urls.wpdev0.txt > mv.content.txt # ensuite on créé le répertoire et le fichier index.html # ce qui va donner dans notre exemple: /content/alternate-visions/index.html # et pour l'url: http://hexagram.wpdev0.koumbit.net/content/alternate-visions/ # attention aux urls encodées, il faut les décoder pour avoir le bon nom de fichier quand celui-ci a des accents par exemple. # c'est pour cela qu'on utilise ici urldecode de php $ while read file; do F=$(php -r "echo urldecode('$file');"); mkdir ./content/$F; mv $F ./content/$F/index.html;done < ../mv.content.txt
En faisant cette opération, on va avoir probablement des avertissements qui indiquent probablement des fichiers manquants, vide, ou non pertinents qu'on pourra aller chercher plus tard.
mv: cannot stat 'muet': No such file or directory mv: cannot stat 'réunion-cd-2011-11-09': No such file or directory mv: cannot stat 'réunion-cd-2011-11-24': No such file or directory mv: cannot stat 'réunion-cd-2011-12-08': No such file or directory
- Maintenant on peut rsync ces contenus dans le site
rsync -av ./404.wpdev0/content ./content
- Et on finit en vérifiant ce qui manque, ce qui n'est pas nécessairement grand chose en reprenant notre liste du module URL List et en la faisant pointer à présent sur notre site en dev.
$ while read url; do echo "$url" >> curl.txt; curl -I 2>/dev/null $url |head -1 >> curl.txt; echo "" >> curl.txt; done < urls.wpdev0.txt $ grep 404 curl.txt |wc -l 21