
* S'utilise avec un context manager, le but est de faire un fichier temporaire de backup, et de s'assurer qu'on ferme bien le fichier dans lequel on écrit au fur et à mesure du temps
81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Library designed to write in config files data
|
|
# safely.
|
|
#
|
|
# Author : Pierre-Elliott Bécue <becue@crans.org>
|
|
# License : GPLv3
|
|
# Date : 30/05/2014
|
|
|
|
import tempfile
|
|
import shutil
|
|
import sys
|
|
import time
|
|
|
|
class ConfFile(object):
|
|
"""Class handling ConfigFiles
|
|
|
|
"""
|
|
def __init__(self, filename):
|
|
self._name = filename
|
|
self._backup = None
|
|
self._fd = None
|
|
|
|
def __enter__(self):
|
|
"""This file is used in context manager
|
|
|
|
In case of syntax "with ConfFile("blop") as troll,
|
|
troll will bind on self
|
|
|
|
"""
|
|
self.safe_open()
|
|
return self
|
|
|
|
def __exit__(self, etype, evalue, etraceback):
|
|
"""Closes file, and, if there is any traceback, restores
|
|
the backup
|
|
|
|
"""
|
|
self._fd.close()
|
|
if etype:
|
|
# In case of exception, cleans the mess.
|
|
self.restore()
|
|
|
|
def safe_open(self):
|
|
"""Open a file in writemode but backups it before.
|
|
|
|
"""
|
|
self._backup = tempfile.NamedTemporaryFile()
|
|
try:
|
|
shutil.copyfile(self._name, self._backup.name)
|
|
except IOError:
|
|
self._backup = None
|
|
|
|
self._fd = open(self._name, 'w')
|
|
|
|
def write(self, data):
|
|
"""Writes data into file
|
|
|
|
"""
|
|
self._fd.write(data)
|
|
|
|
def restore(self):
|
|
"""Restores the tempfile
|
|
|
|
"""
|
|
if self._backup is not None:
|
|
shutil.copyfile(self._backup.name, self._name)
|
|
|
|
def header(self, comment="#"):
|
|
myHeader = """********************************************************************************************
|
|
This file was generated automatically using the software %s.
|
|
|
|
You should not modify it directly if you don't know what you are doing.
|
|
|
|
Date : %s
|
|
********************************************************************************************""" % (sys.argv[0].split("/")[-1], time.strftime("%d/%m/%Y - %H:%M:%S", time.localtime()))
|
|
myHeader = comment + myHeader.replace("\n", "\n%s" % (comment,))
|
|
myHeader += "\n\n"
|
|
|
|
self.write(myHeader)
|