'Saves all changes to the configuration files.
This function first checks for save errors, if none are found,
all configuration changes made will be saved. According to the
function parameters. If an exception is raised, a new checkpoint
was not created.
:param str title: The title of the save. If a title is given, the
configuration will be saved as a new checkpoint and put in a
timestamped directory.
:param bool temporary: Indicates whether the changes made will
be quickly reversed in the future (ie. challenges)
:raises .errors.PluginError: If there was an error in Augeas, in
an attempt to save the configuration, or an error creating a
checkpoint'

def save(self, title=None, temporary=False):

    save_state = self.aug.get('/augeas/save')
    self.aug.set('/augeas/save', 'noop')
    ex_errs = self.aug.match('/augeas//error')
    try:
        self.aug.save()
    except (RuntimeError, IOError):
        self._log_save_errors(ex_errs)
        self.save_notes = ''
        raise errors.PluginError('Error    saving    files,    check    logs    for    more    info.')
    save_paths = self.aug.match('/augeas/events/saved')
    save_files = set()
    if save_paths:
        for path in save_paths:
            save_files.add(self.aug.get(path)[6:])
        try:
            if temporary:
                self.reverter.add_to_temp_checkpoint(save_files, self.save_notes)
            else:
                self.reverter.add_to_checkpoint(save_files, self.save_notes)
        except errors.ReverterError as err:
            raise errors.PluginError(str(err))
    self.aug.set('/augeas/save', save_state)
    self.save_notes = ''
    self.aug.save()
    if save_files:
        for sf in save_files:
            self.aug.remove(('/files/' + sf))
        self.aug.load()
    if (title and (not temporary)):
        try:
            self.reverter.finalize_checkpoint(title)
        except errors.ReverterError as err:
            raise errors.PluginError(str(err))
