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.

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 :

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:

  1. Retrouver le nid maximal du site: drush @site sqlq "select max(nid) from node;"

  2. 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
  3. Retrouver le term maximal du site: drush @site sqlq "select max(tid) from term_data;

  4. 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:

2. Archiver un wordpress

Exemples de fossilisation WordPress:

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:

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:

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:

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:

None of those can archive dynamic websites like Facebook, which require a client-side Javascript runtime to construct the pages. Consider wpull for this.

3.1. Créer un WebArchive (warc) avec crawl

réf

  1. Installer crawl:

    apt-get install crawl
  2. Créer l'archive:

    crawl https://example.com/

3.1.1. Comment servir un siteweb en format warc?

Options:

  1. pywb

  2. 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:

  1. les css étaient sauvegardés en genre: asdf.css?patate=oui, fake ca loadait pas, fallait que mv asdf.css?patate=oui asdf.css
  2. même affaire pour le javascript
  3. 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

# 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

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

(...)

$ 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

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

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


CategoryDrupal

Fossilisation (last edited 2024-11-07 16:34:19 by jablossy)