]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/qt-console/clients/clients.cpp
Allow --without-qwt configure option
[bacula/bacula] / bacula / src / qt-console / clients / clients.cpp
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2008 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of John Walker.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28  
29 /*
30  *   Version $Id$
31  *
32  *  Clients Class
33  *
34  *   Dirk Bartley, March 2007
35  *
36  */ 
37
38 #include <QAbstractEventDispatcher>
39 #include <QMenu>
40 #include "bat.h"
41 #include "clients/clients.h"
42 #include "run/run.h"
43 #include "status/clientstat.h"
44
45 Clients::Clients()
46 {
47    setupUi(this);
48    m_name = tr("Clients");
49    pgInitialize();
50    QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
51    thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/network-server.png")));
52
53    /* tableWidget, Storage Tree Tree Widget inherited from ui_client.h */
54    m_populated = false;
55    m_checkcurwidget = true;
56    m_closeable = false;
57    /* add context sensitive menu items specific to this classto the page
58     * selector tree. m_contextActions is QList of QActions */
59    m_contextActions.append(actionRefreshClients);
60    createContextMenu();
61    dockPage();
62 }
63
64 Clients::~Clients()
65 {
66 }
67
68 /*
69  * The main meat of the class!!  The function that querries the director and 
70  * creates the widgets with appropriate values.
71  */
72 void Clients::populateTable()
73 {
74    QTableWidgetItem *tableItem;
75    QBrush blackBrush(Qt::black);
76
77    if (!m_console->preventInUseConnect())
78       return;
79    m_checkcurwidget = false;
80    tableWidget->clear();
81    m_checkcurwidget = true;
82
83    QStringList headerlist = (QStringList() << tr("Client Name") << tr("File Retention")
84        << tr("Job Retention") << tr("AutoPrune") << tr("ClientId") << tr("Uname") );
85
86    tableWidget->setColumnCount(headerlist.count());
87    tableWidget->setHorizontalHeaderLabels(headerlist);
88    tableWidget->setRowCount(m_console->client_list.count());
89    tableWidget->verticalHeader()->hide();
90    int row = 0;
91
92    foreach (QString clientName, m_console->client_list){
93       /* Set up query QString and header QStringList */
94       QString query("");
95       query += "SELECT Name, FileRetention, JobRetention, AutoPrune, ClientId, Uname"
96            " FROM Client"
97            " WHERE ";
98       query += " Name='" + clientName + "'";
99       query += " ORDER BY ClientId LIMIT 1";
100
101       QStringList results;
102       /* This could be a log item */
103       if (mainWin->m_sqlDebug) {
104          Pmsg1(000, "Clients query cmd : %s\n",query.toUtf8().data());
105       }
106       if (m_console->sql_cmd(query, results)) {
107          int resultCount = results.count();
108          if (resultCount){
109             QString resultline;
110             QString field;
111             QStringList fieldlist;
112             resultline = results[resultCount - 1];
113             fieldlist = resultline.split("\t");
114
115             int column = 0;
116             /* Iterate through fields in the record */
117             foreach (field, fieldlist) {
118                field = field.trimmed();  /* strip leading & trailing spaces */
119                tableItem = new QTableWidgetItem(field, 1);
120                tableItem->setFlags(Qt::ItemIsSelectable);
121                tableItem->setForeground(blackBrush);
122                tableItem->setData(Qt::UserRole, 1);
123                tableWidget->setItem(row, column, tableItem);
124                column++;
125             }
126          }
127       }
128       row ++;
129    }
130    /* Resize the columns */
131    for(int cnter=0; cnter<headerlist.size(); cnter++) {
132       tableWidget->resizeColumnToContents(cnter);
133    }
134 }
135
136 /*
137  * When the treeWidgetItem in the page selector tree is singleclicked, Make sure
138  * The tree has been populated.
139  */
140 void Clients::PgSeltreeWidgetClicked()
141 {
142    if(!m_populated) {
143       populateTable();
144       m_populated=true;
145    }
146 }
147
148 /*
149  * Added to set the context menu policy based on currently active treeWidgetItem
150  * signaled by currentItemChanged
151  */
152 void Clients::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetItem *previouswidgetitem )
153 {
154    /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
155    if (m_checkcurwidget) {
156       int currentRow = currentwidgetitem->row();
157       QTableWidgetItem *currentrowzeroitem = tableWidget->item(currentRow, 0);
158       m_currentlyselected = currentrowzeroitem->text();
159
160       /* The Previous item */
161       if (previouswidgetitem) { /* avoid a segfault if first time */
162          tableWidget->removeAction(actionListJobsofClient);
163          tableWidget->removeAction(actionStatusClientInConsole);
164          tableWidget->removeAction(actionStatusClientWindow);
165          tableWidget->removeAction(actionPurgeJobs);
166          tableWidget->removeAction(actionPrune);
167       }
168
169       if (m_currentlyselected.length() != 0) {
170          /* set a hold variable to the client name in case the context sensitive
171           * menu is used */
172          tableWidget->addAction(actionListJobsofClient);
173          tableWidget->addAction(actionStatusClientInConsole);
174          tableWidget->addAction(actionStatusClientWindow);
175          tableWidget->addAction(actionPurgeJobs);
176          tableWidget->addAction(actionPrune);
177       }
178    }
179 }
180
181 /* 
182  * Setup a context menu 
183  * Made separate from populate so that it would not create context menu over and
184  * over as the tree is repopulated.
185  */
186 void Clients::createContextMenu()
187 {
188    tableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
189    tableWidget->addAction(actionRefreshClients);
190    /* for the tableItemChanged to maintain m_currentJob */
191    connect(tableWidget, SIGNAL(
192            currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)),
193            this, SLOT(tableItemChanged(QTableWidgetItem *, QTableWidgetItem *)));
194
195    /* connect to the action specific to this pages class */
196    connect(actionRefreshClients, SIGNAL(triggered()), this,
197                 SLOT(populateTable()));
198    connect(actionListJobsofClient, SIGNAL(triggered()), this,
199                 SLOT(showJobs()));
200    connect(actionStatusClientInConsole, SIGNAL(triggered()), this,
201                 SLOT(consoleStatusClient()));
202    connect(actionStatusClientWindow, SIGNAL(triggered()), this,
203                 SLOT(statusClientWindow()));
204    connect(actionPurgeJobs, SIGNAL(triggered()), this,
205                 SLOT(consolePurgeJobs()));
206    connect(actionPrune, SIGNAL(triggered()), this,
207                 SLOT(prune()));
208 }
209
210 /*
211  * Function responding to actionListJobsofClient which calls mainwin function
212  * to create a window of a list of jobs of this client.
213  */
214 void Clients::showJobs()
215 {
216    QTreeWidgetItem *parentItem = mainWin->getFromHash(this);
217    mainWin->createPageJobList("", m_currentlyselected, "", "", parentItem);
218 }
219
220 /*
221  * Function responding to actionListJobsofClient which calls mainwin function
222  * to create a window of a list of jobs of this client.
223  */
224 void Clients::consoleStatusClient()
225 {
226    QString cmd("status client=");
227    cmd += m_currentlyselected;
228    consoleCommand(cmd);
229 }
230
231 /*
232  * Virtual function which is called when this page is visible on the stack
233  */
234 void Clients::currentStackItem()
235 {
236    if(!m_populated) {
237       populateTable();
238       /* Create the context menu for the client table */
239       m_populated=true;
240    }
241 }
242
243 /*
244  * Function responding to actionPurgeJobs 
245  */
246 void Clients::consolePurgeJobs()
247 {
248    if (QMessageBox::warning(this, "Bat",
249       tr("Are you sure you want to purge ??  !!!.\n"
250 "The Purge command will delete associated Catalog database records from Jobs and"
251 " Volumes without considering the retention period. Purge  works only on the"
252 " Catalog database and does not affect data written to Volumes. This command can"
253 " be dangerous because you can delete catalog records associated with current"
254 " backups of files, and we recommend that you do not use it unless you know what"
255 " you are doing.\n\n"
256 " Is there any way I can get you to click Cancel here?  You really don't want to do"
257 " this\n\n"
258       "Press OK to proceed with the purge operation?"),
259       QMessageBox::Ok | QMessageBox::Cancel)
260       == QMessageBox::Cancel) { return; }
261
262    QString cmd("purge jobs client=");
263    cmd += m_currentlyselected;
264    consoleCommand(cmd);
265 }
266
267 /*
268  * Function responding to actionPrune
269  */
270 void Clients::prune()
271 {
272    new prunePage("", m_currentlyselected);
273 }
274
275 /*
276  * Function responding to action to create new client status window
277  */
278 void Clients::statusClientWindow()
279 {
280    QTreeWidgetItem *parentItem = mainWin->getFromHash(this);
281    new ClientStat(m_currentlyselected, parentItem);
282 }