I have a file (/etc/fstab) with well defined fields and subfields, and am trying to edit one of the fields, including removing duplicate entries.
Here's the original line in question: /dev/md2 /scratch ext3 defaults 1 2 Here's what I want it to look like at the end: /dev/md2 /scratch ext3 usrquota,grpquota 1 2 Due to an oddly non-convergent (?!) set of field_edits, I have a line that looks like this: /dev/md2 /scratch ext3 usrquota,grpquota,usrquota,grpquota,usrquota,grpquota 1 2 As I see it, I originally needed to do two things: 1) Add the two options passed to field #4. 2) Delete the "default" subfield value, if it exists. For some reason, the values in #1 are appended repeatedly, even if they already exist in that field. The 'default' value is removed correctly Here is the code that I'm using (the "col" body comes from the stdlib): bundle scratch { files: scratch_hosts:: "/etc/fstab" edit_line => add_mount_options('/scratch','usrquota,grpquota'), handle => 'scratch_add_quotas_for_scratch_to_fstab', classes => trigger('scratch_added_quota'); } bundle edit_line add_mount_options(filesystem,options) { field_edits: "^.*\s+${filesystem}\s+.*(usrquota,grpquota,usrquota,grpquota,?)+.*$" edit_field => col('\s+',4,"(usrquota,grpquota,)+",'delete'), comment => "Remove duplicate urgquota,grpquota entries"; "^.*\s+${filesystem}\s+.*$" edit_field => col('\s+',4,"${options}",'append'), comment => "Add options to fstab column 4"; "^.*\s+${filesystem}\s+.*defaults.*$" edit_field => col('\s+',4,'defaults','delete'), comment => "Remove default option"; } Here is the relevant output from running under --verbose (this is version 3.0.5p1): cf3 ========================================================= cf3 files in bundle scratch (1) cf3 ========================================================= cf3 cf3 Verifying SQL table promises is only available with Cfengine Nova or above cf3 cf3 ......................................................... cf3 Promise handle: scratch_add_quotas_for_scratch_to_fstab cf3 Promise made by: /etc/fstab cf3 ......................................................... cf3 cf3 -> Using literal pathtype for /etc/fstab cf3 -> Handling file existence constraints on /etc/fstab cf3 -> Handling file edits in edit_line bundle add_mount_options cf3 cf3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * cf3 BUNDLE add_mount_options( {'/scratch','usrquota'} ) cf3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * cf3 cf3 ? Augment scope add_mount_options with filesystem cf3 ? Augment scope add_mount_options with options cf3 ?? Private class context cf3 cf3 cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 field_edits in bundle add_mount_options cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*(usrquota,grpquota,usrquota,grpquota,?)+.*$ cf3 cf3 Comment: Remove duplicate urgquota,grpquota entries cf3 ......................................................... cf3 cf3 - Matched line (/dev/md2 /scratch ext3 usrquota,grpquota,usrquota,grpquota,usrquota,grpquota 1 2) cf3 -> Stopped at field 4 cf3 -> No need to edit field in /etc/fstab cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*$ cf3 cf3 Comment: Add options to fstab column 4 cf3 ......................................................... cf3 cf3 - Matched line (/dev/md2 /scratch ext3 usrquota,grpquota,usrquota,grpquota,usrquota,grpquota 1 2) cf3 -> Stopped at field 4 cf3 -> No need to edit field in /etc/fstab cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*defaults.*$ cf3 cf3 Comment: Remove default option cf3 ......................................................... cf3 cf3 ?? Private class context cf3 cf3 cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 field_edits in bundle add_mount_options cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*(usrquota,grpquota,usrquota,grpquota,?)+.*$ cf3 cf3 Comment: Remove duplicate urgquota,grpquota entries cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*$ cf3 cf3 Comment: Add options to fstab column 4 cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*defaults.*$ cf3 cf3 Comment: Remove default option cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 ?? Private class context cf3 cf3 cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 field_edits in bundle add_mount_options cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = cf3 cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*(usrquota,grpquota,usrquota,grpquota,?)+.*$ cf3 cf3 Comment: Remove duplicate urgquota,grpquota entries cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*$ cf3 cf3 Comment: Add options to fstab column 4 cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 cf3 ......................................................... cf3 Promise handle: cf3 Promise made by: ^.*\s+/scratch\s+.*defaults.*$ cf3 cf3 Comment: Remove default option cf3 ......................................................... cf3 cf3 -> This promise has already been verified cf3 -> No edit changes to file /etc/fstab need saving cf3 (Nothing is done in iterations 2 and 3). Thanks in advance. -- Jesse Becker NHGRI Linux support (Digicon Contractor) _______________________________________________ Help-cfengine mailing list Help-cfengine@cfengine.org https://cfengine.org/mailman/listinfo/help-cfengine