Overview
Comment:Configuration : sauvegardes et restauration
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: e95cd814fb43561da1d3bae13bb950adf4a0d09c
User & Date: bohwaz on 2013-01-31 18:09:44
Other Links: manifest | tags
Context
2013-02-01
00:25
Fix [072d4d7af7] saisie de décimales dans chrome check-in: 24bcfcad7b user: bohwaz tags: trunk
2013-01-31
18:09
Configuration : sauvegardes et restauration check-in: e95cd814fb user: bohwaz tags: trunk
16:33
Ne pas faire de recherche quand on ne cherche rien + utilisation correcte de trim grumpf check-in: 6fc285dd46 user: bohwaz tags: trunk
Changes

Added include/class.sauvegarde.php version [be28d1c4fd].







































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php

namespace Garradin;

class Sauvegarde
{
	const NEED_UPGRADE = 'nu';

	public function getList()
	{
		$out = array();
		$dir = dir(GARRADIN_ROOT);

		while ($file = $dir->read())
		{
			if ($file[0] != '.' && is_file(GARRADIN_ROOT . '/' . $file) && preg_match('![\w\d._-]+\.sqlite$!i', $file))
			{
				$out[] = $file;
			}
		}

		$dir->close();

		return $out;
	}

	public function create()
	{
		$this->syncDB();
		$backup = str_replace('.sqlite', date('.Y-m-d-H-i') . '.sqlite', GARRADIN_DB_FILE);
		copy(GARRADIN_DB_FILE, $backup);
		return basename($backup);
	}

	protected function syncDB()
	{
		$db = DB::getInstance();
		$db->exec('END;');
		return true;
	}

	public function remove($file)
	{
		if (preg_match('!\.\.+|/!', $file) || !preg_match('!^[\w\d._-]+$!i', $file))
		{
			throw new UserException('Nom de fichier non valide.');
		}

		return unlink(GARRADIN_ROOT . '/' . $file);
	}

	public function dump()
	{
		$this->syncDB();
		$in = fopen(GARRADIN_DB_FILE, 'r');
        $out = fopen('php://output', 'w');

        while (!feof($in))
        {
        	fwrite($out, fread($in, 8192));
        }

        fclose($in);
        fclose($out);
        return true;
	}

	public function restoreFromLocal($file)
	{
		if (preg_match('!\.\.+|/!', $file) || !preg_match('!^[\w\d._-]+$!i', $file))
		{
			throw new UserException('Nom de fichier non valide.');
		}

		return $this->restoreDB(GARRADIN_ROOT . '/' . $file);
	}

	public function restoreFromUpload($file)
	{
		if (empty($file['size']) || empty($file['tmp_name']) || !empty($file['error']))
		{
			throw new UserException('Le fichier n\'a pas été correctement envoyé. Essayer de le renvoyer à nouveau.');
		}

		$r = $this->restoreDB($file['tmp_name']);

		if ($r)
		{
			unlink($file['tmp_name']);
		}

		return $r;
	}

	protected function restoreDB($file)
	{
		try {
			$db = new SQLite3($file, SQLITE3_OPEN_READONLY);
		}
		catch (Exception $e)
		{
			throw new UserException('Le fichier fourni n\'est pas une base de données valide. ' .
				'Message d\'erreur de SQLite : ' . $e->getMessage());
		}

		$check = $db->querySingle('PRAGMA integrity_check;');

		if (strtolower(trim($check)) != 'ok')
		{
			throw new UserException('Le fichier fourni est corrompu. SQLite a trouvé ' . $check . ' erreurs.');
		}

		// Une vérification de base quand même
		$table = $db->querySingle('SELECT 1 FROM sqlite_master WHERE type=\'table\';');

		if (!$table)
		{
			throw new UserException('Le fichier fourni ne semble pas contenir de données liées à Garradin.');
		}

		$version = $db->querySingle('SELECT version FROM config;');

		$db->close();

		$backup = str_replace('.sqlite', date('.Y-m-d-H-i') . '.pre-restore.sqlite', GARRADIN_DB_FILE);
		
		if (!rename(GARRADIN_DB_FILE, $backup))
		{
			throw new \RuntimeException('Unable to backup current DB file.');
		}

		if (!copy($file, GARRADIN_DB_FILE))
		{
			throw new \RuntimeException('Unable to copy backup DB to main location.');
		}

		if ($version != garradin_version())
		{
			return self::NEED_UPGRADE;
		}

		return true;
	}

}

?>

Added templates/admin/config/_menu.tpl version [52ebd9d657].















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<ul class="actions">
    <li{if $current == 'index'} class="current"{/if}><a href="{$www_url}admin/config/">Général</a></li>
    <li{if $current == 'membres'} class="current"{/if}><a href="{$www_url}admin/config/membres.php">Fiche des membres</a></li>
    <li{if $current == 'site'} class="current"{/if}><a href="{$www_url}admin/config/site.php">Site public</a></li>
    <li{if $current == 'donnees'} class="current"{/if}><a href="{$www_url}admin/config/donnees.php">Données&nbsp;: sauvegarde et restauration</a></li>
    <li{if $current == 'import'} class="current"{/if}><a href="{$www_url}admin/config/import.php">Import &amp; export</a></li>
</ul>

Added templates/admin/config/donnees.tpl version [241063d7b5].





























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
{include file="admin/_head.tpl" title="Données — Sauvegarde et restauration" current="config"}

{include file="admin/config/_menu.tpl" current="donnees"}

<form method="post" action="{$self_url|escape}">

<fieldset>
    <legend>Sauvegarde automatique</legend>
    <p class="help">
        En activant cette option une sauvegarde sera automatiquement créée à chaque intervalle donné.
        Par exemple en activant une sauvegarde hebdomadaire, une copie des données sera réalisée
        une fois par semaine, sauf si aucune modification n'a été effectuée sur les données
        ou que personne ne s'est connecté.
    </p>
    <dl>
        <dt><label for="f_frequency">Intervalle de sauvegarde</label></dt>
        <dd>
            <select name="frequency" id="f_frequency">
                <option value="0">Aucun — les sauvegardes automatiques sont désactivées</option>
                <option value="1">Quotidien</option>
                <option value="7">Hebdomadaire</option>
                <option value="15">Bi-hebdomadaire</option>
                <option value="30">Mensuel</option>
                <option value="90">Trimestriel</option>
                <option value="365">Annuel</option>
            </select>
        </dd>
        <dt><label for="f_max_backups">Nombre de sauvegardes conservées</label></dt>
        <dd class="help">
            Par exemple avec l'intervalle mensuel, en indiquant de conserver 12 sauvegardes,
            vous pourrez garder un an d'historique de sauvegardes.
        </dd>
        <dd class="help">
            <strong>Attention :</strong> si vous choisissez un nombre important et un intervalle réduit,
            l'espace disque occupé par vos sauvegardes va rapidement augmenter.
        </dd>
        <dd><input type="number" name="keep_max" if="f_max_backups" min="1" max="90" /></dd>
    </dl>
    <p>
        <input type="submit" name="backup" value="Créer une nouvelle sauvegarde des données" />
    </p>
</fieldset>

</form>
<form method="post" action="{$self_url|escape}">

<fieldset>
    <legend>Copies de sauvegarde disponibles</legend>
    {if empty($liste)}
        <p class="help">Aucune copie de sauvegarde disponible.</p>
    {else}
        <dl>
        {foreach from=$liste item="f"}
            <dd>
                <label>
                    <input type="radio" name="file" value="{$f|escape}" />
                    {$f|escape}
                </label>
            </dd>
        {/foreach}
        </dl>
        <p>
            <input type="submit" name="restore" value="Restaurer cette sauvegarde" />
            <input type="submit" name="remove" value="Supprimer cette sauvegarde" />
        </p>
    {/if}
</fieldset>

</form>
<form method="post" action="{$self_url|escape}">

<fieldset>
    <legend>Sauvegarde</legend>
    <p>
        <input type="submit" name="backup" value="Créer une nouvelle sauvegarde des données" />
    </p>
</fieldset>

</form>
<form method="post" action="{$self_url|escape}">

<fieldset>
    <legend>Téléchargement</legend>
    <p>
        <input type="submit" name="download" value="Télécharger une copie des données sur mon ordinateur" />
    </p>
</fieldset>

<form method="post" action="{$self_url|escape}">
</form>

<fieldset>
    <legend><label for="f_file">Restaurer depuis un fichier</label></legend>
    <p class="alert">
        Attention, l'intégralité des données courantes seront effacées et remplacées par celles
        contenues dans le fichier fourni.
    </p>
    <p class="help">
        Une sauvegarde des données courantes sera effectuée avant le remplacement,
        en cas de besoin d'annuler cette restauration.
    </p>
    <p>
        <input type="file" name="file" id="f_file" />
        <input type="submit" name="restore_file" value="Restaurer depuis le fichier sélectionné" />
    </p>
</fieldset>

</form>

{include file="admin/_foot.tpl"}

Added templates/admin/config/import.tpl version [8a9bbe0a3f].































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{include file="admin/_head.tpl" title="Import & export" current="config"}

{include file="admin/config/_menu.tpl" current="import"}

<fieldset>
<dl>
	<dt>Membres</dt>
    <dd><a href="{$admin_url}membres/export.php">Export de la liste des membres en CSV (pour tableurs)</a></dd>
    <dt>Comptabilité</dt>
    <dd><a href="{$admin_url}compta/import.php">Import des données comptables</a></dd>
    <dd><a href="{$admin_url}compta/export.php">Export des données comptables en CSV</a></dd>
</dl>
</fieldset>

{include file="admin/_foot.tpl"}

Modified templates/admin/config/index.tpl from [d3a9ce1c4b] to [ac7341eb6b].

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    {else}
    <p class="error">
        {$error|escape}
    </p>
    {/if}
{/if}

<ul class="actions">
    <li class="current"><a href="{$www_url}admin/config/">Général</a></li>
    <li><a href="{$www_url}admin/config/membres.php">Fiche des membres</a></li>
    <li><a href="{$www_url}admin/config/site.php">Site public</a></li>
</ul>

<form method="post" action="{$self_url|escape}">

    <fieldset>
        <legend>Garradin</legend>
        <dl>
            <dt>Version installée</dt>







|
<
<
<
<







8
9
10
11
12
13
14
15




16
17
18
19
20
21
22
    {else}
    <p class="error">
        {$error|escape}
    </p>
    {/if}
{/if}

{include file="admin/config/_menu.tpl" current="index"}





<form method="post" action="{$self_url|escape}">

    <fieldset>
        <legend>Garradin</legend>
        <dl>
            <dt>Version installée</dt>

Modified templates/admin/config/membres.tpl from [eb401f2a70] to [00ff0a0698].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{include file="admin/_head.tpl" title="Configuration — Fiche membres" current="config"}

<ul class="actions">
    <li><a href="{$www_url}admin/config/">Général</a></li>
    <li class="current"><a href="{$www_url}admin/config/membres.php">Fiche des membres</a></li>
    <li><a href="{$www_url}admin/config/site.php">Site public</a></li>
</ul>

{if $error}
    {if $error == 'OK'}
    <p class="confirm">
        La configuration a bien été enregistrée.
    </p>
    {elseif $error == 'ADD_OK'}


|
<
<
<
<







1
2
3




4
5
6
7
8
9
10
{include file="admin/_head.tpl" title="Configuration — Fiche membres" current="config"}

{include file="admin/config/_menu.tpl" current="membres"}





{if $error}
    {if $error == 'OK'}
    <p class="confirm">
        La configuration a bien été enregistrée.
    </p>
    {elseif $error == 'ADD_OK'}

Modified templates/admin/config/site.tpl from [c187de18fa] to [758d7caa10].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{include file="admin/_head.tpl" title="Configuration" current="config"}

{if $error && $error != 'OK'}
    <p class="error">
        {$error|escape}
    </p>
{/if}

<ul class="actions">
    <li><a href="{$www_url}admin/config/">Général</a></li>
    <li><a href="{$www_url}admin/config/membres.php">Membres</a></li>
    <li class="current"><a href="{$www_url}admin/config/site.php">Site public</a></li>
</ul>

{if isset($edit)}
    <form method="post" action="{$self_url|escape}">
        <h3>Éditer un squelette</h3>

        {if $error == 'OK'}
        <p class="confirm">
|







|
<
<
<
<







1
2
3
4
5
6
7
8
9




10
11
12
13
14
15
16
{include file="admin/_head.tpl" title="Configuration — Site public" current="config"}

{if $error && $error != 'OK'}
    <p class="error">
        {$error|escape}
    </p>
{/if}

{include file="admin/config/_menu.tpl" current="site"}





{if isset($edit)}
    <form method="post" action="{$self_url|escape}">
        <h3>Éditer un squelette</h3>

        {if $error == 'OK'}
        <p class="confirm">

Added www/admin/config/_inc.php version [04e5b052de].

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<?php

namespace Garradin;

require_once __DIR__ . '/../_inc.php';

if ($user['droits']['config'] < Membres::DROIT_ADMIN)
{
    throw new UserException("Vous n'avez pas le droit d'accéder à cette page.");
}

?>

Added www/admin/config/donnees.php version [828cf46bd2].



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
namespace Garradin;

require_once __DIR__ . '/_inc.php';

$s = new Sauvegarde;

if (utils::get('sauvegarde'))
{

}

$tpl->assign('liste', $s->getList());

$tpl->display('admin/config/donnees.tpl');

?>

Added www/admin/config/import.php version [84fe620fc0].

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
<?php
namespace Garradin;

require_once __DIR__ . '/_inc.php';

$tpl->display('admin/config/import.tpl');

?>

Modified www/admin/config/index.php from [62753fd222] to [b039079021].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace Garradin;

require_once __DIR__ . '/../_inc.php';

if ($user['droits']['config'] < Membres::DROIT_ADMIN)
{
    throw new UserException("Vous n'avez pas le droit d'accéder à cette page.");
}

$error = false;

if (isset($_GET['ok']))
{
    $error = 'OK';
}



|
<
<
<
<
<







1
2
3
4





5
6
7
8
9
10
11
<?php
namespace Garradin;

require_once __DIR__ . '/_inc.php';






$error = false;

if (isset($_GET['ok']))
{
    $error = 'OK';
}

Modified www/admin/config/membres.php from [b2a837546b] to [7233ffcadf].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144


145
146
147
<?php
namespace Garradin;

require_once __DIR__ . '/../_inc.php';

if ($user['droits']['config'] < Membres::DROIT_ADMIN)
{
    throw new UserException("Vous n'avez pas le droit d'accéder à cette page.");
}

$error = false;

// Restauration de ce qui était en session
if ($champs = $membres->sessionGet('champs_membres'))
{
    $champs = new Champs_Membres($champs);
................................................................................
            {
                $error = $e->getMessage();
            }
        }
    }
}

function tpl_get_type($type)
{
    global $types;
    return $types[$type];
}

$tpl->assign('error', $error);
$tpl->assign('review', isset($_GET['review']) ? true : false);

$types = $champs->getTypes();

$tpl->assign('champs', $champs->getAll());
$tpl->assign('types', $types);
$tpl->assign('presets', Champs_Membres::listUnusedPresets($champs));
$tpl->assign('new', utils::post('new'));

$tpl->register_modifier('get_type', 'Garradin\tpl_get_type');


$tpl->display('admin/config/membres.tpl');

?>



|
<
<
<
<
<







 







<
<
<
<
<
<










|
>
>



1
2
3
4





5
6
7
8
9
10
11
...
116
117
118
119
120
121
122






123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
namespace Garradin;

require_once __DIR__ . '/_inc.php';






$error = false;

// Restauration de ce qui était en session
if ($champs = $membres->sessionGet('champs_membres'))
{
    $champs = new Champs_Membres($champs);
................................................................................
            {
                $error = $e->getMessage();
            }
        }
    }
}







$tpl->assign('error', $error);
$tpl->assign('review', isset($_GET['review']) ? true : false);

$types = $champs->getTypes();

$tpl->assign('champs', $champs->getAll());
$tpl->assign('types', $types);
$tpl->assign('presets', Champs_Membres::listUnusedPresets($champs));
$tpl->assign('new', utils::post('new'));

$tpl->register_modifier('get_type', function ($type) use ($types) {
    return $types[$type];
});
$tpl->display('admin/config/membres.tpl');

?>

Modified www/admin/config/site.php from [280581e919] to [3f77107fc4].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace Garradin;

require_once __DIR__ . '/../_inc.php';

if ($user['droits']['config'] < Membres::DROIT_ADMIN)
{
    throw new UserException("Vous n'avez pas le droit d'accéder à cette page.");
}

$error = false;

if (isset($_GET['ok']))
{
    $error = 'OK';
}



|
<
<
<
<
<







1
2
3
4





5
6
7
8
9
10
11
<?php
namespace Garradin;

require_once __DIR__ . '/_inc.php';






$error = false;

if (isset($_GET['ok']))
{
    $error = 'OK';
}