[kernel] r10745 - people/waldi/dkt/lib/dkt/hooks/modules

Bastian Blank waldi at alioth.debian.org
Sat Mar 8 21:16:38 UTC 2008


Author: waldi
Date: Sat Mar  8 21:16:36 2008
New Revision: 10745

Log:
* lib/dkt/hooks/modules/backward_config_boot.py: Remove symlink handling.
* lib/dkt/hooks/modules/backward_symlinks.py: Add symlink handling.


Modified:
   people/waldi/dkt/lib/dkt/hooks/modules/backward_config_boot.py
   people/waldi/dkt/lib/dkt/hooks/modules/backward_symlinks.py

Modified: people/waldi/dkt/lib/dkt/hooks/modules/backward_config_boot.py
==============================================================================
--- people/waldi/dkt/lib/dkt/hooks/modules/backward_config_boot.py	(original)
+++ people/waldi/dkt/lib/dkt/hooks/modules/backward_config_boot.py	Sat Mar  8 21:16:36 2008
@@ -6,7 +6,7 @@
 from dkt.imageconfig.interfaces import IImageBaseConfig
 
 class Hook(object):
-    def _add_config(self, configs, version, image_file, initramfs_file, symlinks_file):
+    def _add_config(self, configs, version, image_file, initramfs_file):
 
         c = {
             'image': {
@@ -21,11 +21,6 @@
         if initramfs_file is not None:
             c['initramfs'] = {'file': initramfs_file}
 
-        if symlinks_file is not None:
-            c['backward-compatibility'] = {
-                'symlink-file': symlinks_file,
-            }
-
         configs.add('boot-backward-' + version, MutableConfig(c))
 
     def _check_config(self, configs, version, data):
@@ -37,46 +32,35 @@
 
         return self._add_config(configs, version, *data)
 
-    def _update_config(self, config, image_file, initramfs_file, symlinks_file):
+    def _update_config(self, config, image_file, initramfs_file):
         config = IMutableConfig(config)
 
-        if symlinks_file is not None:
-            config.add_section('backward-compatibility')
-            config.set('backward-compatibility', 'symlink-file', symlinks_file)
+        if initramfs_file is not None:
             config.add_section('initramfs')
             config.set('initramfs', 'file', initramfs_file)
 
     def _get_files(self):
-        ret = ([], [], [], [])
+        ret = ([], [])
 
         for root, dirs, files in os.walk('/boot'):
             del dirs[:]
             for file in files:
                 real_file = os.path.join(root, file)
                 file_parts = file.split('-', 1)
+
+                if file.endswith('.bak'):
+                    continue
+                if os.path.islink(real_file):
+                    continue
+
+                version = "unknown"
+                if len(file_parts) > 1:
+                    version = file_parts[1]
+
                 if file_parts[0] in ("vmlinuz", "vmlinux"):
-                    if len(file_parts) > 1:
-                        ret[0].append((real_file, file_parts[1]))
-                    else:
-                        ret[2].append((real_file, file))
-                elif file in ("vmlinuz.old", "vmlinux.old"):
-                    ret[2].append((real_file, file))
+                    ret[0].append((real_file, version))
                 elif file_parts[0] in ("initrd.img",):
-                    if len(file_parts) > 1:
-                        ret[1].append((real_file, file_parts[1]))
-                    else:
-                        ret[3].append((real_file, file))
-                elif file in ("initrd.img.old"):
-                    ret[3].append((real_file, file))
-
-        for root, dirs, files in os.walk('/'):
-            del dirs[:]
-            for file in files:
-                real_file = os.path.join(root, file)
-                if file in ("vmlinuz", "vmlinux"):
-                    ret[2].append((real_file, file))
-                elif file in ("initrd.img"):
-                    ret[3].append((real_file, file))
+                    ret[1].append((real_file, version))
 
         return ret
 
@@ -85,35 +69,15 @@
         versions = {}
 
         for file in iter(files[0]):
-            if file[0].endswith('.bak'):
-                continue
             version = file[1]
-            e = versions.setdefault(version, [None, None, None])
+            e = versions.setdefault(version, [None, None])
             e[0] = file[0]
 
         for file in iter(files[1]):
-            if file[0].endswith('.bak'):
-                continue
             version = file[1]
-            e = versions.setdefault(version, [None, None, None])
+            e = versions.setdefault(version, [None, None])
             e[1] = file[0]
 
-        for file in iter(files[2]):
-            if not os.path.islink(file[0]):
-                e = versions.setdefault("unknown", [None, None, None])
-                e[0] = file[0]
-            else:
-                link = os.readlink(file[0])
-                link_parts = os.path.basename(link).split('-', 1)
-                e = versions.get(link_parts[1], None)
-                if e is not None:
-                    e[2] = file[0]
-
-        for file in iter(files[3]):
-            if not os.path.islink(file[0]):
-                e = versions.setdefault("unknown", [None, None, None])
-                e[1] = file[0]
-
         return versions
 
     def image_config(self, configs, systemconfig):

Modified: people/waldi/dkt/lib/dkt/hooks/modules/backward_symlinks.py
==============================================================================
--- people/waldi/dkt/lib/dkt/hooks/modules/backward_symlinks.py	(original)
+++ people/waldi/dkt/lib/dkt/hooks/modules/backward_symlinks.py	Sat Mar  8 21:16:36 2008
@@ -1,7 +1,9 @@
 from itertools import chain
+import os
 
 from dkt.config.interfaces import IMutableConfig
 from dkt.hooks import default_registry, interfaces, register
+from dkt.imageconfig.interfaces import IImageBaseConfig
 
 class Hook(object):
     def _check_active(self, systemconfig):
@@ -12,6 +14,64 @@
         config.add_section('backward-compatibility')
         config.set('backward-compatibility', name, value)
 
+    def _check_file_config(self, configs, type, target, dir, file):
+        for l in configs.itervalues():
+            if IImageBaseConfig(l).file == target:
+                self._set_config(l, 'symlink-dir', dir)
+                self._set_config(l, 'symlink-image-file', file)
+                self._set_config(l, 'symlink-type', type)
+                return
+
+    def _get_files_dir(self, act, old, dir):
+        for root, dirs, files in os.walk(dir):
+            del dirs[:]
+            for file in files:
+                real_file = os.path.join(root, file)
+
+                if not os.path.islink(real_file):
+                    continue
+
+                link = os.path.join(root, os.readlink(real_file))
+                if os.path.dirname(link) != '/boot':
+                    continue
+
+                if file in ("vmlinuz", "vmlinux"):
+                    act.append((dir, file, link))
+                elif file in ("vmlinuz.old", "vmlinux.old"):
+                    old.append((dir, file[:-4], link))
+
+    def _get_files(self):
+        actl = []
+        oldl = []
+        act_dir = act_file = act_target = None
+        old_dir = old_file = old_target = None
+
+        self._get_files_dir(actl, oldl, '/boot')
+        self._get_files_dir(actl, oldl, '/')
+
+        assert len(actl) <= 1
+        assert len(oldl) <= 1
+
+        if len(actl):
+            act_dir, act_file, act_target = actl[0]
+        if len(oldl):
+            old_dir, old_file, old_target = oldl[0]
+
+        if act_dir and old_dir:
+            assert act_dir == old_dir
+            assert act_file == old_file
+
+        return act_dir, act_file, act_target, old_target
+
+    def image_config(self, configs, systemconfig):
+        if not self._check_active(systemconfig):
+            return
+
+        dir, file, act, old = self._get_files()
+
+        self._check_file_config(configs, 0, act, dir, file)
+        self._check_file_config(configs, 1, old, dir, file)
+
     def image_preinst(*args):
         pass
 
@@ -30,30 +90,53 @@
     def image_postrm(*args):
         pass
 
+    def _set_config_partition(self, config, dir, image_file, type):
+        suffix = ''
+        if type == 1:
+            suffix = '.old'
+
+        link_file = os.path.join(dir, image_file + suffix)
+        link_target = config.get('image', 'file')
+        if dir == '/boot':
+            link_target = os.path.basename(link_target)
+
+        config.set('backward-compatibility', 'symlink-image-data', (link_file, link_target))
+
+        link_file = os.path.join(dir, 'initrd.img' + suffix)
+        link_target = None
+
+        initramfs_file = config.get('initramfs', 'file', None)
+        if initramfs_file:
+            link_target = initramfs_file
+            if dir == '/boot':
+                link_target = os.path.basename(link_target)
+
+        config.set('backward-compatibility', 'symlink-initramfs-data', (link_file, link_target))
+
     def boot_config_partition(self, bootconfigs, systemconfig):
         if not self._check_active(systemconfig):
             return
 
-        symlink_act = symlink_act_file = symlink_old = symlink_old_file = None
+        symlink_act = symlink_old = None
         symlink_create = symlink_remove = None
 
         for i in chain(*bootconfigs):
             config = i.config
             if 'backward-compatibility' in config:
-                symlink_file = config.get('backward-compatibility', 'symlink-file', None)
-                if symlink_file:
-                    if symlink_file.endswith('.old'):
-                        symlink_old = i
-                        symlink_old_file = symlink_file
-                    else:
-                        symlink_act = i
-                        symlink_act_file = symlink_file
+                symlink_type = config.get('backward-compatibility', 'symlink-type', None)
+                if symlink_type == 0:
+                    symlink_act = i
+                if symlink_type == 1:
+                    symlink_old = i
 
                 if config.get('backward-compatibility', 'symlink-create', None):
                     symlink_create = i
                 if config.get('backward-compatibility', 'symlink-remove', None):
                     symlink_remove = i
 
+        symlink_dir = symlink_act.config.get('backward-compatibility', 'symlink-dir')
+        symlink_image_file = symlink_act.config.get('backward-compatibility', 'symlink-image-file')
+
         if symlink_create is not None and symlink_create is not symlink_act and symlink_create is not symlink_old:
             symlink_old = symlink_act
             symlink_act = symlink_create
@@ -66,10 +149,10 @@
 
         ret = []
         if symlink_old is not None:
-            symlink_old.config.set('backward-compatibility', 'symlink-file', symlink_old_file)
+            self._set_config_partition(symlink_old.config, symlink_dir, symlink_image_file, 1)
             ret.append(symlink_old)
         if symlink_act is not None:
-            symlink_act.config.set('backward-compatibility', 'symlink-file', symlink_act_file)
+            self._set_config_partition(symlink_act.config, symlink_dir, symlink_image_file, 0)
             ret.append(symlink_act)
         return [ret]
 
@@ -79,8 +162,19 @@
 
         assert len(bootconfigs) <= 2
 
+        for bootconfig in bootconfigs:
+            file, target = bootconfig.config.get('backward-compatibility', 'symlink-image-data')
+            os.unlink(file)
+            os.symlink(target, file)
+
+            file, target = bootconfig.config.get('backward-compatibility', 'symlink-image-data')
+            os.unlink(file)
+            if target:
+                os.symlink(target, file)
+
         return True
 
+register('backward-symlinks', interfaces.IImageConfig, Hook(), default_registry.PRIORITY_LAST, (), ('backward-config-boot',))
 register('backward-symlinks', interfaces.IBootConfigPartition, Hook(), default_registry.PRIORITY_FIRST)
 register('backward-symlinks', interfaces.IBootConfigDeploy, Hook(), default_registry.PRIORITY_FIRST)
 register('backward-symlinks', interfaces.IImageTask, Hook())



More information about the Kernel-svn-changes mailing list