git4pipi/cgit-config-gen.c
2021-07-28 22:52:43 +02:00

131 lines
3.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <dirent.h>
#define BDD_PASS_FILE "/srv/bdd/pipi-system.pass"
#define BDD_CONN_LENGTH 255
#define CGITRC_BASE_FILE "/srv/etc/cgitrc.base"
int
main(int argc, char **argv)
{
char connInfo[BDD_CONN_LENGTH] = "host='/var/run/postgresql' dbname='pipi' user=pipisys password='";
FILE *dbPassFile;
char ch;
int pos = strlen(connInfo);
PGconn *conn;
PGresult *res;
int i;
char* lastRgid;
// Euhhhhhhhhhh
/*
DIR *dp;
struct dirent *ep;
dp = opendir ("/var/run/postgresql/");
if (dp != NULL)
{
while (ep = readdir (dp))
fprintf(stderr,"|->%s\n",ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
*/
// Affichage de la première partie du rc
FILE* fd = fopen(CGITRC_BASE_FILE, "rb");
if (fd == NULL) {
fprintf(stderr,"Z'arrive pas à ouvrir le fichier '%s' : %s\n", CGITRC_BASE_FILE, strerror(errno));
return 1;
}
char c = fgetc(fd);
while (!feof(fd))
{
printf ("%c", c);
c = fgetc(fd);
}
fclose(fd);
printf("## Maintenant les repos ##\n\n");
// Récupère le mdp à la BDD
dbPassFile = fopen(BDD_PASS_FILE,"r");
if (dbPassFile == NULL) {
fprintf(stderr,"Cannot open file %s, on peut pas se connecter à la base de données pour lister les clés en tant que %d -> fopen error %d\n", BDD_PASS_FILE,geteuid(),errno);
return 1;
}
while (feof(dbPassFile))
{
connInfo[pos] = fgetc(dbPassFile);
pos++;
}
fclose(dbPassFile);
connInfo[pos] = '\'';
// Connecte à la BDD
conn = PQconnectdb(connInfo);
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
PQfinish(conn);
return 1;
}
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
PQclear(res);
// Demande les données à la BDD
const char const * sqlParamValues[] = {"0"};
res = PQexecParams(conn,"SELECT path,owner,description,logoUrl,groupeID,gdr.nom FROM git.\"AccessibleRepos\"($1,'READ') JOIN git.\"groupesDeRepo\" AS gdr ON gdr.\"ID\"=groupeID ORDER BY groupeID",1,NULL,sqlParamValues,NULL,NULL,0);
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr,"Impossible de lancer la requête SQL pour la liste des repos: %s",PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
lastRgid = "";
// Renvoie le résultat à travers stdout
for (i = 0; i < PQntuples(res); i++)
{
if(PQgetisnull(res,i,4)!=1 && (strcmp(PQgetvalue(res, i, 4),lastRgid)!=0)){
lastRgid = PQgetvalue(res, i, 4);
printf("\nsection=%s\n\n",PQgetvalue(res,i,5));
}
printf("repo.url=%s\n",PQgetvalue(res,i,0));
printf("repo.path=/srv/git/%s\n",PQgetvalue(res,i,0));
if(PQgetisnull(res,i,1)!=1)
printf("repo.owner=%s\n",PQgetvalue(res,i,1));
if(PQgetisnull(res,i,2)!=1)
printf("repo.desc=%s\n",PQgetvalue(res,i,2));
if(PQgetisnull(res,i,3)!=1)
printf("repo.logo=%s\n",PQgetvalue(res,i,3));
printf("\n");
}
PQclear(res);
PQfinish(conn);
return 0;
}