Changed the configuration column of the syncinfo view to be a 0 if
neither new or old file was a config file, 1 if the new one is, 2 if the
old one is, and 3 if they both are. The config file handling logic
needs to know about both.
select distinct
SS.path,
SS.username, SS.uid, SS.groupname, SS.gid, SS.mode, SS.filetype,
select distinct
SS.path,
SS.username, SS.uid, SS.groupname, SS.gid, SS.mode, SS.filetype,
- SS.mtime, SS.hash, SS.configuration, SS.target, SS.device,
+ SS.mtime, SS.hash,
+ SS.configuration + case when OS.configuration = 1 then 2 else 0 end
+ as configuration,
+ SS.target, SS.device,
OS.hash as ohash, SS.mds, OS.mds as omds
from syncstatus SS
join syncstatus OS
OS.hash as ohash, SS.mds, OS.mds as omds
from syncstatus SS
join syncstatus OS
time_t mtime;
mode_t mode;
int ftype;
time_t mtime;
mode_t mode;
int ftype;
+ int configuration, oldwasconf;
struct timespec times[2];
};
struct timespec times[2];
};
static int read_item(struct config *conf, int ncols, char **vals, char **cols,
struct nitem *n) {
char *val;
static int read_item(struct config *conf, int ncols, char **vals, char **cols,
struct nitem *n) {
char *val;
struct passwd *pw;
struct group *gr;
struct nitem zero = { 0 };
struct passwd *pw;
struct group *gr;
struct nitem zero = { 0 };
seterror(conf, "can't determine config status");
return 0;
}
seterror(conf, "can't determine config status");
return 0;
}
- n->configuration = strtoul(val, NULL, 10);
+ lval = strtol(val, NULL, 10);
+
+ n->configuration = ((lval & 1) != 0);
+ n->oldwasconf = ((lval & 2) != 0);
val = COL("filetype");
if (!val || strlen(val) == 0) {
val = COL("filetype");
if (!val || strlen(val) == 0) {
+ * figure out what the difference is for a config file, only called
+ * for an update of a configuration file
+ * return -1 on an error
+ * return 1 if the new file should not be installed
+ * return 0 if the new file should be installed
*/
static int adjust_for_config(struct config *conf, struct nitem *n, unsigned int
diffs) {
*/
static int adjust_for_config(struct config *conf, struct nitem *n, unsigned int
diffs) {
if (!n->oldwasconf) {
return 0;
}
if (!n->oldwasconf) {
return 0;
}
/* TODO what if old was a directory? */
if (!n->configuration) {
/* replacing conf with non-conf */
/* absorb file, mark todo */
char hash[ZPM_HASH_STRLEN+1];
/* TODO what if old was a directory? */
if (!n->configuration) {
/* replacing conf with non-conf */
/* absorb file, mark todo */
char hash[ZPM_HASH_STRLEN+1];
- if (zpm_import(conf->log, n->dest, 0, hash)) {
- zpm_note_add(conf->log, n->pkglist, n->dest, hash,
- "replaced config file with non-config. zpm-cat %.8s", hash);
+ if (!conf->dryrun) {
+ if (conf->verbose) {
+ fprintf(stderr, "importing old conf file\n");
+ }
+ if (zpm_import(conf->log, n->dest, 0, hash)) {
+ zpm_note_add(conf->log, n->pkglist, n->dest, hash,
+ "replaced config file with non-config. zpm-cat %.8s", hash);
+ } else {
+ fprintf(stderr, "unable to import existing config file %s\n", n->dest);
+ return -1;
+ }
- fprintf(stderr, "unable to import existing config file %s\n", n->dest);
- return 1;
+ fprintf(stderr, "dry-run: would replace config file %s with non-config file\n", n->dest);
/* both config directories, can only be changing
* metadata, so no adjustment needed
*/
/* both config directories, can only be changing
* metadata, so no adjustment needed
*/
+ if (conf->verbose) {
+ fprintf(stderr, "both config dirs, ok to update\n");
+ }
/* replacing old file with new directory */
/* absorb, make note */
/* replacing old file with new directory */
/* absorb, make note */
- if (zpm_import(conf->log, n->dest, 0, hash)) {
- zpm_note_add(conf->log, n->pkglist, n->dest, hash,
- "replaced config file with config directory. zpm-cat %.8s", hash);
+ if (!conf->dryrun) {
+ if (zpm_import(conf->log, n->dest, 0, hash)) {
+ zpm_note_add(conf->log, n->pkglist, n->dest, hash,
+ "replaced config file with config directory. zpm-cat %.8s", hash);
+ } else {
+ fprintf(stderr, "unable to import existing config file %s\n", n->dest);
+ return -1;
+ }
- fprintf(stderr, "unable to import existing config file %s\n", n->dest);
- return -1;
+ fprintf(stderr, "dry-run: would replace config file %s with config directory\n", n->dest);
/* replacing old file with new file */
/* new is same as on disk */
if (!(diffs & D_HASH)) {
/* replacing old file with new file */
/* new is same as on disk */
if (!(diffs & D_HASH)) {
+ if (conf->verbose) {
+ fprintf(stderr, "new config file is already on disk, probably shouldn't happen\n");
+ }
return 0;
}
/* new is different than on disk, but on disk is same as old */
if (!(diffs & D_OHASH)) {
return 0;
}
/* new is different than on disk, but on disk is same as old */
if (!(diffs & D_OHASH)) {
+ if (conf->verbose) {
+ fprintf(stderr, "old config file not changed from default, replacing with new default\n");
+ }
/* ok to do the update, since same as default */
fprintf(stderr, "updating default config %s\n", n->dest);
return 0;
/* ok to do the update, since same as default */
fprintf(stderr, "updating default config %s\n", n->dest);
return 0;
/* new is different than on disk, and disk different than old */
/* log */
/* new is different than on disk, and disk different than old */
/* log */
- zpm_note_add(conf->log, n->pkglist, n->dest, n->hash,
- "default config file update. zpm-cat %.8s", n->hash);
- /* TODO check for note error */
+ if (conf->verbose) {
+ fprintf(stderr, "new default config file is different than on disk, and old default was changed, should keep on-disk config\n");
+ }
+ if (!conf->dryrun) {
+ zpm_note_add(conf->log, n->pkglist, n->dest, n->hash,
+ "default config file update. zpm-cat %.8s", n->hash);
+ /* TODO check for note error */
+ } else {
+ fprintf(stderr, "dry-run: default config file %s update\n",
+ n->dest);
+ }