1. Archiver un site drupal

Voir aussi http://drupal.org/node/27882 et https://www.drupal.org/project/static

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/

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. Plusiuers 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.2. 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.3. 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

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

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

2.1.1. Comment servir un siteweb en format warc?

Options:

  1. pywb

  2. Liste d'autres outils: https://github.com/dhamaniasad/WARCTools

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


CategoryDrupal

Fossilisation (last edited 2018-12-20 18:05:07 by JaimeMacLean)