Re: Easier %config management?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 16.12.2015 03:32, Colin Walters wrote:
> On Tue, Dec 15, 2015, at 06:43 PM, Japheth Cleaver wrote:
>>  
>> Perhaps RPM (or yum/dnf, via plugin) could write a duplicate copy of all
>> config files into a tree somewhere? (E.g., /usr/lib/config/ or
>> /usr/share/config/?)
>  
> I mentioned this above, but might as well repeat since it was missed; OSTree
> (as used by the existing Fedora Atomic Host) does this by default today in
> /usr/etc, so if one was adapting this change to the client-side system assembly
> tools like yum/dnf, I'd say it would make sense to follow the precedent.
>  
>  

I already experimented with /usr/share/factory/{etc,var} , but /usr/etc sounds
fine to me, too.

Additionally I would like to have that in the rpm package itsself, not with
some plugin on installation, because "rpm -qf" should output to which package
the file in /usr/etc belongs. Also the %config(noreplace) attribute has to be
removed from the pristine config files.

Attached is a quick hack to rpm I have done for experimenting with that feature.
From 1eb125dd814a08b0a8bfd5e4ab95d38525caf5d3 Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@xxxxxxxxxx>
Date: Thu, 12 Jun 2014 18:31:16 +0200
Subject: [PATCH] Quick hack to place all /etc files also in
 /usr/share/factory/etc

---
 build/Makefile.am |   2 +-
 build/files.c     | 112 +++++++++++++++++++++++++++++++++++-------------------
 build/rpmfc.c     |   6 ++-
 3 files changed, 77 insertions(+), 43 deletions(-)

diff --git a/build/Makefile.am b/build/Makefile.am
index 1a540bc..5d75ef2 100644
--- a/build/Makefile.am
+++ b/build/Makefile.am
@@ -16,7 +16,7 @@ librpmbuild_la_SOURCES = \
 	parsePolicies.c policies.c \
 	rpmbuild_internal.h rpmbuild_misc.h
 
-librpmbuild_la_LDFLAGS = -version-info 4:0:1
+librpmbuild_la_LDFLAGS = -version-info 6:0:3
 librpmbuild_la_LIBADD = \
 	$(top_builddir)/lib/librpm.la \
 	$(top_builddir)/rpmio/librpmio.la \
diff --git a/build/files.c b/build/files.c
index 07a6847..f823f79 100644
--- a/build/files.c
+++ b/build/files.c
@@ -1188,6 +1188,69 @@ static struct stat * fakeStat(FileEntry cur, struct stat * statp)
     return statp;
 }
 
+static rpmRC add_to_file_list(FileList fl,
+                       const char* diskPath,
+                       const char *cpioPath,
+                       mode_t fileMode,
+                       const char *fileUname,
+                       const char *fileGname,
+                       uid_t fileUid,
+                       gid_t fileGid,
+                       struct stat* statp,
+                       int clone
+                       )
+{
+        if (fl->files.used == fl->files.alloced) {
+            fl->files.alloced += 128;
+            fl->files.recs = xrealloc(fl->files.recs,
+                            fl->files.alloced * sizeof(*(fl->files.recs)));
+        }
+
+        {	FileListRec flp = &fl->files.recs[fl->files.used];
+
+            flp->fl_st = *statp;	/* structure assignment */
+            flp->fl_mode = fileMode;
+            flp->fl_uid = fileUid;
+            flp->fl_gid = fileGid;
+
+            flp->cpioPath = xstrdup(cpioPath);
+            flp->diskPath = xstrdup(diskPath);
+            flp->uname = rpmstrPoolId(fl->pool, fileUname, 1);
+            flp->gname = rpmstrPoolId(fl->pool, fileGname, 1);
+
+            if (fl->cur.langs) {
+                flp->langs = argvJoin(fl->cur.langs, "|");
+            } else {
+                flp->langs = xstrdup("");
+            }
+
+            if (fl->cur.caps) {
+                flp->caps = xstrdup(fl->cur.caps);
+            } else {
+                flp->caps = xstrdup("");
+            }
+
+            flp->flags = fl->cur.attrFlags;
+            flp->specdFlags = fl->cur.specdFlags;
+            flp->verifyFlags = fl->cur.verifyFlags;
+
+            if (clone) {
+                    flp->flags &= ~(RPMFILE_MISSINGOK|RPMFILE_CONFIG|RPMFILE_NOREPLACE);
+                    flp->specdFlags |= SPECD_VERIFY;
+                    flp->verifyFlags = RPMVERIFY_ALL;
+            }
+
+            if (!(flp->flags & RPMFILE_EXCLUDE) && S_ISREG(flp->fl_mode)) {
+                if (flp->fl_size >= UINT32_MAX) {
+                    fl->largeFiles = 1;
+                }
+            }
+        }
+
+        fl->files.used++;
+        return RPMRC_OK;
+}
+
 /**
  * Add a file to the package manifest.
  * @param fl		package file tree walk data
@@ -1333,49 +1396,18 @@ static rpmRC addFile(FileList fl, const char * diskPath,
     }
 
     /* Add to the file list */
-    if (fl->files.used == fl->files.alloced) {
-	fl->files.alloced += 128;
-	fl->files.recs = xrealloc(fl->files.recs,
-			fl->files.alloced * sizeof(*(fl->files.recs)));
-    }
-	    
-    {	FileListRec flp = &fl->files.recs[fl->files.used];
-
-	flp->fl_st = *statp;	/* structure assignment */
-	flp->fl_mode = fileMode;
-	flp->fl_uid = fileUid;
-	flp->fl_gid = fileGid;
+    rc = add_to_file_list(fl, diskPath, cpioPath, fileMode, fileUname, fileGname,
+                          fileUid, fileGid, statp, 0);
 
-	flp->cpioPath = xstrdup(cpioPath);
-	flp->diskPath = xstrdup(diskPath);
-	flp->uname = rpmstrPoolId(fl->pool, fileUname, 1);
-	flp->gname = rpmstrPoolId(fl->pool, fileGname, 1);
-
-	if (fl->cur.langs) {
-	    flp->langs = argvJoin(fl->cur.langs, "|");
-	} else {
-	    flp->langs = xstrdup("");
-	}
-
-	if (fl->cur.caps) {
-	    flp->caps = xstrdup(fl->cur.caps);
-	} else {
-	    flp->caps = xstrdup("");
-	}
-
-	flp->flags = fl->cur.attrFlags;
-	flp->specdFlags = fl->cur.specdFlags;
-	flp->verifyFlags = fl->cur.verifyFlags;
-
-	if (!(flp->flags & RPMFILE_EXCLUDE) && S_ISREG(flp->fl_mode)) {
-	    if (flp->fl_size >= UINT32_MAX) {
-		fl->largeFiles = 1;
-	    }
-	}
+    if (strncmp(cpioPath, "/etc", 4) == 0) {
+            char *buf = NULL;
+            if (asprintf(&buf, "/usr/share/factory%s", cpioPath) != -1) {
+                    add_to_file_list(fl, diskPath, buf, fileMode, fileUname, fileGname,
+                                     fileUid, fileGid, statp, 1);
+                    free(buf);
+            }
     }
 
-    rc = RPMRC_OK;
-    fl->files.used++;
 
 exit:
     if (rc != RPMRC_OK)
diff --git a/build/rpmfc.c b/build/rpmfc.c
index 403af40..0b77de2 100644
--- a/build/rpmfc.c
+++ b/build/rpmfc.c
@@ -1003,8 +1003,10 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
 	case S_IFLNK:
 	case S_IFREG:
 	default:
-	    /* XXX all files with extension ".pm" are perl modules for now. */
-	    if (rpmFileHasSuffix(s, ".pm"))
+            if (slen >= fc->brlen+sizeof("/usr/share/factory/etc/") && rstreqn(s+fc->brlen, "/usr/share/factory/etc/", sizeof("/usr/share/factory/etc/")-1))
+                ftype = "";
+            /* XXX all files with extension ".pm" are perl modules for now. */
+            else if (rpmFileHasSuffix(s, ".pm"))
 		ftype = "Perl5 module source text";
 
 	    /* XXX all files with extension ".la" are libtool for now. */
-- 
2.6.4

--
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxxx
http://lists.fedoraproject.org/admin/lists/devel@xxxxxxxxxxxxxxxxxxxxxxx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]
  Powered by Linux