百度网盘爬虫百度图片爬虫后这是本人第三篇有关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)

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

  1. python 跑服务器,访问自己制作的简单页面

    1  python 跑服务器,访问自己制作的简单页面 2 # win+b出现一个网址http:/0.0.1:5000/复制到浏览器查看# http://127.0.0.1:5000/home 做这个首 ...

  2. [TPYBoard-Micropython之会python就能做硬件 3] 制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.TPYboard V102板  一块 2.DS3231 ...

  3. python模块安装查看、包制作

    一. 模块安装 ubuntu : apt-get install python-pip redhat: yum install python-pip pip install 模块 pip instal ...

  4. 将python包发布到PyPI和制作whl文件

    参考链接:wheel和egg的不同怎样将自己写的包传达到PyPi发布你自己的轮子 - PyPI打包上传实践PyPI官网上传包教程 wheel文件Wheel和Egg都是python的打包格式,目的是支持 ...

  5. Python 支付宝红包二维码制作步骤分享

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 支付宝红包二维码制作步骤分享 2022. ...

  6. python与mongodb的交互 增删改差

    首先引入包: pip install pymongo需要用到如下对象: MongoClient对象:用于与MongoDB服务器建立连接 client=MongoClient('主机ip',端口) Da ...

  7. 万能的Python,还能用来制作高大上的进度条?

    对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况.那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到哪一步了呢? ...

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

    作业 1: 员工信息表程序,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select ...

  9. Python 同ip网站查询(制作网站接口)

    老师专门打电话回来说不让玩电脑~~   呵呵.  LOL把被人坑死了. 五排果然不适合我. 去翻了下曾经的Python项目. 在爬虫文件夹下面找到了这个. 我也就厚脸皮的什么都不改就放上来了: #co ...

随机推荐

  1. XssEncode

    0x00 闲扯 好吧继上一篇文章之后,就没发文章了!(其实是一直在写但是写的很少还凑不起一篇文章而已) 但是这几天对插件进行了一定的改良了 因为在自己在实际的XSS过程中也发现了自己的插件 还不够强大 ...

  2. 可视化Tensorboard图中的符号意义

    可视化Tensorboard图中的符号意义

  3. Servlet3.0使用@WebServlet注解配置问题记录

    文档说@WebServlet的配置属性都是可选的,不是必需的. 经实践,将一个Servlet配置成load-on-startup的Servlet时,若只添加loadOnStartup属性,该Servl ...

  4. centos7安装后的防火墙问题

    centos7 默认使用firewall作为防火墙 停止并关闭开机自启动: systemctl stop firewalld.service #停止firewall systemctl disable ...

  5. JMS与Spring之二(用message listener container异步收发消息)

    转自:http://blog.csdn.net/moonsheep_liu/article/details/6684948

  6. iOS Mapkit 定位REGcode地理位置偏移

    在iOS上,使用系统Mapkit定位,获取到的坐标会有偏移: 今有需求,用系统Mapkit定位,并Regcode出实际地理位置,修正偏移: 解决方案: 使用MapView的代理 - (void)map ...

  7. vue - (v-pre、v-cloak、v-once)

    1.v-pre,不和绑定的数据冲突,也就是不用它们的值 2.v-cloak,和css样式一起用,vue渲染未完成不显示 3.v-once,只渲染DOM第一次渲染的值,以后不会改变了(你不要刷新网页,然 ...

  8. 易语言调用csharp写的COM组件的程序在Win2008上奔溃的解决办法

    易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Micro ...

  9. 【转】Struts2 和 Spring MVC对比

    1. 实现机制 struts2框架是类级别的拦截,每次来了请求就创建一个controller中对应的Action,然后调用setter getter方法把request中的数据注入 .struts2实 ...

  10. JavaScript | JSON基本格式

    ————————————————————————————————————————————————————————— JSON 语法 "use strict"; // 简单值 &qu ...