Tuesday, December 30, 2014

script to copy installed package in main host to lxc host

 save some bandwidth when we can copy already install packaged to lxc contain.

save the followings named install-local.py
for example to install xinit in container man ubuntu14.04
root@lxc:/# python install-local.py -i xinit ubuntu14.04


-----------script -------------

#!/usr/bin/python
import re
import os
import sys
import datetime

dpkgStatusFile = "/var/lib/dpkg/status"


def parseStatusFile(stsFile):
    dpkgRead = open(stsFile,"r")
    dpkgReadr = dpkgRead.read()

    dpkgList = dpkgReadr.split("\n")

    dpkgDic = {}
    checkDep = False
    for i in dpkgList:
       
        if i != "":
            if re.search("^Package:\s", i):
                pkgName = re.sub("Package:\s", "", i)
                dpkgDic[pkgName] = []
                checkDep = True

            if checkDep == True:
                #print i
                if re.search("Depends:\s", i):
                    #print i
                    i = re.sub("Depends:\s|Pre-Depends:\s", "", i)
                    il = i.split(",")
                    ill = []
                    for ii in il:
                        ii = re.sub("\(.*\)|:any", "", ii)
                        ii = ii.strip()

                        if re.search("\|", ii):
                            newii = ii.split("|")
                            #print "Multi-choices packags " +  ii
                            ii = newii[0].strip()
                        ill.append(ii)
                    #print ill
                    dpkgDic[pkgName] = ill
                    checkDep = False
    dpkgRead.close()
    return dpkgDic


def getBlockText(inputfile):
    fread = open(dpkgStatusFile, "r")
    fread1 = fread.read()
   

    findList = re.finditer("\nPackage:\s", fread1)

    strs = 0
    n = 0
    indexList = []
    contentDic = {}
    for m in re.finditer("\nPackage:\s", fread1):

        if strs == 0:
            stre = m.start()
            strs = stre
            continue

        stre = m.start()
        blockText = fread1[strs - 1 :stre]
        u = re.search("\nPackage:\s(.*)\n", blockText).group(1)
        contentDic[u] = blockText
        #print u
        strs = stre
    fread.close()
    return contentDic

dpkgDic =  parseStatusFile(dpkgStatusFile)

installList = []
unCheck = []
newUncheck = []

def checkList(pname, pdep):
    tocheck = []
    if pname not in installList:
        installList.append(pname)
    for i in pdep:
        if i not in installList:
            tocheck.append(i)
        else:
            pdep.remove(i)
    if len(pdep) == 0:
        return True, pdep
    else:
        return False, pdep

class findInstallPackage:

    installpack = []
   
    packageStatus = True
   
    def __init__(self, pname, packDic):
        self.pname = pname
        self.packDic = packDic

    def checkList(self, inpname, pdep):
        tocheck = []
        if inpname not in self.installpack:
            self.installpack.append(inpname)
        for i in pdep:
            if i not in self.installpack:
                tocheck.append(i)
            else:
                pdep.remove(i)
        if len(pdep) == 0:
            return True, pdep
        else:
            return False, pdep
    def checking(self):
        noFound = True
        listComplete = False
        unCheck = []
        newUncheck = []
        for i in self.packDic:
            if i == self.pname:
                #print dpkgDic[i]
                noFound = False
                self.installpack.append(i)
                if len(self.packDic[i]) == 0:
                    listComplete = True
                else:
                    unCheck = self.packDic[i]
                    while listComplete == False :
                        for i in unCheck:
                            #print dpkgDic[i]
                            listComplete, newList = self.checkList(i, self.packDic[i])
                            newUncheck += newList
                        unCheck = list(set(newUncheck))
                        newUncheck = []
        if noFound == True:
            self.packageStatus = False
            #print "package not found"


if len(sys.argv) == 1 :
    print "pls provide options"

elif sys.argv[1] == "-l":
    pname = sys.argv[2]
    listPack = findInstallPackage(pname, dpkgDic)
    listPack.checking()
    print listPack.installpack

elif sys.argv[1] == "-i":
    pname = sys.argv[2]
    listPack = findInstallPackage(pname, dpkgDic)
    listPack.checking()
    if listPack.packageStatus == True:
        containerName = sys.argv[3]
        lxcroot = "/var/lib/lxc/"
        lxcStatusFile = lxcroot + containerName + "/rootfs" + dpkgStatusFile
        print lxcStatusFile
        if os.path.isfile(lxcStatusFile):
            lxcPackDic = parseStatusFile(lxcStatusFile)
            missing = []

            for i in listPack.installpack:
                #if i in lxcPackDic.keys():
                for j in lxcPackDic.keys():
                    #print j
                    if i.strip() == j.strip():
                        missing.append(i)

            #print missing
            missing = list(set(listPack.installpack) - set(missing))
            print missing
            listTocopy = []

            statusFileContent = ""

            for i in missing:
                l1 = os.popen("apt-file list '" + i + "'").read()
                l1 = l1.split("\n")
                for ii in l1:
                    if ii != "":
                        if re.search("^" + i + ":\s", ii):
                            print ii
                            ii = ii.split(": ")

                            #print i
                            if re.search("/usr/share/man/|/usr/share/doc/", ii[1]):
                                pass
                            else:
                                listTocopy.append(ii[1])
                                print ii[1]
                                os.system("rsync -u -l -R -X '" + ii[1] + "' '" + lxcroot + containerName + "/rootfs'")

           
            #print listTocopy
            logfile = open(containerName, "a")
            lxcStatus = open(lxcStatusFile, "a")
            dnow = datetime.datetime.now()


            x = getBlockText(dpkgStatusFile)
            for i in missing:
                cx = x[i].strip()
                statusFileContent += "\n\n" + cx
           
            print statusFileContent
            logContent = str(dnow) + "\n\n" + statusFileContent
            print logContent

            logfile.write(logContent)
            lxcStatus.write(statusFileContent)
            lxcStatus.write("\n")
            logfile.close()
            lxcStatus.close()



------ end script ---------


ont the lxc container search for xinit
ubuntu@ubuntu14:~$ dpkg -s xinit
Package: xinit
Status: install ok installed
Priority: optional
Section: x11
Installed-Size: 104
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 1.3.2-1
Depends: libc6 (>= 2.11), libx11-6, coreutils (>= 7.4-1), x11-common, xauth
Recommends: xserver-xorg | xserver, xterm | x-session-manager | x-window-manager | x-terminal-emulator
Conffiles:
 /etc/X11/xinit/xinitrc c11ee025d7c11c6e0b7a90d76cb424d1
 /etc/X11/xinit/xserverrc 50faa91e980a25adcd0de32020b340bb
Description: X server initialisation tool
 xinit and startx are programs which facilitate starting an X server, and
 loading a base X session.
Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org>


No comments:

Post a Comment