summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@redhat.com>2007-09-21 20:29:06 -0400
committerMichael DeHaan <mdehaan@redhat.com>2007-09-21 20:29:06 -0400
commit0d1ea605ec8d69b1cdf81c03fe0ec13336cb11ec (patch)
tree24f27c9ed4d27d330b9cb6c1ddf342d3f246d585 /modules
parent9b09d8219d0875281c5e53342580979c614320a6 (diff)
parent5e2051aa6b318830c15a4fd2dc67acb8f96e4ab7 (diff)
downloadthird_party-func-0d1ea605ec8d69b1cdf81c03fe0ec13336cb11ec.tar.gz
third_party-func-0d1ea605ec8d69b1cdf81c03fe0ec13336cb11ec.tar.xz
third_party-func-0d1ea605ec8d69b1cdf81c03fe0ec13336cb11ec.zip
Merge branch 'master' of ssh://git.fedoraproject.org/git/hosted/func
Diffstat (limited to 'modules')
-rw-r--r--modules/copyfile.py104
-rw-r--r--modules/yummod.py48
2 files changed, 152 insertions, 0 deletions
diff --git a/modules/copyfile.py b/modules/copyfile.py
new file mode 100644
index 0000000..7d04abf
--- /dev/null
+++ b/modules/copyfile.py
@@ -0,0 +1,104 @@
+# Copyright 2007, Red Hat, Inc
+# seth vidal
+#
+# This software may be freely redistributed under the terms of the GNU
+# general public license.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+import sha
+import os
+import time
+import shutil
+
+from modules import func_module
+
+
+
+
+class CopyFile(func_module.FuncModule):
+
+ def __init__(self):
+ self.methods = {
+ "copyfile" : self.copyfile,
+ "checksum" : self.checksum
+ }
+ func_module.FuncModule.__init__(self)
+
+ def checksum(self, thing):
+
+ CHUNK=2**16
+ thissum = sha.new()
+ if os.path.exists(thing):
+ fo = open(thing, 'r', CHUNK)
+ chunk = fo.read
+ while chunk:
+ chunk = fo.read(CHUNK)
+ thissum.update(chunk)
+ fo.close()
+ del fo
+ else:
+ # assuming it's a string of some kind
+ thissum.update(thing)
+
+ return thissum.hexdigest()
+
+
+ def copyfile(self, filepath, filebuf):
+ # -1 = problem file was not copied
+ # 1 = file was copied
+ # 0 = file was not copied b/c file is unchanged
+
+ dirpath = os.path.dirname(filepath)
+ basepath = os.path.basename(filepath)
+ if not os.path.exists(dirpath):
+ os.makedirs(dirpath)
+
+ remote_sum = self.checksum(filebuf)
+ local_sum = 0
+ if os.path.exists(filepath):
+ local_sum = self.checksum(filepath)
+
+ if remote_sum != local_sum:
+ # back up the localone
+ if os.path.exists(filepath):
+ if not self._backuplocal(filepath):
+ return -1
+
+ # do the new write
+ try:
+ fo = open(filepath, 'w')
+ fo.write(filebuf)
+ fo.close()
+ del fo
+ except (IOError, OSError), e:
+ # XXX logger output here
+ return -1
+ else:
+ return 0
+
+ return 1
+
+ def _backuplocal(self, fn):
+ """
+ make a date-marked backup of the specified file,
+ return True or False on success or failure
+ """
+ # backups named basename-YYYY-MM-DD@HH:MM~
+ ext = time.strftime("%Y-%m-%d@%H:%M~", time.localtime(time.time()))
+ backupdest = '%s.%s' % (fn, ext)
+
+ try:
+ shutil.copy2(fn, backupdest)
+ except shutil.Error, e:
+ #XXX logger output here
+ return False
+ return True
+
+
+
+methods = CopyFile()
+register_rpc = methods.register_rpc
diff --git a/modules/yummod.py b/modules/yummod.py
new file mode 100644
index 0000000..575b001
--- /dev/null
+++ b/modules/yummod.py
@@ -0,0 +1,48 @@
+# Copyright 2007, Red Hat, Inc
+# James Bowes <jbowes@redhat.com>
+#
+# This software may be freely redistributed under the terms of the GNU
+# general public license.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+from modules import func_module
+
+import yum
+
+# XXX Use internal yum callback or write a useful one.
+class DummyCallback(object):
+
+ def event(self, state, data=None):
+ pass
+
+class Yum(func_module.FuncModule):
+
+ def __init__(self):
+ self.methods = {
+ "yum_update" : self.update
+ }
+ func_module.FuncModule.__init__(self)
+
+ def update(self):
+ # XXX support updating specific rpms
+ ayum = yum.YumBase()
+ ayum.doGenericSetup()
+ ayum.doRepoSetup()
+ try:
+ ayum.doLock()
+ ayum.update()
+ ayum.buildTransaction()
+ ayum.processTransaction(
+ callback=DummyCallback())
+ finally:
+ ayum.closeRpmDB()
+ ayum.doUnlock()
+ return True
+
+
+methods = Yum()
+register_rpc = methods.register_rpc