00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "cupsddialog.h"
00021
00022
#include "cupsdpage.h"
00023
#include "cupsdconf.h"
00024
#include "cupsdserveridentitypage.h"
00025
#include "cupsdserverlogpage.h"
00026
#include "cupsdserverdirpage.h"
00027
#include "cupsdserverhttppage.h"
00028
#include "cupsdserverjobpage.h"
00029
#include "cupsdservermiscpage.h"
00030
#include "cupsdbrowsinggeneralpage.h"
00031
#include "cupsdbrowsingtimeoutpage.h"
00032
#include "cupsdsplash.h"
00033
#include "cupsdbrowsingmaskspage.h"
00034
#include "cupsdbrowsingconnpage.h"
00035
#include "cupsdnetworkgeneralpage.h"
00036
#include "cupsdbrowsingrelaypage.h"
00037
#include "cupsdnetworkclientspage.h"
00038
#include "cupsdserversecuritypage.h"
00039
#include "cupsdserverencryptpage.h"
00040
00041
#include <qdir.h>
00042
#include <qvbox.h>
00043
#include <kmessagebox.h>
00044
#include <klocale.h>
00045
#include <qfile.h>
00046
#include <qfileinfo.h>
00047
#include <kglobal.h>
00048
#include <kiconloader.h>
00049
#include <qstringlist.h>
00050
00051
#include <signal.h>
00052
00053
extern "C"
00054 {
00055
bool restartServer(
QString& msg)
00056 {
00057
return CupsdDialog::restartServer(msg);
00058 }
00059
bool configureServer(
const QString& configfile,
QWidget *parent)
00060 {
00061 CupsdDialog::configure(configfile,parent);
00062
return true;
00063 }
00064 }
00065
00066
int getServerPid()
00067 {
00068
QDir dir(
"/proc",QString::null,QDir::Name,QDir::Dirs);
00069
for (uint i=0;i<dir.count();i++)
00070 {
00071
if (dir[i] ==
"." || dir[i] ==
".." || dir[i] ==
"self")
continue;
00072
QFile f(
"/proc/" + dir[i] +
"/cmdline");
00073
if (f.exists() && f.open(IO_ReadOnly))
00074 {
00075
QTextStream t(&f);
00076
QString line;
00077 t >> line;
00078 f.close();
00079
if (line.right(5) ==
"cupsd" ||
00080 line.right(6).left(5) ==
"cupsd")
00081
00082
return dir[i].toInt();
00083 }
00084 }
00085
return (-1);
00086 }
00087
00088
00089
00090 CupsdDialog::CupsdDialog(
QWidget *parent,
const char *name)
00091 : MyDialogBase(parent, name)
00092 {
00093 KGlobal::iconLoader()->addAppDir(
"kdeprint");
00094 KGlobal::locale()->insertCatalogue(
"cupsdconf");
00095
00096 pagelist_.setAutoDelete(
false);
00097 filename_ =
"";
00098 conf_ = 0;
00099 constructDialog();
00100
00101 setCaption(i18n(
"CUPS Server Configuration"));
00102
00103 resize(500, 400);
00104 }
00105
00106 CupsdDialog::~CupsdDialog()
00107 {
00108
delete conf_;
00109 }
00110
00111
void CupsdDialog::constructDialog()
00112 {
00113 CupsdPage *cpage =
new CupsdSplash(0);
00114 pagelist_.append(cpage);
00115 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"fileprint"), cpage);
00116
00117 cpage =
new CupsdServerSecurityPage(0);
00118 pagelist_.append(cpage);
00119 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"folder_locked"), cpage);
00120
00121 cpage =
new CupsdBrowsingGeneralPage(0);
00122 pagelist_.append(cpage);
00123 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"kdeprint_printer_remote"), cpage);
00124
00125 cpage =
new CupsdBrowsingRelayPage(0);
00126 pagelist_.append(cpage);
00127 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"connect_established"), cpage);
00128
00129 cpage =
new CupsdBrowsingTimeoutPage(0);
00130 pagelist_.append(cpage);
00131 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"date"), cpage);
00132
00133 cpage =
new CupsdBrowsingMasksPage(0);
00134 pagelist_.append(cpage);
00135 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"encrypted"), cpage);
00136
00137 cpage =
new CupsdBrowsingConnPage(0);
00138 pagelist_.append(cpage);
00139 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"connect_no"), cpage);
00140
00141 cpage =
new CupsdNetworkGeneralPage(0);
00142 pagelist_.append(cpage);
00143 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"network"), cpage);
00144
00145 cpage =
new CupsdNetworkClientsPage(0);
00146 pagelist_.append(cpage);
00147 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"openterm"), cpage);
00148
00149 cpage =
new CupsdServerIdentityPage(0);
00150 pagelist_.append(cpage);
00151 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"gear"), cpage);
00152
00153 cpage =
new CupsdServerMiscPage(0);
00154 pagelist_.append(cpage);
00155 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"package_utilities"), cpage);
00156
00157 cpage =
new CupsdServerJobPage(0);
00158 pagelist_.append(cpage);
00159 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"kdeprint_job"), cpage);
00160
00161 cpage =
new CupsdServerEncryptPage(0);
00162 pagelist_.append(cpage);
00163 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"password"), cpage);
00164
00165 cpage =
new CupsdServerHTTPPage(0);
00166 pagelist_.append(cpage);
00167 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"konqueror"), cpage);
00168
00169 cpage =
new CupsdServerDirPage(0);
00170 pagelist_.append(cpage);
00171 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"folder"), cpage);
00172
00173 cpage =
new CupsdServerLogPage(0);
00174 pagelist_.append(cpage);
00175 addPage(cpage->pagePath(), cpage->header(), SmallIcon(
"contents"), cpage);
00176
00177 conf_ =
new CupsdConf();
00178
for (pagelist_.first();pagelist_.current();pagelist_.next())
00179 {
00180 pagelist_.current()->setDefaults();
00181 pagelist_.current()->setInfos(conf_);
00182 }
00183 }
00184
00185
bool CupsdDialog::setConfigFile(
const QString& filename)
00186 {
00187 filename_ = filename;
00188
if (!conf_->loadFromFile(filename_))
00189 {
00190 KMessageBox::error(
this, i18n(
"Error while loading configuration file!"), i18n(
"CUPS Configuration Error"));
00191
return false;
00192 }
00193
bool ok(
true);
00194
QString msg;
00195
for (pagelist_.first();pagelist_.current() && ok;pagelist_.next())
00196 ok = pagelist_.current()->loadConfig(conf_, msg);
00197
if (!ok)
00198 {
00199 KMessageBox::error(
this, msg, i18n(
"CUPS Configuration Error"));
00200
return false;
00201 }
00202
return true;
00203 }
00204
00205
void CupsdDialog::slotOk()
00206 {
00207 slotApply();
00208 MyDialogBase::slotOk();
00209 }
00210
00211
bool CupsdDialog::restartServer(
QString& msg)
00212 {
00213
int serverPid = getServerPid();
00214 msg.truncate(0);
00215
if (serverPid <= 0)
00216 {
00217 msg = i18n(
"Unable to find a running CUPS server");
00218 }
00219
else
00220 {
00221
if (::kill(serverPid, SIGHUP) != 0)
00222 msg = i18n(
"Unable to restart CUPS server (pid = %1)").arg(serverPid);
00223 }
00224
return (msg.isEmpty());
00225 }
00226
00227
#define DEFAULT_CONFIGFILE "/etc/cups/cupsd.conf"
00228
void CupsdDialog::configure(
const QString& filename,
QWidget *parent)
00229 {
00230
QString fn = (filename.isEmpty() ?
QString(DEFAULT_CONFIGFILE) : filename);
00231
QFileInfo fi(fn);
00232
QString errormsg;
00233
00234
if (!fi.exists()) errormsg = i18n(
"File \"%1\" doesn't exist!").arg(fn);
00235
00236
else if (!fi.isReadable()) errormsg = i18n(
"Can't open file \"%1\" !\nCheck file permissions.").arg(fn);
00237
00238
else if (!fi.isWritable()) errormsg = i18n(
"You are not allowed to modify file \"%1\" !\nCheck file permissions or contact system administrator.").arg(fn);
00239
00240
if (!errormsg.isEmpty())
00241 {
00242 KMessageBox::error(parent, errormsg, i18n(
"CUPS Configuration Error"));
00243 }
00244
else
00245 {
00246 CupsdDialog dlg(parent);
00247
if (dlg.setConfigFile(fn))
00248 dlg.exec();
00249 }
00250 }
00251
00252
void CupsdDialog::slotApply()
00253 {
00254
if (conf_ && !filename_.isEmpty())
00255 {
00256
bool ok(
true);
00257
QString msg;
00258 CupsdConf newconf_;
00259
for (pagelist_.first();pagelist_.current() && ok;pagelist_.next())
00260 ok = pagelist_.current()->saveConfig(&newconf_, msg);
00261
if (!ok)
00262 {
00263 ;
00264 }
00265
else if (!newconf_.saveToFile(filename_))
00266 {
00267 msg = i18n(
"Unable to write configuration file %1").arg(filename_);
00268 ok =
false;
00269 }
00270
else ok = restartServer(msg);
00271
if (!ok)
00272 {
00273 KMessageBox::error(
this, msg, i18n(
"CUPS Configuration Error"));
00274 }
00275 }
00276 }
00277
00278
int CupsdDialog::serverPid()
00279 {
00280
return getServerPid();
00281 }
00282
00283
int CupsdDialog::serverOwner()
00284 {
00285
int pid = getServerPid();
00286
if (pid > 0)
00287 {
00288
QString str;
00289 str.sprintf(
"/proc/%d/status",pid);
00290
QFile f(str);
00291
if (f.exists() && f.open(IO_ReadOnly))
00292 {
00293
QTextStream t(&f);
00294
while (!t.eof())
00295 {
00296 str = t.readLine();
00297
if (str.find(
"Uid:",0,
false) == 0)
00298 {
00299
QStringList list = QStringList::split(
'\t', str,
false);
00300
if (list.count() >= 2)
00301 {
00302
bool ok;
00303
int u = list[1].toInt(&ok);
00304
if (ok)
return u;
00305 }
00306 }
00307 }
00308 }
00309 }
00310
return (-1);
00311 }
00312
#include "cupsddialog.moc"