domenica 20 maggio 2012

SMF forum fix

Mi sono ritrovato ad "ereditare" un backup SQL di un forum SMF.
Rimesso in piedi il tutto e installata qualche mod il tutto è "esploso" al primo update di SMF in quanto le mod installate non combaciavano con quanto riportato nel DB (Le mod installate nell'installazione originale non erano state reinstallate in quanto avevo solo il backup SQL e non i file).

Mi sono quindi trovato con un forum che funzionava ma con le mod disabilitate e l'impossibilità di installarne altre in quanto il DB conteneva già queste modifiche. Mi sono quindi posto il problema di come "sistemare" questo accrocchio.

ATTENZIONE tutto quello che segue è capacissimo, con una virgola fuori posto, ma anche senza, di segarvi non solo il database ma tutta la macchina. NON SCASSATEMI I CABASISI SE VI PIALLATE LA MACCHINA E NON AVETE UN BACKUP!

Fatta questa doverosa premessa, l'idea di base è esportare il database attuale ed importarlo in una nuova installazione SMF. Poichè il DB attuale ha più tabelle (con in alcuni casi più colonne) del DB pulito ho dovuto inventarmi un sistema per fare il tutto...

Dato il database di partenza FORUM e il database nuovo che chiameremo BACKUP (su installazione fresca dell'ultima versione di SMF) procediamo a leggere i nomi dei campi di una tabella, ad esportare i dati di questi soli campi dal DB di partenza e a metterli in un file di nome fix_$nome_tabella_table.sql

smf_fix_table (da chiamare con il nome tabella per parametro)


#!/bin/sh
list=`echo "describe $1;"| mysql -s backup -u backupuser --password='backuppassword' | awk '{print$1}'`
output="select "
count=0
for i in $list
  do
  if [ $count -gt 0 ]; then
    output=$output","
  fi
  output=$output" $i"
  count=1
  done
output=$output" from $1 into outfile 'fix_$1_table.sql';"
echo $output | mysql -s forum -u forumuser --password='forumpassword'


Questo script a sua volta verrà chiamato ricorsivamente da uno script che agirà sulle tabelle, chiama lo script precedente, copia il file nella cartella del DB di backup, tronca la tabella e carica il dump nella tabella corrispondente del db di backup, infine elimina i file di dump (per permettere più agevolmente una serie di drop database, create database, grant, import, etc, necessari a sperimentare ripetutamente per ottenere qualcosa di funzionante) :

smf_fix


#!/bin/sh
list=`echo "show tables;"| mysql -s backup -u backupuser --password='backupuser' | awk '{print$1}'`
for i in $list
  do
    filename="fix_"$i"_table.sql"
    ./smf_fix_table $i
    mv /var/lib/mysql/forum/$filename /var/lib/mysql/backup/
    echo "truncate table $i" | mysql -s backup -u backupuser --password='backuppassword'
    echo "load data local infile '/var/lib/mysql/backup/$filename' into table $i" | mysql -s backup -u backupuser --password='backuppassword'
    rm /var/lib/mysql/vtrspbackup/fix*
  done

Il forum che ne risulta è per quanto ho potuto verificare funzionante, usa TUTTE le login dell'originale (eliminando la login admin che avete creato in fase di installazione). 

Spero qualcuno si eviti qualche ora di craniate nel muro.