Class: Snapsync::SnapperConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/snapsync/snapper_config.rb

Overview

A snapper configuration

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ SnapperConfig



15
16
17
18
# File 'lib/snapsync/snapper_config.rb', line 15

def initialize(name)
    @name = name.to_str
    @subvolume, @fstype = nil
end

Instance Attribute Details

#fstypeObject (readonly)

The filesystem type



13
14
15
# File 'lib/snapsync/snapper_config.rb', line 13

def fstype
  @fstype
end

#nameObject (readonly)

The configuration name



5
6
7
# File 'lib/snapsync/snapper_config.rb', line 5

def name
  @name
end

#subvolumePathname (readonly)

Path to the subvolume



10
11
12
# File 'lib/snapsync/snapper_config.rb', line 10

def subvolume
  @subvolume
end

Class Method Details

.default_config_dirObject



32
33
34
# File 'lib/snapsync/snapper_config.rb', line 32

def self.default_config_dir
    Pathname.new('/etc/snapper/configs')
end

.each_in_dir(path = default_config_dir) ⇒ Object

Enumerates the valid snapper configurations present in a directory



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/snapsync/snapper_config.rb', line 37

def self.each_in_dir(path = default_config_dir)
    path.each_entry do |config_file|
        config_name = config_file.to_s
        config_file = path + config_file
        next if !config_file.file?
        begin
            config = SnapperConfig.load(config_file)
        rescue Interrupt
            raise
        rescue Exception => e
            Snapsync.warn "cannot load #{config_file}: #{e.message}"
            e.backtrace.each do |line|
                Snapsync.debug "  #{line}"
            end
            next
        end

        yield(config)
    end
end

.load(path, name: path.basename.to_s) ⇒ SnapperConfig

Create a SnapperConfig object from the data in a configuration file



84
85
86
87
88
# File 'lib/snapsync/snapper_config.rb', line 84

def self.load(path, name: path.basename.to_s)
    config = new(name)
    config.load(path)
    config
end

Instance Method Details

#create(type: 'single', description: '', user_data: Hash.new) ⇒ Snapshot

Create a new snapshot



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/snapsync/snapper_config.rb', line 61

def create(type: 'single', description: '', user_data: Hash.new)
    user_data = user_data.map { |k,v| "#{k}=#{v}" }.join(",")
    snapshot_id = IO.popen(["snapper", "-c", name, "create",
             "--type", type,
             "--print-number",
             "--description", description,
             "--userdata", user_data]) do |io|
        Integer(io.read.strip)
    end
    Snapshot.new(snapshot_dir + snapshot_id.to_s)
end

#delete(snapshot) ⇒ Object

Delete one of this configuration’s snapshots



74
75
76
# File 'lib/snapsync/snapper_config.rb', line 74

def delete(snapshot)
    system("snapper", "-c", name, "delete", snapshot.num.to_s)
end

#each_snapshot {|snapshot| ... } ⇒ Object

Enumerate the valid snapshots in this configuration

Yield Parameters:



28
29
30
# File 'lib/snapsync/snapper_config.rb', line 28

def each_snapshot(&block)
    Snapshot.each(snapshot_dir, &block)
end

#load(path) ⇒ Object

Load the information from a configuration file into this object

See Also:



110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/snapsync/snapper_config.rb', line 110

def load(path)
    path.readlines.each do |line|
        key, value = parse_line(line)
        case key
        when NilClass then next
        else
            instance_variable_set("@#{key.downcase}", value)
        end
    end
    if @subvolume
        @subvolume = Pathname.new(subvolume)
    end
end

#parse_line(line) ⇒ (String,String)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Extract the key and value from a snapper configuration file



96
97
98
99
100
101
102
103
104
105
# File 'lib/snapsync/snapper_config.rb', line 96

def parse_line(line)
    line = line.strip.gsub(/#.*/, '')
    if !line.empty?
        if line =~ /^(\w+)="?([^"]*)"?$/
            return $1, $2
        else
            raise ArgumentError, "cannot parse #{line}"
        end
    end
end

#snapshot_dirObject

The directory containing the snapshots



21
22
23
# File 'lib/snapsync/snapper_config.rb', line 21

def snapshot_dir
    subvolume + ".snapshots"
end