25 int tag[15] = { RPMTAG_NAME,
51 void EscapeString (
char *sourceString,
char *escString,
int esclen)
59 char *cp = (
char *)sourceString;
62 if (*cp ==
'\\') *cp =
' ';
70 len = strlen(sourceString);
84 PQescapeStringConn(
db_conn, escString, sourceString, len, &error);
86 printf(
"WARNING: %s line %d: Error escaping string with multibype character set?\n",__FILE__, __LINE__ );
102 char *Value,
int ValueMax,
char Separator)
107 memset(Field,0,FieldMax);
108 memset(Value,0,ValueMax);
110 while(isspace(Sin[0])) Sin++;
111 if (Sin[0]==
'\0')
return(NULL);
114 for(
s=0; (Sin[
s] !=
'\0') && !isspace(Sin[
s]) && (Sin[
s] !=
'=');
s++)
118 while(isspace(Sin[
s]))
s++;
119 if (Sin[
s] != Separator)
123 if (Sin[
s]==
'\0')
return(NULL);
125 while(isspace(Sin[
s]))
s++;
126 if (Sin[
s]==
'\0')
return(NULL);
129 if ((Sin[
s]==
'\'') || (Sin[
s]==
'"'))
133 if (Sin[
s]==
'\0')
return(NULL);
137 for( ; (Sin[
s] !=
'\0') && (Sin[
s] != GotQuote);
s++)
139 if (Sin[
s]==
'\\') Value[v++]=Sin[++
s];
140 else Value[v++]=Sin[
s];
146 for( ; (Sin[
s] !=
'\0') && !isspace(Sin[
s]);
s++)
148 if (Sin[
s]==
'\\') Value[v++]=Sin[++
s];
149 else Value[v++]=Sin[
s];
152 while(isspace(Sin[
s]))
s++;
168 int debmimetypepk = 0;
169 int debmodernmimetypepk = 0;
170 int debsrcmimetypepk = 0;
181 rpmReadConfigFiles(NULL, NULL);
187 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-rpm' LIMIT 1;");
188 result = PQexec(
db_conn, sqlbuf);
195 mimetypepk = atoi(PQgetvalue(result, 0, 0));
197 if ( mimetypepk == 0 )
199 snprintf(sqlbuf,
sizeof(sqlbuf),
"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-rpm');");
200 result = PQexec(
db_conn, sqlbuf);
207 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-rpm' LIMIT 1;");
208 result = PQexec(
db_conn, sqlbuf);
215 mimetypepk = atoi(PQgetvalue(result, 0, 0));
217 if ( mimetypepk == 0 )
219 LOG_ERROR(
"pkgagent rpm mimetype not installed!");
225 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-debian-package' LIMIT 1;");
226 result = PQexec(
db_conn, sqlbuf);
233 debmimetypepk = atoi(PQgetvalue(result, 0, 0));
235 if ( debmimetypepk == 0 )
237 snprintf(sqlbuf,
sizeof(sqlbuf),
"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-debian-package');");
238 result = PQexec(
db_conn, sqlbuf);
245 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-debian-package' LIMIT 1;");
246 result = PQexec(
db_conn, sqlbuf);
253 debmimetypepk = atoi(PQgetvalue(result, 0, 0));
255 if ( debmimetypepk == 0 )
257 LOG_ERROR(
"pkgagent deb mimetype not installed!");
263 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/vnd.debian.binary-package' LIMIT 1;");
264 result = PQexec(
db_conn, sqlbuf);
271 debmodernmimetypepk = atoi(PQgetvalue(result, 0, 0));
273 if ( debmodernmimetypepk == 0 )
275 snprintf(sqlbuf,
sizeof(sqlbuf),
"INSERT INTO mimetype (mimetype_name) VALUES ('application/vnd.debian.binary-package');");
276 result = PQexec(
db_conn, sqlbuf);
279 printf(
"ERROR: unable to insert modern debian mimetype %s\n", sqlbuf);
284 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/vnd.debian.binary-package' LIMIT 1;");
285 result = PQexec(
db_conn, sqlbuf);
292 debmodernmimetypepk = atoi(PQgetvalue(result, 0, 0));
294 if ( debmodernmimetypepk == 0 )
296 LOG_ERROR(
"pkgagent modern debian mimetype not installed!");
302 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-debian-source' LIMIT 1;");
303 result = PQexec(
db_conn, sqlbuf);
310 debsrcmimetypepk = atoi(PQgetvalue(result, 0, 0));
312 if ( debsrcmimetypepk == 0 )
314 snprintf(sqlbuf,
sizeof(sqlbuf),
"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-debian-source');");
315 result = PQexec(
db_conn, sqlbuf);
322 snprintf(sqlbuf,
sizeof(sqlbuf),
"SELECT mimetype_pk FROM mimetype WHERE mimetype_name = 'application/x-debian-source' LIMIT 1;");
323 result = PQexec(
db_conn, sqlbuf);
330 debsrcmimetypepk = atoi(PQgetvalue(result, 0, 0));
332 if ( debsrcmimetypepk == 0 )
334 LOG_ERROR(
"pkgagent deb source mimetype not installed!");
350 snprintf(sqlbuf,
sizeof(sqlbuf),
351 "SELECT pfile_pk as pfile_pk, pfile_sha1 || '.' || pfile_md5 || '.' || pfile_size AS pfilename, mimetype_name as mimetype from pfile, mimetype, (SELECT distinct(pfile_fk) as PF from %s where upload_fk='%ld') as SS where PF=pfile_pk and (pfile_mimetypefk='%d' or pfile_mimetypefk='%d' OR pfile_mimetypefk='%d' OR pfile_mimetypefk='%d') and mimetype_pk=pfile_mimetypefk and (not exists (SELECT 1 from pkg_rpm where pkg_rpm.pfile_fk = pfile_pk)) and (not exists (SELECT 1 from pkg_deb where pkg_deb.pfile_fk = pfile_pk))",
uploadtree_tablename,
upload_pk, mimetypepk, debmimetypepk, debsrcmimetypepk, debmodernmimetypepk);
352 result = PQexec(
db_conn, sqlbuf);
360 numrows = PQntuples(result);
361 for (i=0; i<numrows; i++)
363 char *repFile = NULL;
368 strcpy(mimetype, PQgetvalue(result, i, 2));
374 if (!strcasecmp(mimetype,
"application/x-rpm")) {
375 pi->
pFileFk = atoi(PQgetvalue(result, i, 0));
376 strncpy(pi->
pFile, PQgetvalue(result, i, 1),
sizeof(pi->
pFile)-1);
380 LOG_FATAL(
"pfile %ld PkgAgent unable to open file %s",
393 else if (!strcasecmp(mimetype,
"application/x-debian-package") ||
394 !strcasecmp(mimetype,
"application/vnd.debian.binary-package")){
395 dpi->
pFileFk = atoi(PQgetvalue(result, i, 0));
396 strncpy(dpi->
pFile, PQgetvalue(result, i, 1),
sizeof(dpi->
pFile)-1);
407 else if (!strcasecmp(mimetype,
"application/x-debian-source")){
408 dpi->
pFileFk = atoi(PQgetvalue(result, i, 0));
409 strncpy(dpi->
pFile, PQgetvalue(result, i, 1),
sizeof(dpi->
pFile)-1);
413 LOG_FATAL(
"pfile %ld PkgAgent unable to open file %s\n",
426 printf(
"LOG: Not RPM and DEBIAN package!\n");
453 rpm_count_t data_size;
455 for (i = 0; i < 14; i++) {
456 memset(fmt, 0,
sizeof(fmt));
458 strcat( fmt, rpmTagGetName(
tag[i]));
461 msgstr = headerFormat(header, fmt, &errstr);
464 printf(
"%s:%s\n",rpmTagGetName(
tag[i]),msgstr);
484 case RPMTAG_PACKAGER:
490 case RPMTAG_BUILDTIME:
502 case RPMTAG_SOURCERPM:
508 case RPMTAG_DESCRIPTION:
515 free((
void *)msgstr);
518 header_status = headerGet(header,
tag[14], &req, HEADERGET_DEFAULT);
520 data_size = rpmtdCount(&req);
521 pi->
requires = calloc(data_size,
sizeof(
char *));
522 for (j=0; j<(int)data_size;j++){
523 const char * temp = rpmtdNextString(&req);
557 vsflags = RPMVSF_DEFAULT;
558 ts = (rpmts) rpmtsCreate();
561 if ( fd == NULL ||Ferror(fd)){
562 rpmlog(RPMLOG_ERR,
"open of %s failed: %s\n", pkg, Fstrerror(fd));
569 vsflags |= _RPMVSF_NOSIGNATURES;
570 vsflags |= _RPMVSF_NODIGESTS;
571 vsflags |= RPMVSF_NOHDRCHK;
572 vsflags |= RPMVSF_NEEDPAYLOAD;
574 rpmtsSetVSFlags(ts, vsflags);
577 rpmrc = rpmReadPackageFile(ts, fd, pkg,&header);
579 ts = (rpmts) rpmtsFree(ts);
584 case RPMRC_NOTTRUSTED:
589 rpmlog(RPMLOG_ERR,
"%s cannot be read or is not an RPM.\n", pkg);
594 header = headerFree(header);
610 memset(
SQL,0,
sizeof(
SQL));
611 snprintf(
SQL,
sizeof(
SQL),
"SELECT pfile_fk FROM pkg_rpm WHERE pfile_fk = %ld;",pi->
pFileFk);
614 if (PQntuples(result) <=0)
617 memset(
SQL,0,
sizeof(
SQL));
618 result = PQexec(
db_conn,
"BEGIN;");
622 snprintf(
SQL,
sizeof(
SQL),
"INSERT INTO pkg_rpm (pkg_name,pkg_alias,pkg_arch,version,rpm_filename,license,pkg_group,packager,release,build_date,vendor,url,source_rpm,summary,description,pfile_fk) values (E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',%ld);",
635 result = PQexec(
db_conn,
"SELECT currval('pkg_rpm_pkg_pk_seq'::regclass);");
637 pkg_pk = atoi(PQgetvalue(result,0,0));
640 if (
Verbose) { printf(
"pkg_pk:%d\n",pkg_pk);}
644 memset(
SQL,0,
sizeof(
SQL));
645 snprintf(
SQL,
sizeof(
SQL),
"INSERT INTO pkg_rpm_req (pkg_fk,req_value) values (%d,E'%s');",pkg_pk,
trim(pi->
requires[i]));
654 result = PQexec(
db_conn,
"COMMIT;");
674 memset(Field,0,MAXCMD);
675 memset(Value,0,MAXCMD);
680 for(
s=0; (Sin[
s] !=
'\0') && !isspace(Sin[
s]) && (Sin[
s] !=
':');
s++)
684 while(isspace(Sin[
s]))
s++;
690 while(isspace(Sin[
s]))
s++;
692 for( ; Sin[
s] !=
'\0';
s++)
696 if (
Verbose) { printf(
"Field is %s and Value is %s", Field, Value);}
700 if (
Verbose) { printf(
"ExValue is %s", Sin);}
717 unsigned long lft, rgt;
732 snprintf(
SQL,
sizeof(
SQL),
"SELECT lft,rgt FROM %s WHERE upload_fk = %ld AND pfile_fk = %ld limit 1",
736 if (PQntuples(result) == 0)
738 LOG_ERROR(
"Missing debian package (internal data inconsistancy). SQL: %s\n",
SQL);
742 lft = strtoul(PQgetvalue(result,0,0), NULL, 10);
743 rgt = strtoul(PQgetvalue(result,0,1), NULL, 10);
746 snprintf(
SQL,
sizeof(
SQL),
"SELECT pfile_sha1 || '.' || pfile_md5 || '.' || pfile_size FROM pfile, uploadtree where (pfile_pk=pfile_fk) and (upload_fk = %ld) AND (lft > %ld) AND (rgt < %ld) AND (ufile_name = 'control')",
750 if (PQntuples(result) > 0)
752 filename = PQgetvalue(result,0,0);
755 LOG_FATAL(
"PkgAgent unable to open file %s\n",filename);
763 printf(
"LOG: Unable to find debian/control file! This file had wrong mimetype, ignore it!\n");
764 memset(
SQL,0,
sizeof(
SQL));
765 snprintf(
SQL,
sizeof(
SQL),
"UPDATE pfile SET pfile_mimetypefk = NULL WHERE pfile_pk = %ld;", pi->
pFileFk);
773 if ((fp = fopen(repfile,
"r")) == NULL){
774 LOG_FATAL(
"Unable to open debian/control file %s\n",repfile);
778 while (fgets(line,MAXCMD,fp)!=NULL)
782 if (!strcasecmp(field,
"Description")) {
787 if ((strlen(temp) + strlen(
s)) >= MAXCMD )
792 if (!strcasecmp(field,
"Package")) {
795 if (!strcasecmp(field,
"Version")) {
798 if (!strcasecmp(field,
"Architecture")) {
801 if (!strcasecmp(field,
"Maintainer")) {
804 if (!strcasecmp(field,
"Installed-Size")) {
807 if (!strcasecmp(field,
"Section")) {
810 if (!strcasecmp(field,
"Priority")) {
813 if (!strcasecmp(field,
"Homepage")) {
816 if (!strcasecmp(field,
"Source")) {
819 if (!strcasecmp(field,
"Depends")) {
820 char *depends = NULL;
821 char tempvalue[MAXCMD];
825 if (value[0] !=
'\0'){
826 strncpy(tempvalue, value,
sizeof(tempvalue));
827 depends = strtok(value,
",");
828 while (depends && (depends[0] !=
'\0')) {
829 if (strlen(depends) >= length)
830 length = strlen(depends) + 1;
831 depends = strtok(NULL,
",");
834 if (
Verbose) { printf(
"SIZE:%d\n", size);}
836 pi->
depends = calloc(size,
sizeof(
char *));
837 pi->
depends[0] = calloc(length,
sizeof(
char));
838 strcpy(pi->
depends[0],strtok(tempvalue,
","));
839 for (i=1;i<size;i++){
840 pi->
depends[i] = calloc(length,
sizeof(
char));
841 strcpy(pi->
depends[i],strtok(NULL,
","));
865 memset(
SQL,0,
sizeof(
SQL));
866 snprintf(
SQL,
sizeof(
SQL),
"SELECT pfile_fk FROM pkg_deb WHERE pfile_fk = %ld;",pi->
pFileFk);
869 if (PQntuples(result) <=0)
872 memset(
SQL,0,
sizeof(
SQL));
873 result = PQexec(
db_conn,
"BEGIN;");
877 snprintf(
SQL,
sizeof(
SQL),
"INSERT INTO pkg_deb (pkg_name,pkg_arch,version,maintainer,installed_size,section,priority,homepage,source,summary,description,format,uploaders,standards_version,pfile_fk) values (E'%s',E'%s',E'%s',E'%s',%d,E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',E'%s',%ld);",
884 if ((result==0) || ((PQresultStatus(result) != PGRES_COMMAND_OK)))
886 LOG_FATAL(
"Error inserting, SQL is: %s, error code is:%s\n",
SQL, PQresultErrorField(result, PG_DIAG_SQLSTATE));
888 if (result) PQclear(result);
895 result = PQexec(
db_conn,
"SELECT currval('pkg_deb_pkg_pk_seq'::regclass);");
897 pkg_pk = atoi(PQgetvalue(result,0,0));
900 if (
Verbose) { printf(
"pkg_pk:%d\n",pkg_pk);}
904 memset(
SQL,0,
sizeof(
SQL));
905 snprintf(
SQL,
sizeof(
SQL),
"INSERT INTO pkg_deb_req (pkg_fk,req_value) values (%d,E'%s');",pkg_pk,
trim(pi->
depends[i]));
915 result = PQexec(
db_conn,
"COMMIT;");
941 if ((fp = fopen(repFile,
"r")) == NULL){
942 LOG_FATAL(
"Unable to open .dsc file %s\n",repFile);
946 while (fgets(line,MAXCMD,fp)!=NULL)
951 if (!strcasecmp(field,
"Format")) {
954 if (!strcasecmp(field,
"Source")) {
957 if (!strcasecmp(field,
"Source")) {
960 if (!strcasecmp(field,
"Architecture")) {
963 if (!strcasecmp(field,
"Version")) {
967 if (!strcasecmp(field,
"Maintainer")) {
970 if (!strcasecmp(field,
"Homepage")) {
973 if (!strcasecmp(field,
"Uploaders")) {
976 if (!strcasecmp(field,
"Standards-Version")) {
979 if (!strcasecmp(field,
"Build-Depends")) {
980 char *depends = NULL;
981 char tempvalue[MAXCMD];
985 if (value[0] !=
'\0'){
986 strncpy(tempvalue, value,
sizeof(tempvalue));
987 depends = strtok(value,
",");
988 while (depends && (depends[0] !=
'\0')) {
989 if (strlen(depends) >= length)
990 length = strlen(depends) + 1;
991 depends = strtok(NULL,
",");
994 if (
Verbose) { printf(
"SIZE:%d\n", size);}
996 pi->
depends = calloc(size,
sizeof(
char *));
997 pi->
depends[0] = calloc(length,
sizeof(
char));
998 strcpy(pi->
depends[0],strtok(tempvalue,
","));
999 for (i=1;i<size;i++){
1000 pi->
depends[i] = calloc(length,
sizeof(
char));
1001 strcpy(pi->
depends[i],strtok(NULL,
","));
1023 printf(
"Usage: %s [options] [file [file [...]]\n",Name);
1024 printf(
" -i :: initialize the database, then exit.\n");
1025 printf(
" -v :: verbose (-vv = more verbose)\n");
1026 printf(
" -c :: Specify the directory for the system configuration.\n");
1027 printf(
" -C :: run from command line.\n");
1028 printf(
" file :: if files are rpm package listed, display their package information.\n");
1029 printf(
" no file :: process data from the scheduler.\n");
1030 printf(
" -V :: print the version info, then exit.\n");
char SQL[256]
SQL query to execute.
char * uploadtree_tablename
upload.uploadtree_tablename
int s
The socket that the CLI will use to communicate.
char * trim(char *ptext)
Trimming whitespace.
FUNCTION char * GetUploadtreeTableName(PGconn *pgConn, int upload_pk)
Get the uploadtree table name for this upload_pk If upload_pk does not exist, return "uploadtree".
int fo_checkPQresult(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres SELECT.
int fo_checkPQcommand(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres commands (not select) If an error occured, write the error to s...
char * fo_RepMkPath(const char *Type, char *Filename)
Given a filename, construct the full path to the file.
void fo_scheduler_heart(int i)
This function must be called by agents to let the scheduler know they are alive and how many items th...
#define MAXLENGTH
Buffer length.
char * ParseDebFile(char *Sin, char *Field, char *Value)
Parse Debian binary control file with Field/Value pairs.
void Usage(char *Name)
Say how to run this program.
char * GetFieldValue(char *Sin, char *Field, int FieldMax, char *Value, int ValueMax, char Separator)
Given a string that contains field='value' pairs, save the items.
int GetMetadata(char *pkg, struct rpmpkginfo *pi)
Get RPM package info.
int GetMetadataDebSource(char *repFile, struct debpkginfo *pi)
Get debian source package info from .dsc file.
void EscapeString(char *sourceString, char *escString, int esclen)
Escaping special characters(single quote)
int ProcessUpload(long upload_pk)
Get all pfile need to processed use upload_pk.
PGconn * db_conn
The connection to Database.
int RecordMetadataDEB(struct debpkginfo *pi)
Store debian package info into database.
int Verbose
Verbose level.
int RecordMetadataRPM(struct rpmpkginfo *pi)
Store rpm package info into database.
int GetMetadataDebBinary(long upload_pk, struct debpkginfo *pi)
Get debian binary package info.
void ReadHeaderInfo(Header header, struct rpmpkginfo *pi)
Get RPM package info from rpm file header use rpm library.
Holds meta info of Debian packages.
char section[MAXCMD]
Package section.
char priority[MAXCMD]
Package priority.
char standardsVersion[MAXCMD]
Package standards version.
long pFileFk
Package pfile in FOSSology.
char ** depends
Package dependency list.
char summary[MAXCMD]
Package summary.
char pFile[MAXCMD]
Package pfile hash.
char version[MAXCMD]
Package version.
char format[MAXCMD]
Package format.
char uploaders[MAXCMD]
Package contributors.
char maintainer[MAXCMD]
Package maintainer.
int installedSize
Size of package after install.
char pkgArch[MAXCMD]
Package architecture.
char description[MAXCMD]
Package description.
int dep_size
Package dependency list size.
char source[MAXCMD]
Package source.
char pkgName[MAXCMD]
Package name.
char homepage[MAXCMD]
Package link.
Holds meta info of rpm packages.
char buildDate[128]
Package build date.
char pFile[MAXCMD]
Package pfile hash.
char group[128]
Package group.
char version[64]
Package version.
char summary[MAXCMD]
Package summary.
char pkgName[256]
RPM package name.
char description[MAXCMD]
Package description.
char rpmFilename[256]
RPM file name.
char license[512]
RPM licenses.
char pkgArch[64]
Package architecture.
char sourceRPM[256]
Package source.
int req_size
Package dependency list size.
char pkgAlias[256]
Package alias.
char url[256]
Package link.
long pFileFk
Package pfile in FOSSology.
char release[64]
Package release.
char packager[1024]
Packager.
char ** requires
Package dependency list.
char vendor[128]
Package vendor.