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' );
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.
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.
Prépare un command.sh comme suit: 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
Une fois qu'on a téléchargé le site, il y a souvent des modifications de masse à appliquer aux fichiers.
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
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:
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: 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.
À 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:
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!
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
Installer crawl: Créer l'archive:
Options: Liste d'autres outils: https://github.com/dhamaniasad/WARCTools
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: 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
-- emmanuel 2021-05-10 06:28:46 Ref: Redmine: https://rt.koumbit.net/rt/Ticket/Display.html?id=1359752 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. Ensuite on teste pour les 404: On va créé un fichier avec juste les 404: 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 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. 2.1.2.2. Autres implémentations de lazy loading
2.1.3. Sitemap
2.2. Télécharger le site
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
2.3. Modifications post-wget
2.3.1. Le domaine du base
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
cd RacineDuWget
find . -type f | xargs sed -i "s;/index.html;/;g"
2.3.3. background-images: url(index.html) dans les CSS
grep -lr "url(index.html)" RacineDuWget/*
2.3.4. sitemap
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
3. Autres solutions
3.1. Créer un WebArchive (warc) avec crawl
apt-get install crawl
crawl https://example.com/
3.1.1. Comment servir un siteweb en format warc?
3.2. Extraire de la Wayback Machine
3.2.1. Expérience avec hexagram.uqam.ca (Drupal 6)
# 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/..$//' {} \;
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
$ while read url;do echo $url | perl -pe 's/uqam.ca/wpdev0.koumbit.net/';done < urllist.txt > urls.wpdev0.txt
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
$ 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
(...)
$ 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
(...)
$ while read url; do wget --user='hexagram' --password='supersecret1234' $url;done < ../404.urls.wpdev0.tx
$ ll |wc -l
434
$ cat 404.urls.wpdev0.txt |wc -l
495
# oups il manque plus de 60 fichiers ici
# 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
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
rsync -av ./404.wpdev0/content ./content
$ 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