| 96 | rodolico | 1 | snapshot is a simple Perl script used to manage ZFS snapshots. It is designed to be run from a cron job.
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | It's configuration file is assumed to be snapShot.yaml in the same directory as the script. For those of us who prefer perl data
 | 
        
           |  |  | 4 | structures, there is a script, confToYAML.pl which will take a perl definition of the configuration file and convert to yaml. Call 
 | 
        
           |  |  | 5 | it with
 | 
        
           |  |  | 6 | confToYAML.pl < snapShot.cfg > snapShot.YAML
 | 
        
           |  |  | 7 | A sample of snapShot.cfg is included.
 | 
        
           |  |  | 8 |   | 
        
           |  |  | 9 | NOTICE: this uses the perl module yaml-tiny to read the configuration file
 | 
        
           |  |  | 10 |    Debian Based Systems: apt install libyaml-tiny-perl
 | 
        
           |  |  | 11 |    BSD Systems: cpan -i YAML::Tiny
 | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 | Every place that uses a frequency (ie, retention, frequency, slop) is expressed as a number of seconds. This should be an integer,
 | 
        
           |  |  | 14 | optionally followed by a space and a unit. hour, day, week, month and year are acceptable units.
 | 
        
           |  |  | 15 |   | 
        
           |  |  | 16 | == globals
 | 
        
           |  |  | 17 |   | 
        
           |  |  | 18 | TESTING - if non-zero (true), will print the commands that would be executed to /tmp/snapshot
 | 
        
           |  |  | 19 | slop - Number of seconds of slop allowed a cron job to determine if a new snapshot should be taken.
 | 
        
           |  |  | 20 | listingkeys - Headers from the output of zfs list and zfs list -t snapshot, so we know which column is which
 | 
        
           |  |  | 21 |   | 
        
           |  |  | 22 | There is no guarantee that cron and the timestamp embedded in the snapshot name will be exactly right. For example, if you were to
 | 
        
           |  |  | 23 | run the cron job every hour, you may be off by a minute or two when deciding to create a new snapshot. 'slop' allows for this by
 | 
        
           |  |  | 24 | saying "if we are slop seconds from needing a new snapshot, pretend we need it now". For a hourly cron job checking for daily 
 | 
        
           |  |  | 25 | snapshots, slop could be something like '1 hour'
 | 
        
           |  |  | 26 |   | 
        
           |  |  | 27 | == datasets
 | 
        
           |  |  | 28 |   | 
        
           |  |  | 29 | Basically, you choose one or more datasets to be managed. Each dataset can have three flags:
 | 
        
           |  |  | 30 |   | 
        
           |  |  | 31 | retention: How long a to keep a snapshot after it was created
 | 
        
           |  |  | 32 | frequency: How often to create a new snapshot
 | 
        
           |  |  | 33 | recursive: Adds the -r command to both zfs snapshot and zfs destroy commands if set to non-zero
 | 
        
           |  |  | 34 |   | 
        
           |  |  | 35 | The dataset key should be a regex, so escape all forward slashes and periods, ie for 
 | 
        
           |  |  | 36 | storage/iscsi.shares
 | 
        
           |  |  | 37 | you would use
 | 
        
           |  |  | 38 | storage\/iscsi\.shares
 | 
        
           |  |  | 39 | The regex must match the entire string to keep from matching storage/iscsi.shares/local_stuff, etc... If you want to match
 | 
        
           |  |  | 40 | child datasets, end the regex with '.*', ie
 | 
        
           |  |  | 41 | storage\/iscsi\.shares.*
 | 
        
           |  |  | 42 |   | 
        
           |  |  | 43 | See $config->{'datasets'}
 | 
        
           |  |  | 44 |   | 
        
           |  |  | 45 | == snapshots
 | 
        
           |  |  | 46 |   | 
        
           |  |  | 47 | Snapshots will be managed only if they match the parse regex, and will be created using the template string, which must be parsable 
 | 
        
           |  |  | 48 | by strftime. Care must be taken by the user to ensure parse and template match, and are correctly identified by parseFields.
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 | See $config{'snapshot'}.
 |