python 差分包制作-如何来制作差分包?

百度网盘爬虫百度图片爬虫后这是本人第三篇有关python的文章了,由于本人之前做过嵌入式的一些东西,其中会涉及到差分包的制作,所以这篇文章想谈谈如何利用python来制作差分包,如果你对嵌入式的东西不是感兴趣,可以看看我做的网站:去转盘网或者ok搜搜,本人也是个互联网开发爱好者。

不喜欢说那么多,直接上代码:

#!/usr/bin/env python2.7
import os
import sys
import commands

CurPath = ""

class Script(object):
def __init__(self, filepath):
self.HomePath = "/mnt"
self.TargetPath = "/system"
commands.getstatusoutput("rm -rf " + filepath)
os.mkdir(filepath)
self.PatchPath = "patchfiles"
os.mkdir(filepath + "/" + self.PatchPath)
os.mkdir(filepath + "/script")
self.FD = open(filepath + "/script/update.script", "w")
self.zipPath = filepath
self.FD.writelines("mount -t ext4 /dev/ndsystem /system\n")

def getPatchPath(self):
return self.zipPath + "/" + self.PatchPath

def baseName(self, filename):
assert isinstance(filename, str)
s = filename.rfind("/")
return filename[s + 1:len(filename)]

def dirName(self, filename):
assert isinstance(filename, str)
s = filename.rfind("/")
return filename[0:s]

def getSrcFileName(self, filename):
return self.HomePath + "/" + self.baseName(filename)

def chmod(self, mode, s):
self.FD.writelines(("chmod %o %s\n" % (mode, self.TargetPath + s)))

def chown(self, uid, gid, s):
self.FD.writelines(("chown %d:%d %s\n" % (gid, uid, self.TargetPath + s)))

def copy(self, s):
self.FD.writelines("mkdir -p %s\n" % self.dirName(self.TargetPath + s))
self.FD.writelines("cp -f %s %s\n" % (self.getSrcFileName(s), self.TargetPath + s))

def mkDir(self, s):
self.FD.writelines("mkdir -p %s\n" % (self.TargetPath + s))

def delete(self, s):
self.FD.writelines("rm -rf %s\n" % (self.TargetPath + s))

def deleteSrc(self, s):
self.FD.writelines("rm -rf %s\n" % (self.getSrcFileName(s)))

def patch(self,s):
self.FD.writelines("/bin/bspatch %s %s %s\n" % (self.TargetPath + s, self.TargetPath + s, self.getSrcFileName(s)))

def ln(self,s,t):
self.FD.writelines("ln -s %s %s\n" % (s,self.TargetPath + t))

def outStr(self, s):
self.FD.writelines(s)

def extract(self, s):
self.FD.writelines("extract %s\n" % (self.PatchPath + s))

def __del__(self):
self.FD.writelines("reboot\n");
self.FD.close()

class Package(object):
def __init__(self, fs_config, dir_path, scrip):
self.PackagePath = dir_path
self.fsStats = []
self.fileList = []
self.ReadDir(dir_path, dir_path)
self.ReadConfig(fs_config)
self.Gen = scrip
print(dir_path)

def getPath(self):
return self.PackagePath

def runCommand(self, cmd):
(status, output) = commands.getstatusoutput(cmd)
return status

def ChFsStat(self, filename):
for f in self.fsStats:
if (filename == f.Path):
self.Gen.chmod(f.Mode, filename)
self.Gen.chown(f.Gid, f.Uid, filename)
return
self.Gen.chmod(int("0755", 8), filename)
self.Gen.chown(1000, 0, filename)

#http://www.quzhuanpan.com/

def Patch(self, filename, p):
fn = self.PackagePath + filename
if os.path.islink(fn):
if (os.readlink(fn) != os.readlink(p.getPath() + filename)):
self.Gen.delete(filename)
self.Gen.ln(os.readlink(fn),filename)
return
if not os.path.isdir(fn):
command = "diff " + fn + " " + p.getPath() + filename
# print(command)
if (self.runCommand(command) != 0):
command = "mkdir -p " + self.Gen.getPatchPath() + os.path.dirname(filename)
self.runCommand(command)
command = CurPath + "/bsdiff " + p.getPath() + filename + " " + fn + " " + self.Gen.getPatchPath() + filename
print(command)
self.runCommand(command)
self.Gen.extract(filename)
self.Gen.patch(filename)
self.ChFsStat(filename)
self.Gen.deleteSrc(filename)

def NewFile(self, filename, p):
fn = self.PackagePath + filename
if os.path.isdir(fn):
if os.listdir(fn):
return
self.Gen.mkDir(filename)
self.ChFsStat(filename)
return
if os.path.islink(fn):
self.Gen.ln(os.readlink(fn),filename)
return
if os.path.dirname(filename) != "/":
command = "mkdir -p " + self.Gen.getPatchPath() + os.path.dirname(filename)
self.runCommand(command)
print(command)
command = "cp -lf " + self.PackagePath + filename + " " + self.Gen.getPatchPath() + filename
print(command)
self.runCommand(command)
self.Gen.extract(filename)
self.Gen.copy(filename)
self.ChFsStat(filename)
self.Gen.deleteSrc(filename)

def DelFile(self, filename, p):
command = "rm -rf " + filename
print(command)
self.Gen.delete(filename)

class FsStat:
def __init__(self, _str):
s = str(_str[1])
s = s.lstrip("‘")
if len(s) > 0:
s = s.rstrip("‘")
self.Path = s.replace("system/", "/")
s = str(_str[2])
s = s.lstrip("‘")
if len(s) > 0:
s = s.rstrip("‘")
self.Prefix = s
self.Uid = int(_str[3])
self.Gid = int(_str[4])
s = _str[5]
s = s[len(s) - 4:len(s)]
self.Mode = int(s, 8)

#http://www.quzhuanpan.com/home/sourceList.jsp?type=1
def ReadDir(self, dir_path, src_path):
for dir in os.listdir(dir_path):
subdir = dir_path + "/" + dir
self.fileList.append(subdir.replace(src_path, ""))
if os.path.isdir(subdir):
self.ReadDir(subdir, src_path)

def ReadConfig(self, fs_config):
fileName = fs_config
fd = open(fileName, "r")
for line in fd.readlines():
# print(line)
if line.startswith("<"):
str = line.split(" ")
self.fsStats.append(self.FsStat(str))
fd.close()

def DumpFileList(self):
for file in self.fileList:
print(file)

def DumpFsStats(self):
for fs_stat in self.fsStats:
assert isinstance(fs_stat, self.FsStat)
print("%s, %s, %d, %d, %o" % (fs_stat.Path, fs_stat.Prefix, fs_stat.Uid, fs_stat.Gid, fs_stat.Mode))

def checkFile(self):
for file_st in self.fsStats:
# print("CheckFile file_st.Path dddd %s %d" % (file_st.Path,len(self.fileList)))
try:
self.fileList.index(file_st.Path)
except:
print("CheckFile file_st.Path %s" % (file_st.Path))
return False
return True

def DiffPackage(old, new):
assert isinstance(new, Package)
assert isinstance(old, Package)
for s in new.fileList:
try:
if old.fileList.index(s) >= 0:
# print("xxxxx %s, index:%d oldfile:%s " % (s,old.fileList.index(s), old.fileList[old.fileList.index(s)]))
new.Patch(s, old)
except:
new.NewFile(s, old)

for s in old.fileList:
try:
new.fileList.index(s)
except:
old.DelFile(s, old)

if __name__ == ‘__main__‘:
CurPath = sys.argv[1]
script = Script(CurPath + "/updatezip")

oldpackage = Package(CurPath + "/old_fs_config.txt", CurPath + "/rootfs_system_old", script)
# oldpackage.DumpFileList()
#oldpackage.DumpFsStats()
if (oldpackage.checkFile() == False):
print("Old Package Fail!")
newpackage = Package(CurPath + "/new_fs_config.txt", CurPath + "/rootfs_system_new", script)
#oldpackage.DumpFileList()
#newpackage.DumpFileList()
#newpackage.DumpFsStats()
if (newpackage.checkFile() == False):
print("New Package Fail!")
DiffPackage(oldpackage, newpackage)

时间: 2024-11-20 01:08:14

python 差分包制作-如何来制作差分包?的相关文章

Python -WordCloud安装、词云制作

一.WordCloud 安装 说明:Windows系统直接pip install wordcloud 是不行的,命令行会报错. 第一步:检查自己的Python 版本.Win+R ——>CMD——>命令行输入python,我的是python 3.7 win32位的 第二步:下载对应版本的WordCloud,进入 python 扩展包库 (非正式第三方whl文件包)下载 第三步:安装.命令行先定位到下载的wordcloud安装文件路径,再输入 pip install wordcloud-1.6.0

2019左其盛差评榜,罕见的差书榜(截至2月28日)

差书榜除了我这个再没见过别的媒体自媒体给出过.毕竟给差评是得罪人的事,另外给一些名人的书打差评也需要一定的见识和勇气. 各位书友如果看到好的差书榜,欢迎向我推荐. 这个清单是今年我看过并且有点名气的.我给了差评(2.5星.2星.1星)的书,还有一种情况就是预期较高的3星也列进来.以经管类书为主. 这个好书榜每月初更新,内容截至上月底. 在公众号的菜单中可以找到持续更新的好书榜.差评榜.总榜. 经管类书我看的多,评级的参考意义比其他类别更大. 经管类图书的评级,主要考察思想的新颖度和信息量.信息浓

2019左其盛差评榜,罕见的差书榜(截至3月31日)

差书榜除了我这个再没见过别的媒体自媒体给出过.毕竟给差评是得罪人的事,另外给一些名人的书打差评也需要一定的见识和勇气. 各位书友如果看到好的差书榜,欢迎向我推荐. 这个清单是今年截至3月31日我看过并且有点名气的.我给了差评(2.5星.2星.1星)的书,还有一种情况就是预期较高的3星也列进来.以经管类书为主. 这个好书榜每月初更新,内容截至上月底. 在公众号的菜单中可以找到持续更新的好书榜.差评榜.总榜. 经管类书我看的多,评级的参考意义比其他类别更大. 经管类图书的评级,主要考察思想的新颖度和

GIF表情包怎么在线制作,如何制作GIF

说到表情包,你第一个会联想到谁?每个人想到的可能都不一样,因为让人耳目一新的表情包太多了,比如王境泽的真香,韬韬的各种表情包以及权律的经典表情包,哪一个不是在灵魂深处,那GIF表情包怎么在线制作,如何制作GIF呢?1.首先制作GIF的工具有很多,运行GIF制作工具,不仅可以在线制作GIF,还可以对已有的视频或者图片转GIF制作:2.双击运行制作工具,如果想在线制作GIF,可以选择选择"启动屏幕录制",会出现一个录制框,录制框的大小是可以自己调整的,然后打开要录制的内容即可开始操作:3.

python包安装及安装包制作

1. 单文件模块:直接把文件拷贝到$python_dir/lib  这是类库目录(可直接将单文件或单包放在这里) 2. 多文件模块,带setup.py:python setup.py install    卸载时只能手动删除,一般安装在系统类库目录下 python setup.py install --record files.txt 记录安装后文件的路径 (卸载cat files.txt | xargs rm -rf  删除这些文件) 3.easy_install 方式 1) 下载ez_set

python第十五天-原来还差一份作业

作业 1: 员工信息表程序,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select * from staff_table where dept = "IT" select * from staff_table where enroll_date like "2013"查到的信息,打印后,最后面还要显示查到的条数 可创建新员工纪录,以phone做唯一键

python 读取全国城市aqi数据,差值生成png图片

# -*- coding: utf-8 -*- import arcpy import sys import datetime import cx_Oracle import json import os import time import uuid from arcpy import env from arcpy.sa import * env.workspace = r"F:\py"; mapPath = r"F:\py"; imagepath = r'F:\

Python之pygame学习绘制文字制作滚动文字

pygame绘制文字 ? 今天来学习绘制文本内容,毕竟游戏中还是需要文字对玩家提示一些有用的信息. 字体常用的不是很多,在pygame中大多用于提示文字,或者记录分数等事件. 字体绘制基本分为以下几个步骤: 初始化字体模块 pygame.init() 创建一个字体对象 可以从文件或者系统内字体选取 pygame.font.SysFont('幼圆',50) 绘制文本对象. a.render("测试字体",True,(255,0,0),(0,0,0)) 屏幕绘制字体 screen.blit

python之集合关系的交,差,并集

1.python_1=['yy','lyf','wyb','xz','lx'] linux_2=['gql','ch','wyb','dc','xz'] ps=set(python_1) ls=set(linux_2) print(ps.intersection(ls))        //输出结果为{'xz', 'wyb'},求集合交集 print(ps&ls)                          //输出结果为{'xz', 'wyb'} 2.python_1=['yy','ly