~brad-marshall/charms/trusty/glance-simplestreams-sync/custom-properties-arch

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/core/fstab.py

  • Committer: Michael McCracken
  • Date: 2014-06-18 18:55:51 UTC
  • mfrom: (49.1.1)
  • Revision ID: git-v1:62a8e7cf6e9e7261313da8d582f2007b1c691c93
Merge pull request #14 from mikemccracken/add-fstab

add missing fstab module

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# -*- coding: utf-8 -*-
 
3
 
 
4
__author__ = 'Jorge Niedbalski R. <jorge.niedbalski@canonical.com>'
 
5
 
 
6
import os
 
7
 
 
8
 
 
9
class Fstab(file):
 
10
    """This class extends file in order to implement a file reader/writer
 
11
    for file `/etc/fstab`
 
12
    """
 
13
 
 
14
    class Entry(object):
 
15
        """Entry class represents a non-comment line on the `/etc/fstab` file
 
16
        """
 
17
        def __init__(self, device, mountpoint, filesystem,
 
18
                     options, d=0, p=0):
 
19
            self.device = device
 
20
            self.mountpoint = mountpoint
 
21
            self.filesystem = filesystem
 
22
 
 
23
            if not options:
 
24
                options = "defaults"
 
25
 
 
26
            self.options = options
 
27
            self.d = d
 
28
            self.p = p
 
29
 
 
30
        def __eq__(self, o):
 
31
            return str(self) == str(o)
 
32
 
 
33
        def __str__(self):
 
34
            return "{} {} {} {} {} {}".format(self.device,
 
35
                                              self.mountpoint,
 
36
                                              self.filesystem,
 
37
                                              self.options,
 
38
                                              self.d,
 
39
                                              self.p)
 
40
 
 
41
    DEFAULT_PATH = os.path.join(os.path.sep, 'etc', 'fstab')
 
42
 
 
43
    def __init__(self, path=None):
 
44
        if path:
 
45
            self._path = path
 
46
        else:
 
47
            self._path = self.DEFAULT_PATH
 
48
        file.__init__(self, self._path, 'r+')
 
49
 
 
50
    def _hydrate_entry(self, line):
 
51
        return Fstab.Entry(*filter(
 
52
            lambda x: x not in ('', None),
 
53
            line.strip("\n").split(" ")))
 
54
 
 
55
    @property
 
56
    def entries(self):
 
57
        self.seek(0)
 
58
        for line in self.readlines():
 
59
            try:
 
60
                if not line.startswith("#"):
 
61
                    yield self._hydrate_entry(line)
 
62
            except ValueError:
 
63
                pass
 
64
 
 
65
    def get_entry_by_attr(self, attr, value):
 
66
        for entry in self.entries:
 
67
            e_attr = getattr(entry, attr)
 
68
            if e_attr == value:
 
69
                return entry
 
70
        return None
 
71
 
 
72
    def add_entry(self, entry):
 
73
        if self.get_entry_by_attr('device', entry.device):
 
74
            return False
 
75
 
 
76
        self.write(str(entry) + '\n')
 
77
        self.truncate()
 
78
        return entry
 
79
 
 
80
    def remove_entry(self, entry):
 
81
        self.seek(0)
 
82
 
 
83
        lines = self.readlines()
 
84
 
 
85
        found = False
 
86
        for index, line in enumerate(lines):
 
87
            if not line.startswith("#"):
 
88
                if self._hydrate_entry(line) == entry:
 
89
                    found = True
 
90
                    break
 
91
 
 
92
        if not found:
 
93
            return False
 
94
 
 
95
        lines.remove(line)
 
96
 
 
97
        self.seek(0)
 
98
        self.write(''.join(lines))
 
99
        self.truncate()
 
100
        return True
 
101
 
 
102
    @classmethod
 
103
    def remove_by_mountpoint(cls, mountpoint, path=None):
 
104
        fstab = cls(path=path)
 
105
        entry = fstab.get_entry_by_attr('mountpoint', mountpoint)
 
106
        if entry:
 
107
            return fstab.remove_entry(entry)
 
108
        return False
 
109
 
 
110
    @classmethod
 
111
    def add(cls, device, mountpoint, filesystem, options=None, path=None):
 
112
        return cls(path=path).add_entry(Fstab.Entry(device,
 
113
                                                    mountpoint, filesystem,
 
114
                                                    options=options))