云备份_云备份失败怎么办 华为 - CSDN
精华内容
参与话题
  • 4.16.1了解文档云备份的基本设置 测试编号 了解文档云备份的基本设置 适用场景 熟悉文档云备份的基本设置及操作界面,为后续功能测试打下基础。 用例描述 ...

    4.16.1了解文档云备份的基本设置

    测试编号

    了解文档云备份的基本设置

    适用场景

    熟悉文档云备份的基本设置及操作界面,为后续功能测试打下基础。

    用例描述

    1. 部署完IP-guard服务器、IP-guard客户端、文档云备份服务器后,对文档云备份服务器进行授权,并设置对哪些计算机进行文档备份。
    2. 登录文档云备份控制台,熟悉控制台的各项功能和设置。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→文档备份服务器管理”,选择文档云备份服务器,点击“授权”按钮,可见文档云备份的托盘图标有“未授权 ”变为“已授权 ”状态。
    2. 选择文档云备份服务器,点击“设置范围”,可选择对那些计算机进行文档备份。
    3. 打开浏览器,输入网址http://+文档云备份服务器IP/域名:端口号(默认是80端口),比如:http://192.168.1.137,输入用户名和密码(默认用户名是admin,密码为空)。
    4. 首页显示授权状态、备份概述和磁盘空间情况。
    5. 备份浏览显示用户/计算机的备份文件,需要完成组织架构同步并设置相应的备份策略,才能在备份预览中看到组织架构信息和备份的文件。
    6. 文件查找功能,可通过文件名称、用户、计算机、修改时间、文件大小等条件查找备份文件。
    7. 设置选项,可以完成角色管理、用户权限管理、管理员黑白名单管理和参数设置。
    8. 系统日志,主要记录系统自动清理文件的行为,可记录操作类型、时间和详细描述。

    预期结果

    1. 完成文档云备份服务器的授权,并成功设置那些计算机参与文档备份。
    2. 熟悉文档云备份的控制台及相关的功能设置。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

     

    4.16.2导入AD域的组织架构

    测试编号

    导入AD域的组织架构

    适用场景

    计算机与AD域的用户关联,完成终端的文档备份任务。

    用例描述

    同步AD域组织架构到IP-guard服务器。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→组织架构同步”,在“同步配置”中新增配置。
    2. 服务器类型选择“域服务器”,填写正确的域名、服务器地址、登录账号和密码,点击“测试连接”,显示“成功”,说明IP-guard服务器与AD域连接正常,用户可自主选择是否启用“自动同步”功能。
    3. 在对象设置中,选择“增加 ”,点击“来源选择”,设置同步对象的来源,目标设置选择“用户组”,将用户架构导入到用户页面,点击“确定”按钮,回到同步配置页面,点击“确定”按钮,完成同步配置,点击右上角“立即执行 ”按钮,同步组织架构。
    4. 选择“用户系统管理→服务器配置”,点击“新建 ”服务器类型选择“域服务器”,输入正确的AD域控的域名和服务器地址,点击“高级 ”,点击“测试连接 ”,显示连接成功,即完成服务器配置。
    5. 选择“登录验证”,点击“编辑 ”,可选择“强制验证”或“非强制验证”,在选择“包含范围”即可。
    6. 如果选择“强制验证”,则计算机开机后,会弹出用户关联认证窗口,必须输入AD域账号密码完成验证,才能使用计算机,如果选择“非强制验证”,则计算机开机后,会弹出用户关联认证窗口,用户可以选择输入AD域账号密码完成验证,也可以关闭用户关联认证窗口,不进行用户关联认证。

    预期结果

    AD域的组织架构同步到IP-guard服务器中,在IP-guard控制台主页的“用户”栏,可以查看同步过来的组织架构信息。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

    4.16.3导入LDAP用户系统的组织架构

    测试编号

    导入LDAP用户系统的组织架构

    适用场景

    计算机与LDAP用户系统的用户关联,完成终端的文档备份任务。

    用例描述

    1. 将LDAP用户系统的组织架构同步到IP-guard服务器。
    2. 强制用户使用LDAP账户密码登录计算机。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→组织架构同步”,在“同步配置”中新增配置。
    2. 服务器类型选择“LDAP服务器”,填写正确的域名、服务器地址,点击“高级 ”,勾选“匿名连接 ”,点击“测试连接 ”,显示连接成功,说明IP-guard服务器与LDAP服务器连接正常,用户可自主选择是否启用“自动同步”功能。
    3. 在对象设置中,选择“增加 ”,点击“来源选择”,设置同步对象的来源,目标设置选择“用户组”,将用户架构导入到用户页面,点击“确定”按钮,回到同步配置页面,点击“确定”按钮,完成同步配置,点击右上角“立即执行 ”按钮,同步组织架构。
    4. 组织架构同步成功后,可在IP-guard控制台主页的左边“用户栏 ”看到从LDAP用户系统导入的用户架构。
    5. 选择“用户系统管理→服务器配置”,点击“新建 ”服务器类型选择“LDAP服务器”,输入正确的的域名和服务器地址,点击“高级 ”,点击“测试连接 ”,显示连接成功,即完成服务器配置。
    6. 选择“登录验证”,点击“编辑 ”,可选择“强制验证”或“非强制验证”,在“包含范围”选择对应的计算机即可。
    7. 如果选择“强制验证”,则计算机开机后,会弹出用户关联认证窗口,必须输入LDAP账号密码完成验证,才能使用计算机,如果选择“非强制验证”,则计算机开机后,会弹出用户关联认证窗口,用户可以选择输入LDAP账号密码完成验证,也可以关闭用户关联认证窗口,不进行用户关联认证。

    预期结果

    LDAP用户系统的组织架构同步到IP-guard服务器中,在IP-guard控制台主页的“用户”栏,可以查看同步过来的组织架构信息。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

    4.16.4启动文档云备份功能

    测试编号

    启动文档云备份功能

    适用场景

    启动终端文档备份任务。

    用例描述

    启动终端文档备份任务,自动备份终端制定类型的文件。

    测试步骤

    1. 登录IP-guard控制台,在计算机树中选择整个网络、分组或某台计算机,再选择“高级→文档云备份”。
    2. 点击“修改文档备份设置 ”,勾选“启动文档备份任务”,可设置包含文件和排除文件的范围,设置备份范围、备份间隔、备份流量、备份时段、定期扫描等功能。
    3. 登录文档云备份控制台,选择“设置→参数设置”依次填写“IP-guard服务器地址、域服务器地址、域名、组织架构同步设置、备份存储设置、历史副本数量、磁盘空间清理、端口映射等设置”。
    4. 计算机开机后,系统会自动弹出用户关联认证窗口,输入AD域或LDAP用户系统的用户名和密码,完成身份认证。
    5. 在终端计算机上对文件进行如下操作时,文档将自动进行备份,包括:新建、重命名、另存为、修改、复制、拖拽、移动等操作。

    预期结果

    1. 完成文档备份的各项设置。
    2. 用户可以使用AD域或LDAP用户系统的账号密码完成登录验证。

    测试结果

    满足:             部分满足:             不满足:

    备注

    如果测试环境没有AD域或LDAP用户系统,计算机没有关联域用户/LDAP用户,可配置客户端策略enable_relt_common_user = 1,强制关联本地用户进行文档备份。

     

     

     

    4.16.5文档备份权限管理

    测试编号

    文档备份的用户权限管理

    适用场景

    限制用户对备份文档的各种权限。

    用例描述

    设置用户对备份文档的查看、下载和删除权限,设置用户管理备份文档的范围。

    测试步骤

    1. 登录文档云备份控制台,选择“设置→角色管理”。
    2. 点击右上角“添加角色 ”,填写“角色名称”,设置“用户权限”,包括查看文档权限、下载文档权限、删除文档权限。
    3. 在“已分配对象”中,可选择该角色权限应用于那些用户。
    4. “管理范围”默认为空,指应用到此角色的用户只管理自己的备份文档,不管理其他用户的备份文档,(假设:新建的角色为研发部负责人,则可以在“管理范围”中将研发部的用户设置为其管理范围,则研发部负责人可以管理研发人员的备份文档)。
    5. 设置完成后,点击“保存 ”按钮,即成功新建一个角色,并将角色权限赋予给“已分配对象”,也就是将角色权限分配给用户。
    6. 打开“设置→用户权限管理”,可以查看到用户的权限,包括:管理范围、查看备份文档、下载备份文档和删除备份文档的权限,也可以在所属角色下方,点击 按钮,给用户分配对应的角色。

    预期结果

    成功赋予角色权限给用户,用户权限与角色权限一致。

    测试结果

    满足:               部分满足:            不满足:

    备注

    关于“不设置”的权限说明:如果是单一角色策略,权限为“不设置”时,等同于禁止权限;如果存在组合策略时,最终权限以其他角色策略为准。

    关于“优先级”的说明:禁止允许不设置(不允许)。

     

     

    4.16.6浏览/查找备份文档

    测试编号

    浏览/查找备份文档

    适用场景

    浏览权限范围的备份文档,检索备份文档。

    用例描述

    浏览自己的备份文档,浏览部门的备份文档,快速检索备份文档。

    测试步骤

    1. 打开文档云备份登录页面,输入终端登录的账号和密码(仅支持来源于:AD域或LDAP用户系统的用户),点击“登录 ”。
    2. 左边组织架构可以看到该用户管理范围内的对象,一级一级展开目录,可以看到备份在这个用户下的所有文档。
    3. 可显示文档的名称、类型、大小、修改时间、历史副本,也可以显示该文档来源于那台计算机、文件的路径等等。
    4. 点击文件名称,可查看详细信息,用户可选择下载或删除历史副本。
    5. 返回文档云备份主页,点击“文件查找”,可通过文件名称搜索备份文件,也可以通过“高级查询”搜索备份文件,可按照用户、计算机、修改时间、文件大小等条件来搜索。

    预期结果

    可成功浏览管理范围内的备份文件,可通过查询条件快速搜索备份文件。

    测试结果

    满足:               部分满足:            不满足:

    备注

     

     

     

     

    4.16.7文档备份审计日志

    测试编号

    文档备份审计日志

    适用场景

    审计文档备份的各种日志。

    用例描述

    1. 查询文档备份日志。
    2. 查询系统自动清理文档的日志。
    3. 审计管理员的操作日志。

    测试步骤

    1. 登录IP-guard控制台,打开“日志→文档云备份操作”,可以查看文档的备份日志,可记录操作类型、时间、计算机、用户、关联用户、文件、备份服务器、备份大小等信息,可通过右边查询框,输入查询条件,查询备份日志。
    2. 登录文档云备份控制台,在导航栏打开“系统日志”,可显示文档云备份自动清理磁盘空间的日志,日志包括:操作类型、时间、描述(清理文件个数、释放空间大小),也可以通过查询条件检索相应的日志。
    3. 使用审计管理员(audit)登录文档云备份控制台,打开“审计日志”,可审计所有管理员/用户的操作日志,可记录登录系统、退出系统、下载、删除和修改设置的行为,同时可记录该操作行为发生的时间、登录的计算机、登录的用户及其他详细信息,可通过左边查询条件(起止时间、操作类型和文件名称)检索审计日志。

    预期结果

    1. 可通过IP-guard控制台查询到文档备份的操作日志,可通过查询条件检索到对应的备份日志。
    2. 文档云备份服务器有清理磁盘空间的情况下,可以通过“系统日志”查询到清理文档的日志。
    3. 可通过审计管理员查询到所有管理员/用户的操作行为,查询功能正常。

    测试结果

    满足:               部分满足:            不满足:

    备注

     

     

    展开全文
  • 2、安装云备份服务器程序,安装时候要选端口,默认80,可以修改成8080或8081都可以。 3、打开IPGUARD控制台,授权服务器:工具-服务器管理-文档备份服务器设置-授权。打开高级策列里选文档云备份配置策略。 4、...

    1、首先安装IPGUARD服务器注册完成。

    2、安装云备份服务器程序,安装时候要选端口,默认80,可以修改成8080或8081都可以。

    3、打开IPGUARD控制台,授权服务器:工具-服务器管理-文档备份服务器设置-授权。打开高级策列里选文档云备份配置策略。

    4、http:\\云备份服务器地址:8080,第一次进去输入:IP-GUARD服务器IP地址和管理员用户名admin和密码。

    5、重新启动右下角云备份图标右键服务重新启动。

    6、http:\\云备份服务器地址:8080 默认用户名:admin 密码空进入:进入在设置里配置参数。

     

    7、配置角色和用户权限

    8、根据自己权限进入看到的文档也不一样。管理员进去可以看到全部文档,主管可以看部门文档,普通员工看自己的文档。

    9、恢复文档,选要恢复的文档或文件夹,选恢复的时间点,点右键恢复下载。

    10、没有域架构的情况下有两种方式,一种是部署LDAP服务器,一种是客户端配置关联,客户端关联方法:

    策略-客户端配置 添加-自定义 关键字:enable_relt_common_user  内容:1
    如果是都用administrator登录的话可以用这个配置,进行用户关联

     

     

    实例如下:

    4.16.1了解文档云备份的基本设置

    测试编号

    了解文档云备份的基本设置

    适用场景

    熟悉文档云备份的基本设置及操作界面,为后续功能测试打下基础。

    用例描述

    1. 部署完IP-guard服务器、IP-guard客户端、文档云备份服务器后,对文档云备份服务器进行授权,并设置对哪些计算机进行文档备份。
    2. 登录文档云备份控制台,熟悉控制台的各项功能和设置。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→文档备份服务器管理”,选择文档云备份服务器,点击“授权”按钮,可见文档云备份的托盘图标有“未授权 ”变为“已授权 ”状态。
    2. 选择文档云备份服务器,点击“设置范围”,可选择对那些计算机进行文档备份。
    3. 打开浏览器,输入网址http://+文档云备份服务器IP/域名:端口号(默认是80端口),比如:http://192.168.1.137,输入用户名和密码(默认用户名是admin,密码为空)。
    4. 首页显示授权状态、备份概述和磁盘空间情况。
    5. 备份浏览显示用户/计算机的备份文件,需要完成组织架构同步并设置相应的备份策略,才能在备份预览中看到组织架构信息和备份的文件。
    6. 文件查找功能,可通过文件名称、用户、计算机、修改时间、文件大小等条件查找备份文件。
    7. 设置选项,可以完成角色管理、用户权限管理、管理员黑白名单管理和参数设置。
    8. 系统日志,主要记录系统自动清理文件的行为,可记录操作类型、时间和详细描述。

    预期结果

    1. 完成文档云备份服务器的授权,并成功设置那些计算机参与文档备份。
    2. 熟悉文档云备份的控制台及相关的功能设置。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

     

    4.16.2导入AD域的组织架构

    测试编号

    导入AD域的组织架构

    适用场景

    计算机与AD域的用户关联,完成终端的文档备份任务。

    用例描述

    同步AD域组织架构到IP-guard服务器。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→组织架构同步”,在“同步配置”中新增配置。
    2. 服务器类型选择“域服务器”,填写正确的域名、服务器地址、登录账号和密码,点击“测试连接”,显示“成功”,说明IP-guard服务器与AD域连接正常,用户可自主选择是否启用“自动同步”功能。
    3. 在对象设置中,选择“增加 ”,点击“来源选择”,设置同步对象的来源,目标设置选择“用户组”,将用户架构导入到用户页面,点击“确定”按钮,回到同步配置页面,点击“确定”按钮,完成同步配置,点击右上角“立即执行 ”按钮,同步组织架构。
    4. 选择“用户系统管理→服务器配置”,点击“新建 ”服务器类型选择“域服务器”,输入正确的AD域控的域名和服务器地址,点击“高级 ”,点击“测试连接 ”,显示连接成功,即完成服务器配置。
    5. 选择“登录验证”,点击“编辑 ”,可选择“强制验证”或“非强制验证”,在选择“包含范围”即可。
    6. 如果选择“强制验证”,则计算机开机后,会弹出用户关联认证窗口,必须输入AD域账号密码完成验证,才能使用计算机,如果选择“非强制验证”,则计算机开机后,会弹出用户关联认证窗口,用户可以选择输入AD域账号密码完成验证,也可以关闭用户关联认证窗口,不进行用户关联认证。

    预期结果

    AD域的组织架构同步到IP-guard服务器中,在IP-guard控制台主页的“用户”栏,可以查看同步过来的组织架构信息。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

    4.16.3导入LDAP用户系统的组织架构

    测试编号

    导入LDAP用户系统的组织架构

    适用场景

    计算机与LDAP用户系统的用户关联,完成终端的文档备份任务。

    用例描述

    1. 将LDAP用户系统的组织架构同步到IP-guard服务器。
    2. 强制用户使用LDAP账户密码登录计算机。

    测试步骤

    1. 登录IP-guard控制台,打开“工具→服务器管理→组织架构同步”,在“同步配置”中新增配置。
    2. 服务器类型选择“LDAP服务器”,填写正确的域名、服务器地址,点击“高级 ”,勾选“匿名连接 ”,点击“测试连接 ”,显示连接成功,说明IP-guard服务器与LDAP服务器连接正常,用户可自主选择是否启用“自动同步”功能。
    3. 在对象设置中,选择“增加 ”,点击“来源选择”,设置同步对象的来源,目标设置选择“用户组”,将用户架构导入到用户页面,点击“确定”按钮,回到同步配置页面,点击“确定”按钮,完成同步配置,点击右上角“立即执行 ”按钮,同步组织架构。
    4. 组织架构同步成功后,可在IP-guard控制台主页的左边“用户栏 ”看到从LDAP用户系统导入的用户架构。
    5. 选择“用户系统管理→服务器配置”,点击“新建 ”服务器类型选择“LDAP服务器”,输入正确的的域名和服务器地址,点击“高级 ”,点击“测试连接 ”,显示连接成功,即完成服务器配置。
    6. 选择“登录验证”,点击“编辑 ”,可选择“强制验证”或“非强制验证”,在“包含范围”选择对应的计算机即可。
    7. 如果选择“强制验证”,则计算机开机后,会弹出用户关联认证窗口,必须输入LDAP账号密码完成验证,才能使用计算机,如果选择“非强制验证”,则计算机开机后,会弹出用户关联认证窗口,用户可以选择输入LDAP账号密码完成验证,也可以关闭用户关联认证窗口,不进行用户关联认证。

    预期结果

    LDAP用户系统的组织架构同步到IP-guard服务器中,在IP-guard控制台主页的“用户”栏,可以查看同步过来的组织架构信息。

    测试结果

    满足:             部分满足:               不满足:

    备注

     

    4.16.4启动文档云备份功能

    测试编号

    启动文档云备份功能

    适用场景

    启动终端文档备份任务。

    用例描述

    启动终端文档备份任务,自动备份终端制定类型的文件。

    测试步骤

    1. 登录IP-guard控制台,在计算机树中选择整个网络、分组或某台计算机,再选择“高级→文档云备份”。
    2. 点击“修改文档备份设置 ”,勾选“启动文档备份任务”,可设置包含文件和排除文件的范围,设置备份范围、备份间隔、备份流量、备份时段、定期扫描等功能。
    3. 登录文档云备份控制台,选择“设置→参数设置”依次填写“IP-guard服务器地址、域服务器地址、域名、组织架构同步设置、备份存储设置、历史副本数量、磁盘空间清理、端口映射等设置”。
    4. 计算机开机后,系统会自动弹出用户关联认证窗口,输入AD域或LDAP用户系统的用户名和密码,完成身份认证。
    5. 在终端计算机上对文件进行如下操作时,文档将自动进行备份,包括:新建、重命名、另存为、修改、复制、拖拽、移动等操作。

    预期结果

    1. 完成文档备份的各项设置。
    2. 用户可以使用AD域或LDAP用户系统的账号密码完成登录验证。

    测试结果

    满足:             部分满足:             不满足:

    备注

    如果测试环境没有AD域或LDAP用户系统,计算机没有关联域用户/LDAP用户,可配置客户端策略enable_relt_common_user = 1,强制关联本地用户进行文档备份。

     

     

     

    4.16.5文档备份权限管理

    测试编号

    文档备份的用户权限管理

    适用场景

    限制用户对备份文档的各种权限。

    用例描述

    设置用户对备份文档的查看、下载和删除权限,设置用户管理备份文档的范围。

    测试步骤

    1. 登录文档云备份控制台,选择“设置→角色管理”。
    2. 点击右上角“添加角色 ”,填写“角色名称”,设置“用户权限”,包括查看文档权限、下载文档权限、删除文档权限。
    3. 在“已分配对象”中,可选择该角色权限应用于那些用户。
    4. “管理范围”默认为空,指应用到此角色的用户只管理自己的备份文档,不管理其他用户的备份文档,(假设:新建的角色为研发部负责人,则可以在“管理范围”中将研发部的用户设置为其管理范围,则研发部负责人可以管理研发人员的备份文档)。
    5. 设置完成后,点击“保存 ”按钮,即成功新建一个角色,并将角色权限赋予给“已分配对象”,也就是将角色权限分配给用户。
    6. 打开“设置→用户权限管理”,可以查看到用户的权限,包括:管理范围、查看备份文档、下载备份文档和删除备份文档的权限,也可以在所属角色下方,点击 按钮,给用户分配对应的角色。

    预期结果

    成功赋予角色权限给用户,用户权限与角色权限一致。

    测试结果

    满足:               部分满足:            不满足:

    备注

    关于“不设置”的权限说明:如果是单一角色策略,权限为“不设置”时,等同于禁止权限;如果存在组合策略时,最终权限以其他角色策略为准。

    关于“优先级”的说明:禁止→允许→不设置(不允许)。

     

     

    4.16.6浏览/查找备份文档

    测试编号

    浏览/查找备份文档

    适用场景

    浏览权限范围的备份文档,检索备份文档。

    用例描述

    浏览自己的备份文档,浏览部门的备份文档,快速检索备份文档。

    测试步骤

    1. 打开文档云备份登录页面,输入终端登录的账号和密码(仅支持来源于:AD域或LDAP用户系统的用户),点击“登录 ”。
    2. 左边组织架构可以看到该用户管理范围内的对象,一级一级展开目录,可以看到备份在这个用户下的所有文档。
    3. 可显示文档的名称、类型、大小、修改时间、历史副本,也可以显示该文档来源于那台计算机、文件的路径等等。
    4. 点击文件名称,可查看详细信息,用户可选择下载或删除历史副本。
    5. 返回文档云备份主页,点击“文件查找”,可通过文件名称搜索备份文件,也可以通过“高级查询”搜索备份文件,可按照用户、计算机、修改时间、文件大小等条件来搜索。

    预期结果

    可成功浏览管理范围内的备份文件,可通过查询条件快速搜索备份文件。

    测试结果

    满足:               部分满足:            不满足:

    备注

     

     

     

     

    4.16.7文档备份审计日志

    测试编号

    文档备份审计日志

    适用场景

    审计文档备份的各种日志。

    用例描述

    1. 查询文档备份日志。
    2. 查询系统自动清理文档的日志。
    3. 审计管理员的操作日志。

    测试步骤

    1. 登录IP-guard控制台,打开“日志→文档云备份操作”,可以查看文档的备份日志,可记录操作类型、时间、计算机、用户、关联用户、文件、备份服务器、备份大小等信息,可通过右边查询框,输入查询条件,查询备份日志。
    2. 登录文档云备份控制台,在导航栏打开“系统日志”,可显示文档云备份自动清理磁盘空间的日志,日志包括:操作类型、时间、描述(清理文件个数、释放空间大小),也可以通过查询条件检索相应的日志。
    3. 使用审计管理员(audit)登录文档云备份控制台,打开“审计日志”,可审计所有管理员/用户的操作日志,可记录登录系统、退出系统、下载、删除和修改设置的行为,同时可记录该操作行为发生的时间、登录的计算机、登录的用户及其他详细信息,可通过左边查询条件(起止时间、操作类型和文件名称)检索审计日志。

    预期结果

    1. 可通过IP-guard控制台查询到文档备份的操作日志,可通过查询条件检索到对应的备份日志。
    2. 文档云备份服务器有清理磁盘空间的情况下,可以通过“系统日志”查询到清理文档的日志。
    3. 可通过审计管理员查询到所有管理员/用户的操作行为,查询功能正常。

    测试结果

    满足:               部分满足:            不满足:

    备注

     

    展开全文
  • 硬盘被意外损毁或格式化,电脑丢失,离职员工恶意删除计算机...针对文档容易被损毁、丢失等难题,IP-guard最新推出的文档云备份解决方案可以有效地帮助企业用更简单的方式解决此类问题,通过对文档进行自动定时备份...

    硬盘被意外损毁或格式化,电脑丢失,离职员工恶意删除计算机上文件等现象变得越来越常见,这些文档的损毁和丢失必将严重影响企业业务的正常开展;除此之外,因为病毒感染导致文档被损毁甚至被勒索病毒加密也屡次发生,这些无疑都是企业日常所面临严峻的文档保护考验。

    针对文档容易被损毁、丢失等难题,IP-guard最新推出的文档云备份解决方案可以有效地帮助企业用更简单的方式解决此类问题,通过对文档进行自动定时备份,集中管控保护,帮助企业更好保护文档的安全与完整性。

    1、自动备份,统一管理

    管理员可以对终端计算机上的数据进行备份,统一上传到IP-guard文档服务器进行集中存储和管理。支持定期备份、触发式备份以及全盘扫描备份,满足企业的不用需求;备份版本可以根据需要保留一个文档或多个备份版本,有利于追溯历史备份文件。

    2、恢复损毁、丢失文档

    文档服务器和终端的备份目录相同,终端文件一旦遭到破坏或者遗失,可从文档服务器快速恢复,使数据得到还原,并且目录和原来保持一致。工作中如果误删除文件,或硬盘损坏,导致文件无法找回,可从文档备份服务器将文件恢复到终端。

    3、快速检索备份文档

    文档备份管理平台聚集所有用户的文件,管理员可以从文档服务器上快速检索到所需文件,实现快速查找和分享。例如管理员需要知道某个文档在哪些计算机有存储,可以在文档云备份系统中针对全公司中输入该文件名称查找。

    4、分级管理,防止泄密

    可以对不同用户划分不同的文档管理权限以及划分相应的管理范围,防止无关人员查看重要文档。例如所有员工都可以查看并下载自己的文档,但不能查看或删除部门经理的文档,也不能查看下载其部门员工的文档

    5、日志记录,掌控备份全过程

    IP-guard可以对文档云备份的所有操作进行日志记录,包括开始上传文件/上传文件成功/上传文件失败/开始扫描/扫描结束等,管理员可以在日志中查看详细的操作过程。

    IP-guard文档云备份解决方案可以更好地解决企业文档管理难、容易损坏和丢失的难题,帮助企业进一步完善自身的信息保护体系。更多资料请访问:www.newcase.com.cn

    展开全文
  • 云备份

    2020-08-03 16:56:59
    这个项目包含windows下的客户端、linux下的服务器端以及浏览器可以访问到备份的文件列表并可以进行下载。

    这个项目包含windows下的客户端、linux下的服务器端
    此外浏览器可以访问到服务器端备份的文件列表并可以进行下载。

    项目简介:
    windows下的客户端对指定的一个文件夹进行监控,将修改/新建的文件自动上传备份到服务器上,然后可以通过浏览器查看/下载这个文件信息。linux下的服务端,会对备份的文件进行热点判断,非热点文件进行压缩存储,提高磁盘利用率。

    linux下的服务器端

    主要分为3个功能
    1.通过网络通信实现文件上传备份
    2.服务器端提供浏览器查看和下载功能
    3.对非热点文件进行压缩存储 (非热点:很长时间没有人访问的文件)

    业务流程设计:
    1.搭建服务器,等待客户端连接上来,针对客户的请求进行处理
    具体的客户端的请求包含:
    1.文件的上传请求–对文件实现数据备份,然后在数据管理模块中进行记录
    2.文件的列表请求–组织客户端上传过的文件名称成为一个html网页响应给浏览器
    3.文件的下载请求–文件未被压缩,则直接响应文件数据;文件已经被压缩,解压文件,响应解压后的文件数据
    2.非热点文件压缩解压缩

    细分代码模块:
    1文件压缩解压缩模块:检测非热点文件实现压缩功能
    文件压缩解压缩工具类:
    1文件的压缩功能(将源文件进行压缩存储,保留压缩文件,删除源文件),最后更新数据管理模块
    2文件的解压缩功能(先将文件解压缩,得到源文件,删除压缩文件)

     class CompressUtil
     69     {
     70         public:
     71             //文件压缩  原文件名称,压缩包名称
     72             static bool Compress(const std::string& src,const std::string &dst){
     73                 std::string body;
     74                 FileUtil::Read(src,&body);
     75 
     76                 gzFile gf=gzopen(dst.c_str(),"wb");//打开压缩包
     77                 if(gf==NULL){
     78                     std::cout<<"open file "<<dst<<" failed!\n";
     79                     return false;
     80                 }
     81                 //将原文件压缩写入打开的dst中
     82                 int wlen=0;
     83                 while(wlen<body.size()){//防止body中的数据没有压缩完
     84                     int ret=gzwrite(gf,&body[wlen],body.size()-wlen);
     85                         if(ret==0){
     86                             std::cout<<"file "<<dst<<" write compress data failed!\    n";
     87                             return false;
     88                         }
     89                     wlen+=ret;
     90                }
     91                 gzclose(gf);
     92                 return true;
     93             }
     94             //文件解压缩 压缩包名称,原文件名称
     95             static bool UnCompress(const std::string& src,const std::string& dst){
     96                 std::ofstream ofs(dst,std::ios::binary);
     97                 if(ofs.is_open()==false){
     98                     std::cout<<"open file "<<dst<<"failed!\n";
     99                     return false;
    100                 }
    101                 gzFile gf=gzopen(src.c_str(),"rb");
    102                 if(gf==NULL){
    103                     std::cout<<"open file "<<src<<"failed!\n";
    104                     ofs.close();
    105                     return false;
    106                 }
    107                 int ret;
    108                 char tmp[4096]={0};
    109                 //gzread(句柄,缓冲区,缓冲区大小)
    110                 //返回实际读取到的解压后的数据大小
    111                 while((ret=gzread(gf,tmp,4096))>0){
    112                     //写入ret大小的数据到原文件中
    113                     ofs.write(tmp,ret);
    114                 }
    115                 ofs.close();
    116                 gzclose(gf);
    117                 return true;
    118             }
    119     };                                               
    

    非热点文件压缩类(流程的实现):
    文件是否是热点文件的判断—文件属性中有一个属性(最后一次访问时间);若当前时间减去文件最后一次访问时间>基准值(自己设定的30s),则是非热点文件。

    267 //非热点文件压缩
    268     class NonHotCompress
    269     {
    270         public:
    271             NonHotCompress(const std::string gz_dir,const std::string bu_dir)
    272                 :_gz_dir(gz_dir)
    273                 ,_bu_dir(bu_dir)
    274             {}
    275             //总体向外提供的功能接口,开始压缩模块
    276             bool Start(){
    277                 //是一个循环的,持续的过程-每隔一段时间,判断有没有非热点文件,进行
        压缩
    278                 while(1){
    279                     //1.获取一下所有的未压缩的文件列表
    280                     std::vector<std::string> list;
    281                     data_manage.NonCompressList(&list);
    282                     //2.逐个判断这个文件是否是热点文件
    283                     for(int i=0;i<list.size();++i){
    284                         bool ret=FileIsHot(list[i]);//判断是否是热点文件
    285                         if(ret==false){
    286                             std::cout<<"non hot file "<<list[i]<<"\n";
    287                             //非热点文件则组织原文件的路径名称以及压缩包的路径名称
    288                             //进行压缩存储
    289                             std::string s_filename=list[i];//纯原文件名称
    290                             std::string d_filename=list[i]+".gz";//纯压缩包名称
    291                             std::string src_name=_bu_dir+s_filename;//原文件名称路>    径名称
    292                             std::string dst_name=_gz_dir+d_filename;//压缩文件路径>    名称
    293                             //3.如果是非热点文件,则压缩这个文件,删除原文件
    294                             if(CompressUtil::Compress(src_name,dst_name)==true){
    295                                 data_manage.Insert(s_filename,d_filename);//更新数>    据信息
    296                                 unlink(src_name.c_str());//删除原文件
    297                             }
    298                         }
    299                     }
    300                     //4.休眠一会
    301                     sleep(INTERVAL_TIME);
    302                 }
    303                 return true;
    304             }
    305         private:
    306             //判断一个文件是否是热点文件
    307             bool FileIsHot(const std::string& name ){
    308                 //问题:什么文件是非热点文件--当前时间减去最后一次访问时间>n秒
    309                 time_t cur_t=time(NULL);//获取当前时间
    310                 struct stat st;
    311                 if(stat(name.c_str(),&st)<0){
    312                     std::cout<<"get file"<<name<<"stat failed!\n";
    313                     return false;
    314                 }
    315                 if((cur_t-st.st_atime)>NONHOT_TIME){
    316                     return false;//非热点返回false
    317                 }
    318                 return true;//NONHOT_TIME以内都是热点文件
    319             }
    320         private:
    321             std::string _bu_dir;//压缩前文件的存储路径
    322             std::string _gz_dir;//压缩后文件的存储路径
    323     };
    
    

    2备份的文件数据管理模块:记录上传了哪些文件,有没有被压缩,记录源文件名称和压缩文件名称在_file_list中,持久化存储文件压缩信息在list.backup(文件)中(源文件名称,压缩文件名称),读写锁保护_file_list这个unoreded_map的安全。

    120 //数据管理
    121     class DataManager
    122     {
    123         public:
    124             DataManager(const std::string& path)
    125                 :_back_file(path)
    126             {
    127             //读写锁的初始化
    128                 pthread_rwlock_init(&_rwlock,NULL);
    129             }
    130             ~DataManager(){
    131             //读写锁的销毁
    132                 pthread_rwlock_destroy(&_rwlock);
    133             }
    134             //判断文件是否存在
    135             bool Exists(const std::string& name){
    136                 //是否能够从_file_list找到这个文件信息
    137                 //在访问临界资源的时候加读锁
    138                 pthread_rwlock_rdlock(&_rwlock);
    139                 auto it=_file_list.find(name);
    140                 //没找到
    141                 if(it==_file_list.end()){
    142                     pthread_rwlock_unlock(&_rwlock);
    143                     return false;
    144                 }
    145                 pthread_rwlock_unlock(&_rwlock);
    146                 return true;
    147             }
    148 
    149             //判断文件是否已经压缩
    150             bool IsCompress(const std::string& name){
    151                 //管理的数据:原文件名称,压缩包名称
    152                 //文件上传之后,原文件名称和压缩包名称一致
    153                 //文件压缩后,将压缩包名称更新为具体的包名
    154                 pthread_rwlock_rdlock(&_rwlock);
    155                 auto it=_file_list.find(name);
    156                 if(it==_file_list.end()){
    157                     pthread_rwlock_unlock(&_rwlock);
    158                     return false;//文件不存在
    159                 }
    160                 if(it->first==it->second){
    161                     pthread_rwlock_unlock(&_rwlock);
    162                     return false;//两个名称一致,文件未被压缩
    163                 }
    164                 pthread_rwlock_unlock(&_rwlock);
    165                 return true;
    166             }
    167             //获取未压缩文件列表
    168             bool NonCompressList(std::vector<std::string>* list){
    169                 //遍历_file_list;将没有压缩的放到list中
    170                 pthread_rwlock_rdlock(&_rwlock);
    171                 for(auto it=_file_list.begin();it!=_file_list.end();++it){
    172                     if(it->first==it->second){
    173                         list->push_back(it->first);
    174                     }
    175                 }
    176                 pthread_rwlock_unlock(&_rwlock);
    177                 return true;
    178             }
    179             //插入或更新数据
    180             bool Insert(const std::string &src,const std::string& dst){
    181                 //更新修改需要加写锁
    182                 pthread_rwlock_wrlock(&_rwlock);
    183                 _file_list[src]=dst;
    184                 pthread_rwlock_unlock(&_rwlock);
    185                 //更新修改之后重新存储文件名
    186                 Storage();
    187                 return true;
    188             }
    189             //获取所有文件名称,用于向外展示文件列表使用
    190             bool GetAllName(std::vector<std::string>* list){
    191                 pthread_rwlock_rdlock(&_rwlock);
    192                 auto it=_file_list.begin();
    193                 for(;it!=_file_list.end();++it){
    194                     list->push_back(it->first);//获取原文件名称
    195                 }
    196                 pthread_rwlock_unlock(&_rwlock);
    197                 return true;
    198             }
    199 
    200             //根据源文件名称获取压缩包名称
    201             bool GetGzName(const std::string &src,std::string *dst){
    202                 auto it=_file_list.find(src);
    203                 //没找到源文件名称
    204                 if(it==_file_list.end()){
    205                     return false;
    206                 }
    207                 //找到了,返回压缩包名称
    208                 *dst=it->second;
    209                 return true;
    210             }
    211 
    212             //数据改变后持久化存储-管理的是文件名
    213             //向指定的路径中写入需要管理的原文件名称-压缩包名称
    214             bool Storage(){
    215                 //将_file_list中的数据进行持久化存储
    216                 //数据对象进行持久化存储---序列化
    217                 //src dst\r\n
    218                 std::stringstream tmp;//实例化一个stream流对象
    219                 pthread_rwlock_rdlock(&_rwlock);
    220                 auto it=_file_list.begin();
    221                 for(;it!=_file_list.end();++it){
    222                     tmp<<it->first<<" "<<it->second<<"\r\n";
    223                 }
    224                 //将tmp中内容写入_back_file中
    225                 pthread_rwlock_unlock(&_rwlock);
    226                 //清空写入的
    227                 FileUtil::Write(_back_file,tmp.str());//tmp.str()是将stream流对象转
        化晨string对象再写入
    228                 return true;
    229             }
    230             //启动时初始化加载原有数据
    231             //持久化存储文件名格式:filename gzfilename\r\nfilename gzfilename\r\n
    232             bool InitLoad(){
    233                 //从数据的持久化存储文件中加载数据
    234                 //1.将这个备份文件中的数据读取出来
    235                 std::string body;
    236                 if(FileUtil::Read(_back_file,&body)==false){
    237                     return false;
    238                 }
    239                 //2.进行字符串处理,按照\r\n进行分割
    240                 //boost::split(vector,src,sep,flag)
    241                 std::vector<std::string> list;
    242                 //将body中的内容按\r\n进行分割,不保留\r\n,分割后存放到list中
    243                 boost::split(list,body,boost::is_any_of("\r\n"),boost::token_compre    ss_off);
    244 
    245                 //3.每一行按照空格进行分割-前边是key,后边是val
    246                 for(auto i:list){
    247                     size_t pos=i.find(" ");
    248                     if(pos==std::string::npos){
    249                         continue;
    250                     }
    251                     std::string key=i.substr(0,pos);
    252                     std::string val=i.substr(pos+1);
    253                     //4.将key/val添加到_file_list中
    254                     Insert(key,val);
    255                 }
    256                 return true;
    257             }
    258         private:
    259             std::string _back_file;//持久化数据存储
    260             std::unordered_map<std::string,std::string> _file_list;//数据管理容器
    261             pthread_rwlock_t _rwlock;//读写锁
    262 
    263     };
    

    **3网络通信模块:**实现文件的上传/浏览备份功能
    客户端请求服务器的三种方式(上传文件、列表请求、文件下载)
    三种请求方式

    324 //服务器
    325     class Server
    326     {
    327         public:
    328             Server(){
    329             }
    330             ~Server(){
    331             }
    332             //启动网络通信模块接口
    333             bool Start(){
    334                 _server.Put("/(.*)",Upload);
    335                 _server.Get("/list",List);
    336                 //.*表示匹配任意字符串,()表示捕捉这个字符串,是正则表达式
    337                 _server.Get("/download/(.*)",Download);//为了避免有文件名叫list与li    st请求混淆
    338 
    339                 _server.listen("0.0.0.0",9000);//搭建tcp服务器,进行http数据接收处>    理 
    340                 return true;
    341             }
    342         private:
    343             //文件上传处理回调函数
    344             static void Upload(const httplib::Request &req,httplib::Response &rsp){
    345                 //req.method-解析出的请求方法
    346                 //req.path-解析出的请求资源路径
    347                 //req.headers--这是一个头部信息键值对
    348                 //req.body-存放请求数据的正文 
    349                 // /(.*)  例如/test.txt
    350                 // matches[0]=/test.txt
    351                 // matches[1]=test.txt
    352                 std::string filename=req.matches[1];//纯文件名称
    353                 std::string pathname=BACKUP_DIR+filename;//文件存放的路径名
    354                 FileUtil::Write(pathname,req.body);//存储文件
    355                 data_manage.Insert(filename,filename);//文件名放到数据管理模块中
    356                 rsp.status=200;
    357                 return;
    358             }
    359             //文件列表请求回调函数
    360             static void List(const httplib::Request &req,httplib::Response &rsp){
    361                 //通过data_manage数据管理对象获取文件名称列表
    362                 std::vector<std::string> list;
    363                 data_manage.GetAllName(&list);
    364                 //组织相应html网页数据
    365                 std::stringstream tmp;
    366                 tmp<<"<html><body><hr />";//标头
    367                 for(int i=0;i<list.size();i++){
    368                     tmp<<"<a href='/download/"<<list[i]<<"'>"<<list[i]<<"</a>";
    369                     //tmp<< "<a href='download/a.txt'> a.txt </a>" 
    370                     //这是一个超链接,用户点击之后,服务器发送href=后面的连接请求(/do    wnload/a.txt)
    371                     //而中间的a.txt是用来展示的
    372                     tmp<<"<hr />";//这是一个分割线标签
    373                 }
    374                 tmp<<"<hr /></body></html>";
    375 
    376                 //填充rsp的正文与状态码还有头部信息
    377                 //set_content(正文数据,正文数据长度,正文类型-Content-Type):
    378                 rsp.set_content(tmp.str().c_str(),tmp.str().size(),"text/html");
    379                 rsp.status=200;
    380                 return ;
    381             }
    382             //文件下载处理回调函数
    383             static void Download(const httplib::Request &req,httplib::Response &rsp    ){
    384                 //1.从数据模块中判断文件是否存在
    385                 std::string filename=req.matches[1];//前面路由注册时捕捉的.*---就是
        文件名
    386                 if(data_manage.Exists(filename)==false){
    387                     rsp.status=404;
    388                     return ;
    389                 }
    390                 //2.判断文件是否已经压缩,压缩了则要先解压缩,然后再读取文件数据
    391                 std::string pathname=BACKUP_DIR+filename;//源文件路径名
    392                 if(data_manage.IsCompress(filename)!=false){
    393                     //文件被压缩,先将文件解压出来
    394                     std::string gzfile;//获取文件压缩包的名称
    395                     data_manage.GetGzName(filename,&gzfile);
    396                     std::string gzpathname=GZFILE_DIR+gzfile;//组织一个压缩包的路径397                     CompressUtil::UnCompress(gzpathname,pathname);//将压缩包解压
    398                     unlink(gzpathname.c_str());//删除压缩包
    399                     data_manage.Insert(filename,filename);//更新数据信息
    400                 }
    401                 //从文件中读取数据,响应给客户端
    402                 FileUtil::Read(pathname,&rsp.body);//直接将文件数据读取到rsp的body>    中
    403                 rsp.set_header("Content-Type","application/octet-stream");//二进制>    流文件下载
    404                 rsp.status=200;
    405                 return ;
    406             }
    407 
    408         private:
    409             std::string _file_dir;//文件上传备份路径
    410             httplib::Server _server;
    411     };
    
    

    其他接口(读文件内容和和向文件写数据)工具类和头文件以及宏的展示:

     1 #include <cstdio>
      2 #include <string>
      3 #include <vector>
      4 #include <fstream>
      5 #include <unordered_map>
      6 #include <zlib.h>
      7 #include <pthread.h>
      8 #include <boost/filesystem.hpp>
      9 #include <boost/algorithm/string.hpp>
     10 #include "httplib.h"
     11 
     12 //10秒没访问就是非热点文件
     13 #define NONHOT_TIME 10
     14 #define INTERVAL_TIME 30//非热点的检测每30秒一次
     15 #define BACKUP_DIR "./backup/" //文件的备份路径
     16 #define GZFILE_DIR "./gzfile/" //压缩包存放路径
     17 #define DATA_FILE "./list.backup"//数据管理模块的数据备份文件名称
     
    21     class FileUtil{
     22         public:
     23             //从文件中读取所有内容
     24             static bool Read(const std::string& name,std::string* body){
     25                 //一定要注意以二进制方式打开文件
     26                 std::ifstream fs(name,std::ios::binary);//输入文件流打开
     27                 if (fs.is_open()==false){
     28                     std::cout<<"open file"<<name<<"failed\n";
     29                     return false;
     30                 }
     31                 //boost::filesystem::file_size(name)获取文件大小
     32                 int64_t fsize=boost::filesystem::file_size(name);
     33                 //给body申请空间
     34                 body->resize(fsize);
     35                 //读取fsize长度的内容到body中,(char*,int)
     36                 fs.read(&(*body)[0],fsize);//body是指针,需要先解引用
     37                 //判断上一次操作是否成功
     38                 if (fs.good()==false){
     39                     std::cout<<"file "<<name<<" read data failed!\n";
     40                     return false;
     41                 }
     42                 //关闭文件
     43                 fs.close();
     44                 return true;
     45             }
    46             //向文件中写入数据
     47             static bool Write(const std::string& name,const std::string &body){
     48                 //输出流--ofstream默认打开文件的时候会清空原有内容
     49                 //当前策略是覆盖写入
     50                 std::ofstream ofs(name,std::ios::binary);//输出流
     51                 if (ofs.is_open()==false){
     52                     std::cout<<"open file"<<name<<"failed\n";
     53                     return false;
     54                 }
     55                 //向文件中写入数据
     56                 ofs.write(&body[0],body.size());
     57                 if (ofs.good()==false){
     58                     std::cout<<"file "<<name<<" write data failed!\n";
     59                     return false;
     60                 }
     61                 //关闭文件
     62                 ofs.close();
     63                 return true;
     64             }
     65     };
     66 
    
    

    主程序流程main()的实现:

     38 //非热点文件压缩
     39 void m_non_compress(){
     40     _cloud_sys::NonHotCompress ncom(GZFILE_DIR,BACKUP_DIR);
     41     ncom.Start();
     42     return;
     43 }
     44 //网络通信线程
     45 void thr_http_server(){
     46     _cloud_sys::Server srv;
     47     srv.Start();
     48     return ;
     49 }
     50 int main(int argc,char *argv[])
     51 {
     52     //文件备份路径不存在则创建
     53     if(boost::filesystem::exists(GZFILE_DIR)==false){
     54         boost::filesystem::create_directory(GZFILE_DIR);//目录不存在则创建
     55     }
     56     //压缩包存放路径不存在则创建
    57     if(boost::filesystem::exists(BACKUP_DIR)==false){
     58         boost::filesystem::create_directory(BACKUP_DIR);//目录不存在则创建
     59     }
     60     std::thread thr_compress(m_non_compress);//c++11中的线程--启动非热点文件压缩模>    块
     61     std::thread thr_server(thr_http_server);//网络通信服务端模块启动
     62     thr_compress.join();//等待线程退出
     63     thr_server.join();
     64 
     65     return 0;
     66 }
    
    

    windows下的客户端

    主要2个功能
    1.检测文件是否需要备份
    2.网络通信上传备份功能

    业务流程设计:
    1.读取数据管理模块的文件备份信息记录(这个是已经上传过的文件etag)----(etag包含每个文件的具体最后一次修改时间和大小)
    2.文件检测模块,对指定目录下的所有文件逐个获取etag是否匹配,不匹配则需要备份
    3.获取到需要备份的文件列表逐个进行文件备份–向服务器发送文件上传请求
    4.文件上传备份后,更新数据管理模块中的文件备份信息(防止每次都需要备份)

    细分代码模块:
    1需备份文件检测模块:检测哪些文件需要备份
    2网络通信模块:实现文件上传备份
    下面的start()包含了客户端的整个流程;
    在Cloudclient类中包含了1需备份文件检测模块以及2网络通信实现需备份文件上传模块

    class CloudClient
    {
    public:
    	CloudClient(const std::string &filename, const std::string &store_file,
    		const std::string &srv_ip, uint16_t srv_port)
    		:_listen_dir(filename), data_manage(store_file), _srv_ip(srv_ip), _srv_port(srv_port) {}
    
    	bool Start() {//完成整体的文件备份流程
    		data_manage.InitLoad();
    		while (1) {
    			std::vector<std::string> list;
    			GetBackupFileList(&list);//获取到所有的需要备份的文件名称
    			for (int i = 0; i < list.size(); ++i) {
    				std::string name = list[i];//纯文件名
    				std::string pathname = _listen_dir + name;//文件路径名
    
    				std::cout << pathname << " is need to backup\n";
    				//读取文件数据,请求正文
    				std::string body;
    				FileUtil::Read(pathname, &body);
    				//实例化Client对象准备发起HTTP上传文件请求
    				httplib::Client client(_srv_ip, _srv_port);
    				std::string req_path = "/" + name;
    				auto rsp = client.Put(req_path.c_str(), body, "application/octet-stream");
    				if (rsp == NULL || (rsp != NULL && rsp->status != 200)) {
    					//这个文件上传失败了
    					std::cout << pathname << " backup failed\n";
    					continue;
    				}
    				std::string etag;
    				GetEtag(pathname, &etag);
    				data_manage.Insert(name, etag);//备份成功则插入,更新信息
    
    				std::cout << pathname << " backup success\n";
    			}
    			Sleep(1000);//休眠1秒钟,重新检测
    		}
    		return true;
    	}
    
    	//获取需要备份的文件列表
    	bool GetBackupFileList(std::vector<std::string> *list) {
    		if (boost::filesystem::exists(_listen_dir) == false) {
    			boost::filesystem::create_directory(_listen_dir);//若目录不存在则创建
    		}
    		//1.进行目录监控,获取指定目录下所有文件名称
    		boost::filesystem::directory_iterator begin(_listen_dir);//定义迭代器
    		boost::filesystem::directory_iterator end;
    		for (; begin != end; ++begin) {
    			if (boost::filesystem::is_directory(begin->status())) {
    				//目录是不需要进行备份的
    				//当前我们并不做多层级目录备份,遇到目录直接越过
    				continue;
    			}
    			std::string pathname = begin->path().string();
    			std::string name = begin->path().filename().string();
    			std::string cur_etag, old_etag;
    			//2.逐个文件计算自身当前etag,
    			GetEtag(pathname, &cur_etag);
    			//3.与data_manage中保存的原有etag进行比对
    			data_manage.GetEtag(name, &old_etag);
    			if (cur_etag != old_etag) {
    				list->push_back(name);//当前etag与原有etag不同则需要备份
    			}
    		}
    		//		1.没有找到原有etag--新文件需要备份
    		//		2.找到原有etag,但是当前etag和原有etag不相等,需要备份
    		//		3.找到原有etag,并且与当前etag相等,则不需要备份
    
    		return true;
    	}
    	//计算文件的etag信息
    	bool GetEtag(const std::string &pathname, std::string *etag) {
    		//etag:文件大小--文件最后一次修改时间--(md5最好用)
    		int64_t fsize = boost::filesystem::file_size(pathname);
    		time_t mtime = boost::filesystem::last_write_time(pathname);
    		*etag = std::to_string(fsize) + "-" + std::to_string(mtime);
    		return true;
    	}
    private:
    	std::string _srv_ip;
    	uint16_t _srv_port;
    	std::string _listen_dir;//监控的目录名称
    	DataManager data_manage;
    };
    

    3备份文件数据管理模块:记录已经备份的文件etag信息

    //数据管理模块,持久化存储是存储在list.back文件中(文件名和etag信息)
    class DataManager
    {
    public:
    	DataManager(const std::string &filename)
    		:_store_file(filename) {}
    	//插入/更新数据
    	bool Insert(const std::string &key, const std::string &val) {
    		_backup_list[key] = val;
    		Storage();
    		return true;
    	}
    	//通过文件名获取原有etag信息
    	bool GetEtag(const std::string &key, std::string *val) {
    		auto it = _backup_list.find(key);
    		if (it == _backup_list.end()) {
    			return false;
    		}
    		*val = it->second;
    		return true;
    	}
    	//持久化存储
    	bool Storage() {
    		//将_backup_list中的数据进行持久化存储
    		//数据对象进行持久化存储---序列化
    		//filename etag\r\n
    		std::stringstream tmp;//实例化一个stream流对象
    		auto it = _backup_list.begin();
    		for (; it != _backup_list.end(); ++it) {
    			tmp << it->first << " " << it->second << "\r\n";
    		}
    
    		//将tmp中内容写入_back_file中
    		//清空写入的
    		FileUtil::Write(_store_file, tmp.str());//tmp.str()是将stream流对象转化晨string对象再写入
    		return true;
    	}
    	//初始化加载原有数据
    	bool InitLoad() {
    		//从数据的持久化存储文件中加载数据
    		//1.将这个备份文件中的数据读取出来
    		std::string body;
    		if (FileUtil::Read(_store_file, &body) == false) {
    			return false;
    		}
    		//2.进行字符串处理,按照\r\n进行分割
    		//boost::split(vector,src,sep,flag)
    		std::vector<std::string> list;
    		//将body中的内容按\r\n进行分割,不保留\r\n,分割后存放到list中
    		boost::split(list, body, boost::is_any_of("\r\n"), boost::token_compress_off);
    
    		//3.每一行按照空格进行分割-前边是key,后边是val
    		for (auto i : list) {
    			size_t pos = i.find(" ");
    			if (pos == std::string::npos) {
    				continue;
    			}
    			std::string key = i.substr(0, pos);
    			std::string val = i.substr(pos + 1);
    			//4.将key/val添加到_file_list中
    			Insert(key, val);
    		}
    		return true;
    	}
    private:
    	std::string _store_file;//持久化存储文件名称,也就是在磁盘中,掉电后也存在
    	std::unordered_map<std::string, std::string> _backup_list;//文件备份信息
    };
    

    客户端主流程:

    #include "cloud_client.hpp"
    
    #define STORE_FILE "./list.backup"
    #define LISTEN_DIR "./backup/"
    #define SERVER_IP "192.168.204.129"
    #define SERVER_PORT 9000
    int main()
    {
    	CloudClient client(LISTEN_DIR, STORE_FILE, SERVER_IP, SERVER_PORT);
    	client.Start();
    	return 0;
    }
    
    展开全文
  • 有关云的炒作已经模糊了云存储,以及云备份恢复和还原(云BURR)之间的界限。甚至使得云存储和云端的存储,以及“同步和共享”这样的概念差别变得模糊。许多供应商乐意与此,因为这使得他们的方案看上去对于潜在客户更...
  • EMC云备份

    2015-06-25 14:26:40
    EMC云备份 一、主要组成 1、Data Domain 针对备份和归档的保护存储。 2、EMC Avamar 重复数据消除备份软件和系统。 3、EMC NetWorker 统一备份和恢复。 4、EMC Data Protection Advisor 统一数据保护管理。 二、EMC ...
  • 云备份技术的优缺点

    2019-06-15 20:45:47
     云备份有两种常见的实现方式:SaaS(Software-as-a-Service——软件即服务)和云存储服务。作为场内软件和次级存储的一种替代,备份SaaS是一种基于Web的应用,它运行在远程的系统中并被集中控制,而通过基于浏览器的...
  • 守望相助

    2020-07-11 19:29:49
    一、项目简介: 最近学完了Linux操作系统部分的知识,想做个项目整合一下所学的知识,发现自己平时学习过程中在电脑上保存了很多... 项目的总体设计是:服务器上的服务端用来将客户端上传的文件进行压缩存储,...
  • 作为一个骨灰级的花粉,你怎么能不知道华为云备份还有这个功能! 既然iPhone有iCloud,小米有小米云服务,华为当然也有自己的华为云服务。但是有些花粉可能还不知道华为云服务到底要怎么使用,今天小编就以照片的...
  • 自从有了iPhone的iCloud云备份灵感后,国产手机也纷纷借鉴了这个灵感,开始给手机安上了云备份功能。同样的,小米手机如今也是国产机的主流手机,自然也有它的云备份服务。 今天小编就来讲述一下什么是小米云备份。...
  • 每次使用电脑时,我们都会自觉的将...如今的安卓手机都会设有「备份」功能,通过手机系统备份,可以将手机数据备份到电脑、云备份和本地储存卡中。那以华为手机为例来了解一下是如何备份和恢复数据的。 1、手机系统备份
  • 百度如何自动备份同步文件

    千次阅读 2015-01-25 12:00:27
    网盘中小编比较常用的要数百度云盘了。今天小编为大家介绍一下如何将自己文件自动备份...百度如何自动备份同步文件,百度自动同步 第一步: 在百度网盘的主界面右商家菜单按钮,选择设置功能。
  • 网站最重要的除了SEO,就是网站的备份了,你不知道你什么时候会修改失败,或者遭到攻击导致数据丢失,所以定期备份网站和数据库是重中之重。 今天给大家介绍的方法是借助宝塔面板的计划任务功能实现网站和数据库...
  • 1.首先把RDS文件下载到本地,我的备份文件3.5G(下载时间6分钟); 压缩包: hins2448103_data_20180127044633.tar.gz 2.解压下载的RDS压缩包: tar -xzvf hins2448103_data_20180127044633.tar.gz 解压完是...
  • 今天,小编就跟大家全面地讲解小米手机的云服务,以备份恢复手机照片为例,帮助大家更好地管理手机的数据。 一、什么是小米云服务? 小米云服务就是小米公司为小米手机研发的云端数据备份功能,可以备份小米手机中的...
  • ZStack黑科技之平台备份与恢复

    千次阅读 2018-03-14 09:38:49
    今天咱们来看看ZStack的亮点之一被用户亲切的成为“吊炸天”的黑科技-平台备份恢复能力这个绝对不是“托儿”官网下载,直接去瞧瞧,ZStack就是这么牛只要你做了数据库备份,存储还在啥都不用怕几分钟就给你恢复成...
  • 通常我们使用手机时间长了之后,手机开始变得卡顿,常常出现内存不足的情况。...下面小编就来介绍关于安卓手机和苹果手机如何备份和恢复手机数据的使用方法。 一、安卓手机的备份和恢复 小米手机里有一个特别的功能
  • 数据中心备份容灾设计方案

    万次阅读 2018-09-20 15:06:25
    导读:云计算中心 涵盖系统多、类型复杂、关键性...数据中心备份容灾设计方案   本文主要内容: 数据中心业务分析 灾备技术实现 未来两地三中心规划 灾备方案实施步骤   数据中心业务分析   业务恢...
  • 虽然相对于企业传统的容灾备份解决方案,上云后的企业在容灾备份方面可以稍稍松上一口气———一般的云服务提供商自身都具有完备的容灾备份解决方案——诸如阿里、腾讯以及天翼都有着强大的容灾备份系统,但...
  • 百度会员功能特权对比 功能特权 非会员 会员 超级会员 文件转存 管家批量上传 不限量 管家自动备份 不支持 支持 支持 手机视频备份 不支持 原视频备份 原视频备份 本地文件夹备份(安卓) ...
1 2 3 4 5 ... 20
收藏数 74,591
精华内容 29,836
关键字:

云备份