`
hellosoft
  • 浏览: 55193 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

升级文件预备份工具

阅读更多
主要功能:
在升级系统之前,
首先将本次升级所需要覆盖的文件,按照原来的目录结构copy出来,备份在指定的地方。
万一升级有问题,可以使用这个预备份的进行还原。
注意:这个工具只能处理文件覆盖的问题,暂时不能处理 新增或者删除文件的情况。
建议使用 linux + php5.2以及以上版本。
如果是windows 请将常量 CNT_SEPARATE_CHAR_FOR_PATH 更改为 \。 应该可以的,不过笔者就没试过而已。

<?php
/**
 * 名称   :  升级文件预备份工具
 * 主要功能:
 *      在升级系统之前,
 *      首先将本次升级所需要覆盖的文件,按照原来的目录结构copy出来,备份在指定的地方。
 *      防止,万一升级有问题,可以使用这个预备份的进行还原。
 *
 *      注意:这个工具只能处理文件覆盖的问题,暂时不能处理 新增或者删除文件的情况。
 *
 * Step:
 * 1. check arguments
 * 2. scan upgRoot,
 *      1) mkdir in desc
 *      2) copy the file to Desc
 * 
 * If desc not exist, create it.
 * Suggest : Desc is empty, or is not exists.
 */
define("CNT_SEPARATE_CHAR_FOR_PATH", "/");
define("CNT_SHOW_DETAIL", true);
define("CNT_SHOW_NOT_FIND", true); # if (CNT_SHOW_NOT_FIND and CNT_SHOW_DETAIL) show the file or dir which do not find 

# 1. check arguments
if (count($argv) != 4 ){
    showHelp("miss arguments .");
}

$appRoot = $argv[1];
$upgRoot = $argv[2];
$desRoot = $argv[3];

if (!is_dir($appRoot)){
    showHelp(" [{$appRoot}] is not exist, or is not a directory.");
}
if (!is_dir($upgRoot)){
    showHelp(" [{$upgRoot}] is not exist, or is not a directory.");
}


# 2. scan upgRoot
echo "\n";
if (CNT_SHOW_DETAIL) echo "{$desRoot}\n";
$prefixForShow = "";
$re = copyUpgFileFromAppToDesc($appRoot, $upgRoot,  $desRoot, $prefixForShow);
if ($re){
    echo "\nCongratulation! The {$desRoot} has been created successfully.\n\n";
}else{
    echo "\nMay be something is wrong, check it and try again. \n";
}

# finish

#------------- functions -----------------------

function copyUpgFileFromAppToDesc($appPath, $upgPath,  $desPath, $prefixForShow){
    $re = true;

    if (!file_exists($desPath)) mkdir_p($desPath); // 创建相应目录

    
    $fileList = scandir($upgPath);
    $count = count($fileList) - 2; # 因为有 . ..
    $index = 0;
    foreach ($fileList as $fileName){
        if ($fileName == "." || $fileName == "..") continue; // next cycle
        $index++;
        $isLast = ($index == $count);
        #$nSpaceChar = getSpaceChar($prefixForShow * 4);

        $appFullFile = $appPath . CNT_SEPARATE_CHAR_FOR_PATH . $fileName;
        $upgFullFile = $upgPath . CNT_SEPARATE_CHAR_FOR_PATH . $fileName;
        $desFullFile = $desPath . CNT_SEPARATE_CHAR_FOR_PATH . $fileName;

        if (!file_exists($appFullFile)){
            if (CNT_SHOW_DETAIL && CNT_SHOW_NOT_FIND){
                if (!$isLast){
                    echo $prefixForShow . "|-- " . $fileName . " (not find) \n";
                }else{
                    echo $prefixForShow . "`-- " . $fileName . " (not find)  \n";
                }
            }        
        continue; // app中不存在相应文件,就不必再copy了
        } 

        if (CNT_SHOW_DETAIL){
            if (!$isLast){
                echo $prefixForShow . "|-- " . $fileName . "\n";
            }else{
                echo $prefixForShow . "`-- " . $fileName . "\n";
            }
        }
        if (is_dir($upgFullFile)){
            $nextPrefix = $prefixForShow . "|   ";
           if ($isLast) $nextPrefix = $prefixForShow . "    ";
            $re = copyUpgFileFromAppToDesc($appFullFile,$upgFullFile,$desFullFile, $nextPrefix);
            if (!$re){
                echo "Error: copy direcotry [{$appFullFile}] to [{$desFullFile}]";
                break;
            }
        }else{
            $re = copy($appFullFile, $desFullFile);
            if (!$re){
                echo "Error: copy file [{$appFullFile}] to [{$desFullFile}]";
                break;
            }
        }

    }

    return $re;
}

// 强行创建相应的目录
function mkdir_p($dirname){
    if (!file_exists($dirname)){
        mkdir_p(dirname($dirname));
        mkdir($dirname);
    }
}
function getSpaceChar($n){
    $re = "";
    for($i =0; $i<$n; $i++) $re.=" ";
    return $re;
}

function showHelp($errorMessage = ""){ // with exit.
    if (!$errorMessage == ""){
         echo $errorMessage . "\n";
    }
    echo "Usage:

    php bak_file_before_upgrade.php RootPath_Application RootPath_UpgradePackage RootPath_Desc

    If one file is both in RootPath_Application and RootPath_UpgradePackage,
    we will copy the file in RootPath_Application to RootPath_Desc.
    If it in subdirecotry, then we will create the same name directory in RootPath_Desc.

    e.g.
    php bak_file_before_upgrade.php /export/yourApplication /tmp/upgrade/yourUpgradePackage /tmp/bakbeforeupgrade/bakupDirectory
    \n";
    exit;
}

?>
1
0
分享到:
评论

相关推荐

    高通平台EMCP FLASH客户端多路升级工具 操作说明 V1.5

    - **数据显示**:对于不同软件版本,具体含义为:[当前已升级文件/ROM升级总文件][PASS总次数/运行总次数]。 - **信息显示**:黑色字体为运行信息,红色字体为FAIL信息,绿色字体表示升级完成。 以上步骤详细介绍了...

    Oracle EBS r12升级流程图.doc

    Oracle EBS R12升级流程图不仅是一份技术文档,更是企业IT团队进行系统升级的行动指南。通过遵循这一流程,可以最大限度地降低升级风险,确保升级过程顺利进行,为企业带来持续的技术创新和业务增长动力。对于参与...

    斐讯k2刷机工具包

    1. **PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin**:这是一个固件升级文件,基于SquashFS文件系统,适用于斐讯K2路由器。"ralink-mt7620"指的是路由器所采用的联发科(Mediatek...

    Oracle数据库从12.2升级到19C RAC的静默操作指南

    覆盖了升级之前的风险评估以及必要性的数据收集、选用工具如dbupgrade和Catctl.pl,具体介绍静默命令应用如Dry-Run和真正升级过程中所需执行的关键脚本,此外也提及了升级后验证操作以及涉及的相关系统参数修改,...

    KNC 华芯飞方案MP4固件升级程序

    1. 下载:用户需要从官方网站或其他可靠渠道下载对应型号的固件升级文件,确保文件来源的安全性,防止病毒或恶意软件。 2. 预备:在升级前,用户需要备份个人数据,因为升级过程中可能会清除原有数据。同时,确保MP4...

    CUBE H500D酷比魔方刷机工具

    4. 运行工具:打开刷机工具,选择相应的操作选项(如升级或恢复),然后导入对应的系统固件文件。固件文件通常为ZIP格式,包含设备所需的操作系统镜像。 5. 开始刷机:点击开始或刷机按钮,工具会自动开始执行刷机...

    -升级windows2003的域控制器到windows2008

    首先,确保有足够的磁盘空间,因为Windows Server 2008的安装文件较大,且安装过程中会复制所有文件到硬盘,以便后续添加角色和服务。此外,备份是升级前必不可少的步骤,以防意外发生。 升级步骤包括: 1. 提升域...

    打包工具-----打包你要发布软件的安装程序.rar

    - 版本管理:打包工具有助于版本管理和更新推送,使用户可以方便地升级到新版本。 2. 常见的打包工具: - Inno Setup:这是一个免费的Windows安装制作工具,支持创建自解压文件和多语言安装程序。 - NSIS ...

    行业文档-设计装置-基于先进教育理念的学前预备教育系统.zip

    标题中的“行业文档-设计装置-基于先进教育理念的学前预备教育系统”表明...通过阅读这份PDF文件,读者将能够深入理解这个学前预备教育系统的全面设计,以及如何通过先进教育理念和技术,来提升学前教育的效率和质量。

    Brother兄弟 MFC-8680DN多功能一体机固件更新工具 4.1.1版

    1. 下载:首先从Brother官方网站或者其他可靠来源下载对应的固件更新工具,确保文件完整无误。 2. 预备:关闭打印机,避免在更新过程中发生干扰。 3. 安装:运行“Brother_MFC8680DN_FWUpdate_411.exe”安装程序,...

    华为Ap3010DN-AGN FAT V200R005C10

    4. 升级:使用专门的管理工具或命令行界面执行固件升级,按照指示导入下载的"AP3010DN-AGN-FAT"文件。 5. 验证:升级完成后,验证AP是否成功切换到FAT模式,并检查设备状态和无线网络性能。 6. 配置:在FAT模式下,...

    2288H_V5_2288C_V5_5288_V5-iBMC-V627.hpm

    2. 预备检查:在升级前,应备份现有固件,检查服务器当前状态,确保所有关键业务已暂停或迁移,以防止升级过程中出现意外中断。 3. 升级操作:根据华为提供的升级指南,通过iBMC Web界面或者命令行工具进行固件升级...

    ADuC702X_在线升级方案设计与程序设计简介by_arzhiy

    根据提供的文件信息,我们可以深入探讨ADuC702X在线升级方案的设计与程序设计的关键知识点。 ### ADuC702X在线升级方案设计与程序设计简介 #### 第一章 相关预备知识 ##### 一、ADuC702x物理存储结构地址图 ADuC...

    C300-V1.2.0开局指导书.doc

    在【升级准备】阶段,你需要确保拥有必要的工具,如笔记本电脑、串口线、网线和CPLD烧录工具。同时,为了预防可能出现的问题,建议预备主控板和PON板的备用板。此外,升级前的软件准备包括备份配置数据(startrun....

    西门子之TIA Portal的准备工作检查工具.pdf

    总结来说,西门子的TIA Portal Readiness Check Tool是一个非常实用的预备工具,它能够在自动化项目规划和实施前有效地帮助工程师检查硬件与TIA Portal软件的兼容性,从而避免项目执行中因硬件兼容问题导致的延误和...

    图莫斯uta固件.zip

    2. 解压:由于文件是以zip格式压缩的,用户需要使用解压工具(如WinRAR或7-Zip)将其解压缩,以访问内部的固件文件。 3. 预备:在进行固件升级前,用户通常需要备份现有数据,以防更新过程中出现问题导致数据丢失。...

    备用查看1

    对于工具的使用,熟悉命令行操作、配置文件的解读、工具的安装和升级、与其他工具的集成等技能同样必不可少。 在学习源码时,我们可能会关注以下几点: 1. **编程语言特性**:根据源码使用的编程语言,学习其语法、...

Global site tag (gtag.js) - Google Analytics