00001
00005 #include "system.h"
00006
00007 #include "Python.h"
00008 #ifdef __LCLINT__
00009 #undef PyObject_HEAD
00010 #define PyObject_HEAD int _PyObjectHead;
00011 #endif
00012
00013 #include <rpmio_internal.h>
00014 #include <rpmcli.h>
00015 #include <rpmdb.h>
00016
00017 #include "legacy.h"
00018 #include "misc.h"
00019 #include "header_internal.h"
00020
00021 #include "header-py.h"
00022 #include "rpmal-py.h"
00023 #include "rpmds-py.h"
00024 #include "rpmfd-py.h"
00025 #include "rpmfts-py.h"
00026 #include "rpmfi-py.h"
00027 #include "rpmmi-py.h"
00028 #include "rpmrc-py.h"
00029 #include "rpmte-py.h"
00030 #include "rpmts-py.h"
00031
00032 #include "debug.h"
00033
00034 #ifdef __LCLINT__
00035 #undef PyObject_HEAD
00036 #define PyObject_HEAD int _PyObjectHead
00037 #endif
00038
00043
00046 static PyObject * archScore(PyObject * self, PyObject * args)
00047 {
00048 char * arch;
00049 int score;
00050
00051 if (!PyArg_ParseTuple(args, "s", &arch))
00052 return NULL;
00053
00054 score = rpmMachineScore(RPM_MACHTABLE_INSTARCH, arch);
00055
00056 return Py_BuildValue("i", score);
00057 }
00058
00061 static PyObject * setLogFile (PyObject * self, PyObject * args)
00062 {
00063 PyObject * fop = NULL;
00064 FILE * fp = NULL;
00065
00066 if (!PyArg_ParseTuple(args, "|O:logSetFile", &fop))
00067 return NULL;
00068
00069 if (fop) {
00070 if (!PyFile_Check(fop)) {
00071 PyErr_SetString(pyrpmError, "requires file object");
00072 return NULL;
00073 }
00074 fp = PyFile_AsFile(fop);
00075 }
00076
00077 (void) rpmlogSetFile(fp);
00078
00079 Py_INCREF(Py_None);
00080 return (PyObject *) Py_None;
00081 }
00082
00085 static PyObject * setVerbosity (PyObject * self, PyObject * args)
00086 {
00087 int level;
00088
00089 if (!PyArg_ParseTuple(args, "i", &level))
00090 return NULL;
00091
00092 rpmSetVerbosity(level);
00093
00094 Py_INCREF(Py_None);
00095 return (PyObject *) Py_None;
00096 }
00097
00100 static PyObject * setEpochPromote (PyObject * self, PyObject * args)
00101 {
00102 if (!PyArg_ParseTuple(args, "i", &_rpmds_nopromote))
00103 return NULL;
00104 Py_INCREF(Py_None);
00105 return (PyObject *) Py_None;
00106 }
00107
00110 static PyObject * setStats (PyObject * self, PyObject * args)
00111 {
00112 if (!PyArg_ParseTuple(args, "i", &_rpmts_stats))
00113 return NULL;
00114 Py_INCREF(Py_None);
00115 return (PyObject *) Py_None;
00116 }
00117
00120 static PyMethodDef rpmModuleMethods[] = {
00121 { "TransactionSet", (PyCFunction) rpmts_Create, METH_VARARGS,
00122 "rpm.TransactionSet([rootDir, [db]]) -> ts\n\
00123 - Create a transaction set.\n" },
00124
00125 #if Py_TPFLAGS_HAVE_ITER
00126 { "newrc", (PyCFunction) rpmrc_Create, METH_VARARGS|METH_KEYWORDS,
00127 NULL },
00128 #endif
00129 { "addMacro", (PyCFunction) rpmrc_AddMacro, METH_VARARGS,
00130 NULL },
00131 { "delMacro", (PyCFunction) rpmrc_DelMacro, METH_VARARGS,
00132 NULL },
00133
00134 { "archscore", (PyCFunction) archScore, METH_VARARGS,
00135 NULL },
00136
00137 { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS,
00138 NULL },
00139 { "rhnLoad", (PyCFunction) rhnLoad, METH_VARARGS,
00140 NULL },
00141 { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS,
00142 NULL },
00143 { "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS,
00144 NULL },
00145 { "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS,
00146 NULL },
00147
00148 { "setLogFile", (PyCFunction) setLogFile, METH_VARARGS,
00149 NULL },
00150
00151 { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS,
00152 NULL },
00153 { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS,
00154 NULL },
00155 { "setVerbosity", (PyCFunction) setVerbosity, METH_VARARGS,
00156 NULL },
00157 { "setEpochPromote", (PyCFunction) setEpochPromote, METH_VARARGS,
00158 NULL },
00159 { "setStats", (PyCFunction) setStats, METH_VARARGS,
00160 NULL },
00161
00162 { "dsSingle", (PyCFunction) rpmds_Single, METH_VARARGS,
00163 "rpm.dsSingle(TagN, N, [EVR, [Flags]] -> ds\n\
00164 - Create a single element dependency set.\n" },
00165 { NULL }
00166 } ;
00167
00170 static char rpm__doc__[] =
00171 "";
00172
00173 void initrpm(void);
00176 void initrpm(void)
00177 {
00178 PyObject * d, *o, * tag = NULL, * dict;
00179 int i;
00180 const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
00181 struct headerSprintfExtension_s * ext;
00182 PyObject * m;
00183
00184 #if Py_TPFLAGS_HAVE_ITER
00185 if (PyType_Ready(&hdr_Type) < 0) return;
00186 if (PyType_Ready(&rpmal_Type) < 0) return;
00187 if (PyType_Ready(&rpmds_Type) < 0) return;
00188 if (PyType_Ready(&rpmfd_Type) < 0) return;
00189 if (PyType_Ready(&rpmfts_Type) < 0) return;
00190 if (PyType_Ready(&rpmfi_Type) < 0) return;
00191 if (PyType_Ready(&rpmmi_Type) < 0) return;
00192
00193 rpmrc_Type.tp_base = &PyDict_Type;
00194 if (PyType_Ready(&rpmrc_Type) < 0) return;
00195
00196 if (PyType_Ready(&rpmte_Type) < 0) return;
00197 if (PyType_Ready(&rpmts_Type) < 0) return;
00198 #endif
00199
00200 m = Py_InitModule3("rpm", rpmModuleMethods, rpm__doc__);
00201 if (m == NULL)
00202 return;
00203
00204 rpmReadConfigFiles(NULL, NULL);
00205
00206 d = PyModule_GetDict(m);
00207
00208 #ifdef HACK
00209 pyrpmError = PyString_FromString("rpm.error");
00210 PyDict_SetItemString(d, "error", pyrpmError);
00211 Py_DECREF(pyrpmError);
00212 #else
00213 pyrpmError = PyErr_NewException("rpm.error", NULL, NULL);
00214 if (pyrpmError != NULL)
00215 PyDict_SetItemString(d, "error", pyrpmError);
00216 #endif
00217
00218 #if Py_TPFLAGS_HAVE_ITER
00219 Py_INCREF(&hdr_Type);
00220 PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
00221
00222 Py_INCREF(&rpmal_Type);
00223 PyModule_AddObject(m, "al", (PyObject *) &rpmal_Type);
00224
00225 Py_INCREF(&rpmds_Type);
00226 PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
00227
00228 Py_INCREF(&rpmfd_Type);
00229 PyModule_AddObject(m, "fd", (PyObject *) &rpmfd_Type);
00230
00231 Py_INCREF(&rpmfts_Type);
00232 PyModule_AddObject(m, "fts", (PyObject *) &rpmfts_Type);
00233
00234 Py_INCREF(&rpmfi_Type);
00235 PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
00236
00237 Py_INCREF(&rpmmi_Type);
00238 PyModule_AddObject(m, "mi", (PyObject *) &rpmmi_Type);
00239
00240 Py_INCREF(&rpmrc_Type);
00241 PyModule_AddObject(m, "rc", (PyObject *) &rpmrc_Type);
00242
00243 Py_INCREF(&rpmte_Type);
00244 PyModule_AddObject(m, "te", (PyObject *) &rpmte_Type);
00245
00246 Py_INCREF(&rpmts_Type);
00247 PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type);
00248 #else
00249 hdr_Type.ob_type = &PyType_Type;
00250 rpmal_Type.ob_type = &PyType_Type;
00251 rpmds_Type.ob_type = &PyType_Type;
00252 rpmfd_Type.ob_type = &PyType_Type;
00253 rpmfts_Type.ob_type = &PyType_Type;
00254 rpmfi_Type.ob_type = &PyType_Type;
00255 rpmmi_Type.ob_type = &PyType_Type;
00256 rpmte_Type.ob_type = &PyType_Type;
00257 rpmts_Type.ob_type = &PyType_Type;
00258 #endif
00259
00260 dict = PyDict_New();
00261
00262 for (i = 0; i < rpmTagTableSize; i++) {
00263 tag = PyInt_FromLong(rpmTagTable[i].val);
00264 PyDict_SetItemString(d, (char *) rpmTagTable[i].name, tag);
00265 Py_DECREF(tag);
00266 PyDict_SetItem(dict, tag, o=PyString_FromString(rpmTagTable[i].name + 7));
00267 Py_DECREF(o);
00268 }
00269
00270 while (extensions->name) {
00271 if (extensions->type == HEADER_EXT_TAG) {
00272 (const struct headerSprintfExtension *) ext = extensions;
00273 PyDict_SetItemString(d, (char *) extensions->name, o=PyCObject_FromVoidPtr(ext, NULL));
00274 Py_DECREF(o);
00275 PyDict_SetItem(dict, tag, o=PyString_FromString(ext->name + 7));
00276 Py_DECREF(o);
00277 }
00278 extensions++;
00279 }
00280
00281 PyDict_SetItemString(d, "tagnames", dict);
00282 Py_DECREF(dict);
00283
00284
00285 #define REGISTER_ENUM(val) \
00286 PyDict_SetItemString(d, #val, o=PyInt_FromLong( val )); \
00287 Py_DECREF(o);
00288
00289 REGISTER_ENUM(RPMFILE_STATE_NORMAL);
00290 REGISTER_ENUM(RPMFILE_STATE_REPLACED);
00291 REGISTER_ENUM(RPMFILE_STATE_NOTINSTALLED);
00292 REGISTER_ENUM(RPMFILE_STATE_NETSHARED);
00293 REGISTER_ENUM(RPMFILE_STATE_WRONGCOLOR);
00294
00295 REGISTER_ENUM(RPMFILE_CONFIG);
00296 REGISTER_ENUM(RPMFILE_DOC);
00297 REGISTER_ENUM(RPMFILE_ICON);
00298 REGISTER_ENUM(RPMFILE_MISSINGOK);
00299 REGISTER_ENUM(RPMFILE_NOREPLACE);
00300 REGISTER_ENUM(RPMFILE_GHOST);
00301 REGISTER_ENUM(RPMFILE_LICENSE);
00302 REGISTER_ENUM(RPMFILE_README);
00303 REGISTER_ENUM(RPMFILE_EXCLUDE);
00304 REGISTER_ENUM(RPMFILE_UNPATCHED);
00305 REGISTER_ENUM(RPMFILE_PUBKEY);
00306
00307 REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
00308 REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
00309
00310 REGISTER_ENUM(RPMSENSE_SERIAL);
00311 REGISTER_ENUM(RPMSENSE_LESS);
00312 REGISTER_ENUM(RPMSENSE_GREATER);
00313 REGISTER_ENUM(RPMSENSE_EQUAL);
00314 REGISTER_ENUM(RPMSENSE_PREREQ);
00315 REGISTER_ENUM(RPMSENSE_INTERP);
00316 REGISTER_ENUM(RPMSENSE_SCRIPT_PRE);
00317 REGISTER_ENUM(RPMSENSE_SCRIPT_POST);
00318 REGISTER_ENUM(RPMSENSE_SCRIPT_PREUN);
00319 REGISTER_ENUM(RPMSENSE_SCRIPT_POSTUN);
00320 REGISTER_ENUM(RPMSENSE_SCRIPT_VERIFY);
00321 REGISTER_ENUM(RPMSENSE_FIND_REQUIRES);
00322 REGISTER_ENUM(RPMSENSE_FIND_PROVIDES);
00323 REGISTER_ENUM(RPMSENSE_TRIGGERIN);
00324 REGISTER_ENUM(RPMSENSE_TRIGGERUN);
00325 REGISTER_ENUM(RPMSENSE_TRIGGERPOSTUN);
00326 REGISTER_ENUM(RPMSENSE_SCRIPT_PREP);
00327 REGISTER_ENUM(RPMSENSE_SCRIPT_BUILD);
00328 REGISTER_ENUM(RPMSENSE_SCRIPT_INSTALL);
00329 REGISTER_ENUM(RPMSENSE_SCRIPT_CLEAN);
00330 REGISTER_ENUM(RPMSENSE_RPMLIB);
00331 REGISTER_ENUM(RPMSENSE_TRIGGERPREIN);
00332 REGISTER_ENUM(RPMSENSE_KEYRING);
00333 REGISTER_ENUM(RPMSENSE_PATCHES);
00334 REGISTER_ENUM(RPMSENSE_CONFIG);
00335
00336 REGISTER_ENUM(RPMTRANS_FLAG_TEST);
00337 REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
00338 REGISTER_ENUM(RPMTRANS_FLAG_NOSCRIPTS);
00339 REGISTER_ENUM(RPMTRANS_FLAG_JUSTDB);
00340 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
00341 REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
00342 REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
00343 REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
00344 REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
00345 REGISTER_ENUM(RPMTRANS_FLAG_REVERSE);
00346 REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
00347 REGISTER_ENUM(RPMTRANS_FLAG_NOPOST);
00348 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPREIN);
00349 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERIN);
00350 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERUN);
00351 REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
00352 REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
00353 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
00354 REGISTER_ENUM(RPMTRANS_FLAG_ANACONDA);
00355 REGISTER_ENUM(RPMTRANS_FLAG_NOMD5);
00356 REGISTER_ENUM(RPMTRANS_FLAG_NOSUGGEST);
00357 REGISTER_ENUM(RPMTRANS_FLAG_ADDINDEPS);
00358 REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
00359
00360 REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
00361 REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
00362 REGISTER_ENUM(RPMPROB_FILTER_REPLACEPKG);
00363 REGISTER_ENUM(RPMPROB_FILTER_FORCERELOCATE);
00364 REGISTER_ENUM(RPMPROB_FILTER_REPLACENEWFILES);
00365 REGISTER_ENUM(RPMPROB_FILTER_REPLACEOLDFILES);
00366 REGISTER_ENUM(RPMPROB_FILTER_OLDPACKAGE);
00367 REGISTER_ENUM(RPMPROB_FILTER_DISKSPACE);
00368 REGISTER_ENUM(RPMPROB_FILTER_DISKNODES);
00369
00370 REGISTER_ENUM(RPMCALLBACK_UNKNOWN);
00371 REGISTER_ENUM(RPMCALLBACK_INST_PROGRESS);
00372 REGISTER_ENUM(RPMCALLBACK_INST_START);
00373 REGISTER_ENUM(RPMCALLBACK_INST_OPEN_FILE);
00374 REGISTER_ENUM(RPMCALLBACK_INST_CLOSE_FILE);
00375 REGISTER_ENUM(RPMCALLBACK_TRANS_PROGRESS);
00376 REGISTER_ENUM(RPMCALLBACK_TRANS_START);
00377 REGISTER_ENUM(RPMCALLBACK_TRANS_STOP);
00378 REGISTER_ENUM(RPMCALLBACK_UNINST_PROGRESS);
00379 REGISTER_ENUM(RPMCALLBACK_UNINST_START);
00380 REGISTER_ENUM(RPMCALLBACK_UNINST_STOP);
00381 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_PROGRESS);
00382 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_START);
00383 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_STOP);
00384 REGISTER_ENUM(RPMCALLBACK_UNPACK_ERROR);
00385 REGISTER_ENUM(RPMCALLBACK_CPIO_ERROR);
00386
00387 REGISTER_ENUM(RPMPROB_BADARCH);
00388 REGISTER_ENUM(RPMPROB_BADOS);
00389 REGISTER_ENUM(RPMPROB_PKG_INSTALLED);
00390 REGISTER_ENUM(RPMPROB_BADRELOCATE);
00391 REGISTER_ENUM(RPMPROB_REQUIRES);
00392 REGISTER_ENUM(RPMPROB_CONFLICT);
00393 REGISTER_ENUM(RPMPROB_NEW_FILE_CONFLICT);
00394 REGISTER_ENUM(RPMPROB_FILE_CONFLICT);
00395 REGISTER_ENUM(RPMPROB_OLDPACKAGE);
00396 REGISTER_ENUM(RPMPROB_DISKSPACE);
00397 REGISTER_ENUM(RPMPROB_DISKNODES);
00398 REGISTER_ENUM(RPMPROB_BADPRETRANS);
00399
00400 REGISTER_ENUM(VERIFY_DIGEST);
00401 REGISTER_ENUM(VERIFY_SIGNATURE);
00402
00403 REGISTER_ENUM(RPMLOG_EMERG);
00404 REGISTER_ENUM(RPMLOG_ALERT);
00405 REGISTER_ENUM(RPMLOG_CRIT);
00406 REGISTER_ENUM(RPMLOG_ERR);
00407 REGISTER_ENUM(RPMLOG_WARNING);
00408 REGISTER_ENUM(RPMLOG_NOTICE);
00409 REGISTER_ENUM(RPMLOG_INFO);
00410 REGISTER_ENUM(RPMLOG_DEBUG);
00411
00412 REGISTER_ENUM(RPMMIRE_DEFAULT);
00413 REGISTER_ENUM(RPMMIRE_STRCMP);
00414 REGISTER_ENUM(RPMMIRE_REGEX);
00415 REGISTER_ENUM(RPMMIRE_GLOB);
00416
00417 REGISTER_ENUM(RPMVSF_DEFAULT);
00418 REGISTER_ENUM(RPMVSF_NOHDRCHK);
00419 REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
00420 REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
00421 REGISTER_ENUM(RPMVSF_NOMD5HEADER);
00422 REGISTER_ENUM(RPMVSF_NODSAHEADER);
00423 REGISTER_ENUM(RPMVSF_NORSAHEADER);
00424 REGISTER_ENUM(RPMVSF_NOSHA1);
00425 REGISTER_ENUM(RPMVSF_NOMD5);
00426 REGISTER_ENUM(RPMVSF_NODSA);
00427 REGISTER_ENUM(RPMVSF_NORSA);
00428 REGISTER_ENUM(_RPMVSF_NODIGESTS);
00429 REGISTER_ENUM(_RPMVSF_NOSIGNATURES);
00430 REGISTER_ENUM(_RPMVSF_NOHEADER);
00431 REGISTER_ENUM(_RPMVSF_NOPAYLOAD);
00432
00433 REGISTER_ENUM(TR_ADDED);
00434 REGISTER_ENUM(TR_REMOVED);
00435
00436 PyDict_SetItemString(d, "RPMAL_NOMATCH", o=PyInt_FromLong( (long)RPMAL_NOMATCH ));
00437 Py_DECREF(o);
00438 }
00439