icePatch2 是一个容易配置和使用的高效的文件补丁服务。它包括以下组件:
1.IcePatch 服务器(icepatch2server)
2.一个基于文本的IcePatch客户端(icepatch2client)
3.一个基于文本的压缩和计算校验和的工具(icepatch2calc)
4.一个用于开发客户化IcePatch2客户端的sliceAPI和C++开发库。
IcePatch服务能够将一个文件系统目录包括其中的文件和子目录分发到各个客户端。使用icepatch2calc命令压缩这些文件和产生一个包含每个文件的校验和的索引。服务器传送压
缩文件给客户端,这些文件将会在客户端恢复为数据目录和内容,修补任何被在之前运行的被修改过的文件。
1.使用icepatch2calc
假设我们在服务器数据目录下拥有如下图的文件目录结构。
假设名字为emptyFile的文件是空文件,其他的都是包含数据的文件。
服务器要准备传输这些目录,你必须首先运行命令icepatch2calc。
运行完这个命令,数据目录的内容将会变成如下图所示。
注意到icepatch2calc将数据目录中的文件压缩(除了emptyfile,它没有被压缩)。同时注意到icepatch2calc创建了附加的文件--icepatch2.sum.这个文件的内容如下所示:
3a52ce780950d4d969792a2559cd519d7ee8c727 -1
/bin bd362140a3074eb3edb5e4657561e029092c3d91 -1
/bin/hello 77b11db586a1f20aab8553284241bb3cd532b3d5 70
/emptyFile 082c37fc2641db68d195df83844168f8a464eada 0
/nonEmptyFile aec7301c408e6ce184ae5a34e0ea46e0f0563746 72
校验和文件中的内容包含了每个没有被压缩的文件名或者目录名,校验和,和字节数。目录的字节数为-1,没有被压缩的文件字节数为0,被压缩的文件字节数为压缩后文件大小。
每一行是按路径名字母顺序来排序。
如果你从数据目录中添加,删除,修改了文件,你必须停止服务器,重新运行icepatch2calc来更新IcePatch2.sum这个校验和文件,然后重启服务器。
1.1.icepatch2calc 命令行选项
icepatch2calc 使用如下句法
icepatch2calc [option] data_dir [file...]
一般来说,你会简单指定一个数据目录来运行icepatch2calc,这样程序就会在数据目录中压缩所有的文件,和在创建的校验和文件为每一个文件或者目录创建一项纪录。
你同样可以在命令行中指定文件和目录,在这种情况下,icepatch2calc仅为指定的文件或者目录压缩和计算校验和。这对你拥有非常大的文件树而只对其中做了很小一部分更新时
非常有用。你指定的文件名或者目录名必须是相对于数据目录,如果你使用绝对路径,路径名必须使用数据目录作为前缀。
命令支持以下选项
--h, --help
--v, --version
--z, --compress
通常,icepatch2calc仅仅在文件没有压缩版本存在或者文件压缩版本的修改时间早于没有没有压缩版本才扫描数据目录和压缩一个文件。如果你指定--z,这个工组将会重新扫描和压缩整个数据目录而不管文件的时间戳,这对怀疑数据目录的时间戳可能出错的情况下很有用。
--Z, --no-compress
这个选项允许你创建一个客户端校验和文件。
不要使用这个选项为服务器创建校验和文件。这个选项是为创建客户端 IcePatch.sum文件,用来在分发版本中更新软件。
--i, --case-insensitive
这个选项仅对禁用文件名不同,
--V, --verbose
这个选项将输出每个被压缩和计算校验和的消息。
2.运行服务器
一旦你在数据目录上行了icepatch2calc命令,你可以启动icepatch2server了。
$ icepatch2server
服务器期待数据目录作为唯一的命令行参数,如果你忽略指定目录,服务器将使用配置文件中 IcePatch2.directory属性值来决定使用哪个目录。
服务器有两个不同的endpoint,一个是常规操作,一个是用来管理
IcePatch2.Endpoints
这个属性决定服务器在哪个endpoint监听客户端请求,必须指定。
IcePatch2.Admin.Endpoints
如果这个属性没有指定,关掉服务器只能使用kill命令。如果指定,服务器就提供了附加的IcePatch2::Admin接口:
interface Admin{
void shutdowm();
};
默认情况下,这个对象的标识为 IcePatch2/admin,你可以通过设定IcePatch2.InstanceName属性来更改标识的类别。
调用shutdown操作来关掉服务器,注意任意访问到admin接口端点的客户端都能关掉服务,一般你需要设定这个属性来组织怀有敌意的客户端访问。
icepatch2server 选项
-h, --help
-v, --version
3.运行客户端
一旦服务器运行起来,你可以使用icepatch2client命令来从服务器维护的数据目录中取得一份拷贝。
例如:
$ icepatch2client --IcePatch2.Endpoints="tcp -h somehost.com /-p 10000"
客户端期望数据目录作为它唯一的命令行参数。像服务器一样,你必须指定IcePatch2.Endpints属性,使得客户端知道去哪里找服务器。
如果你之前没有运行过客户端,他会问你是否想彻底更新,你必须回答yes(或者使用-t参数运行客户端),客户端将会执行如下步骤:
1.它遍历本地数据目录,创建本地IcePatch2.sum校验和文件。
2.它从服务器获得相关的校验和文件队列,与本地的校验和文件队列比较。
1'客户端删除在本地校验和文件出现而没有在服务器检验和文件出现的文件。
2'客户端恢复在本地校验和文件没有出现而存在于服务器校验和文件中的文件。
3'客户端为每个客户端与服务端不相同文件修补。
客户端完成后,客户端内容与服务器内容相同,但是客户端只创建了没有压缩的文件,而服务端存储了压缩版本,这样简单的避免在客户端每次恢复时重复压缩文件。
3.1 使用icepatch2client进行局部更新
一旦你已经运行了客户端,在客户端数据目录下就包含了IcePatch2.sum文件,它体现了数据目录中的内容。如果你第二次运行icepatch2client,那么程序就会拿着客户端的
IcePatch2.sum与服务器中的比较它们中每一行记录。如果文件内容不一样,客户端就会更新对应的文件,下载服务器有而客户端没有的文件,删掉服务器没有而客户端有的文件。 如果你编辑一个客户端文件,更改了其中的内容,icepatch2client不会意识到文件的改变,因此不会去同步服务器文件内容。这是因为客户端不会自动为一个文件重新计算校验和来判断当前Icepatch2.sum中的存储的校验和是否与实际内容的校验和相符。
同样,如果你随意在客户端创建了一个文件,但是这个文件既没有在客户端也没有在服务器端的校验和文件中记录,那么这个文件将简单的放在一边。换句话说,一个普通的修补操作。。
如果你创建了与发布包无关的本地文件或者你在本地修改了一些文件,而且你想这些修改能在服务器端体现,你必须运行使用命令行选项-t来彻底修补。这样将会强制客户端遍历本地数据目录和为每个文件重新计算校验和,然后与服务器端比较这些校验和。结果,如果你编辑本地一个文件使之与服务器不同,那么它会被强制更新,同样,你在客户端新增一个文件,如果服务器端没有的话,它将被删除。也就是说在客户端任何修改都不会对服务器有影响,可以通过完全更新干掉客户端的不同步。
3.2 阻止删除本地文件
默认情况下,如果服务器没有的文件,而在客户端有,那么完全更新时文件将会删掉。如果你不想这样,你可以将IcePatch2.Remove属性设值为0(默认为1),这样客户端文件就不会被删除了,无论是一般更新还是完全更新。