]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/dird/autoprune.c
Start applying new FSFE copyright.
[bacula/bacula] / bacula / src / dird / autoprune.c
1 /*
2  *
3  *   Bacula Director -- Automatic Pruning
4  *      Applies retention periods
5  *
6  *     Kern Sibbald, May MMII
7  *
8  *   Version $Id$
9  */
10 /*
11    Bacula® - The Network Backup Solution
12
13    Copyright (C) 2002-2006 Free Software Foundation Europe e.V.
14
15    The main author of Bacula is Kern Sibbald, with contributions from
16    many others, a complete list can be found in the file AUTHORS.
17    This program is Free Software; you can redistribute it and/or
18    modify it under the terms of version two of the GNU General Public
19    License as published by the Free Software Foundation plus additions
20    that are listed in the file LICENSE.
21
22    This program is distributed in the hope that it will be useful, but
23    WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25    General Public License for more details.
26
27    You should have received a copy of the GNU General Public License
28    along with this program; if not, write to the Free Software
29    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30    02110-1301, USA.
31
32    Bacula® is a registered trademark ofJohn Walker.
33    The licensor of Bacula is the Free Software Foundation Europe
34    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
35    Switzerland, email:ftf@fsfeurope.org.
36 */
37
38 #include "bacula.h"
39 #include "dird.h"
40 #include "ua.h"
41
42 /* Forward referenced functions */
43
44
45 /*
46  * Auto Prune Jobs and Files. This is called at the end of every
47  *   Job.  We do not prune volumes here.
48  */
49 void do_autoprune(JCR *jcr)
50 {
51    UAContext *ua;
52    CLIENT *client;
53    bool pruned;
54
55    if (!jcr->client) {                /* temp -- remove me */
56       return;
57    }
58
59    ua = new_ua_context(jcr);
60
61    client = jcr->client;
62
63    if (jcr->job->PruneJobs || jcr->client->AutoPrune) {
64       Jmsg(jcr, M_INFO, 0, _("Begin pruning Jobs.\n"));
65       prune_jobs(ua, client, jcr->JobType);
66       pruned = true;
67    } else {
68       pruned = false;
69    }
70
71    if (jcr->job->PruneFiles || jcr->client->AutoPrune) {
72       Jmsg(jcr, M_INFO, 0, _("Begin pruning Files.\n"));
73       prune_files(ua, client);
74       pruned = true;
75    }
76    if (pruned) {
77       Jmsg(jcr, M_INFO, 0, _("End auto prune.\n\n"));
78    }
79
80    free_ua_context(ua);
81    return;
82 }
83
84 /*
85  * Prune all volumes in current Pool. This is called from
86  *   catreq.c when the Storage daemon is asking for another
87  *   volume and no appendable volumes are available.
88  *
89  *  Return 0: on error
90  *         number of Volumes Purged
91  */
92 int prune_volumes(JCR *jcr)
93 {
94    int stat = 0;
95    int i;
96    uint32_t *ids = NULL;
97    int num_ids = 0;
98    MEDIA_DBR mr;
99    UAContext *ua;
100
101    if (!jcr->job->PruneVolumes && !jcr->pool->AutoPrune) {
102       Dmsg0(100, "AutoPrune not set in Pool.\n");
103       return 0;
104    }
105    memset(&mr, 0, sizeof(mr));
106    ua = new_ua_context(jcr);
107
108    db_lock(jcr->db);
109
110    /* Get the List of all media ids in the current Pool */
111    if (!db_get_media_ids(jcr, jcr->db, jcr->jr.PoolId, &num_ids, &ids)) {
112       Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
113       goto bail_out;
114    }
115
116    /* Visit each Volume and Prune it */
117    for (i=0; i<num_ids; i++) {
118       mr.MediaId = ids[i];
119       if (!db_get_media_record(jcr, jcr->db, &mr)) {
120          Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
121          continue;
122       }
123       /* Prune only Volumes from current Pool */
124       if (jcr->jr.PoolId != mr.PoolId) {
125          continue;
126       }
127       /* Don't prune archived volumes */
128       if (mr.Enabled == 2) {
129          continue;
130       }
131       /* Prune only Volumes with status "Full", or "Used" */
132       if (strcmp(mr.VolStatus, "Full")   == 0 ||
133           strcmp(mr.VolStatus, "Used")   == 0) {
134          Dmsg1(200, "Prune Volume %s\n", mr.VolumeName);
135          stat += prune_volume(ua, &mr);
136          Dmsg1(200, "Num pruned = %d\n", stat);
137       }
138    }
139
140 bail_out:
141    db_unlock(jcr->db);
142    free_ua_context(ua);
143    if (ids) {
144       free(ids);
145    }
146    return stat;
147 }