百度网盘爬虫百度图片爬虫后这是本人第三篇有关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. Linux 调度器发展简述

    引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...

  2. myEclipse的配置

  3. python 将编码转为汉字

    print '\u57fa\u7840\u5316\u5de5\u4e1a'.decode('unicode-escape') print urllib.unquote("%C0%FA%CA ...

  4. AllJoyn 的JoinSession() 返回timeout问题

    在项目中AllJoyn一直有个问题困扰着我们:client在加入session时调用JoinSession()函数有时会timeout失败. 注意:是“有时”失败,而有时又运行的很好.这种不确定性问题 ...

  5. Linux C高级编程——网络编程之以太网(2)

    Linux网络编程--以太网 宗旨:技术的学习是有限的,分享的精神是无限的. 1.以太网帧格式 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的.用ifconf ...

  6. javascript 中用到的时间戳函数

    JavaScript 获取当前时间戳:第一种方法: var timestamp = Date.parse(new Date()); 例如结果:1280977330000第二种方法: var times ...

  7. TestNG参数化测试Spring应用Dubbo接口

    一.配置dubbo的Bean文件: 配置spring-dubbo.xml文件: <dubbo:reference interface="com.datatrees.basisdata. ...

  8. NSPredicate模糊搜索和精确搜索

    #pragma mark ------------ searchBar 代理方法 -------------------------- - (void)searchBar:(UISearchBar * ...

  9. 算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说,首先以字符串的形式输入两个整 ...

  10. HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑

    博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-215- ...