本申請(qǐng)涉及軟件技術(shù)領(lǐng)域,尤其涉及一種python腳本的更新方法及裝置、客戶端、服務(wù)器。
背景技術(shù):
現(xiàn)有技術(shù)基于系統(tǒng)本地的應(yīng)用程序的進(jìn)程在更新、發(fā)布過程中,由于在每次更新腳本文件的過程中需要重啟進(jìn)程,在重啟過程中,被更新的腳本文件的穩(wěn)定性、安全性都不可預(yù)估,為了觀察被更新的腳本文件的穩(wěn)定性,則需要有很長(zhǎng)的灰度發(fā)布過程。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請(qǐng)?zhí)峁┮环N新的技術(shù)方案,可以實(shí)現(xiàn)不重啟應(yīng)用程序的進(jìn)程即可成實(shí)現(xiàn)腳本文件的更新。
為實(shí)現(xiàn)上述目的,本申請(qǐng)?zhí)峁┘夹g(shù)方案如下:
根據(jù)本申請(qǐng)的第一方面,提出了一種python腳本的更新方法,應(yīng)用在客戶端,包括:
當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊;
將所述新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段;
將所述第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制所述應(yīng)用程序在所述內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將所述第一腳本數(shù)據(jù)片段替換所述第二腳本數(shù)據(jù)片段。
根據(jù)本申請(qǐng)的第二方面,提出了一種python腳本的更新方法,應(yīng)用在服務(wù)器,包括:
確定已更新的python腳本;
將所述已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密;
對(duì)逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到所述已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊,以供客戶端在接收到所述新版本數(shù)據(jù)塊后,將所述新版本數(shù)據(jù)塊通過上述技術(shù)方案所述的更新方法將第一腳本數(shù)據(jù)片段替換內(nèi)存中的第二腳本數(shù)據(jù)片段。
根據(jù)本申請(qǐng)的第三方面,提出了一種python腳本的更新裝置,應(yīng)用在客戶端,包括:
第一獲取模塊,用于當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊;
還原模塊,用于將所述第一獲取模塊獲取到的所述新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段;
更新模塊,用于將所述還原模塊還原得到的所述第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制所述應(yīng)用程序在所述內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將所述第一腳本數(shù)據(jù)片段替換所述第二腳本數(shù)據(jù)片段。
根據(jù)本申請(qǐng)的第四方面,提出了一種python腳本的更新裝置,應(yīng)用在服務(wù)器,包括:
第三確定模塊,用于確定已更新的python腳本;
分解模塊,用于將所述第三確定模塊確定的所述已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密;
加密模塊,用于對(duì)所述分解模塊逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到所述已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
根據(jù)本申請(qǐng)的第五方面,提出了一種客戶端,所述客戶端包括:
第一處理器、內(nèi)部總線、第一網(wǎng)絡(luò)接口、內(nèi)存以及存儲(chǔ)第一處理器可執(zhí) 行指令的第一存儲(chǔ)器;
其中,第一網(wǎng)絡(luò)接口,用于當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊;
所述第一處理器,用于將所述新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段;將所述第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制所述應(yīng)用程序在所述內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將所述第一腳本數(shù)據(jù)片段替換所述第二腳本數(shù)據(jù)片段。
根據(jù)本申請(qǐng)的第六方面,提出了一種服務(wù)器,所述服務(wù)器包括:
第二處理器、內(nèi)部總線、第二網(wǎng)絡(luò)接口、內(nèi)存以及存儲(chǔ)第二處理器可執(zhí)行指令的第二存儲(chǔ)器;
其中,所述第二網(wǎng)絡(luò)接口,用于接收已更新的python腳本;
所述第二處理器,用于將所述已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密;對(duì)逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到所述已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊,以供客戶端在接收到所述新版本數(shù)據(jù)塊后,將所述新版本數(shù)據(jù)塊通過上述技術(shù)方案所述的更新方法將第一腳本數(shù)據(jù)片段替換內(nèi)存中的第二腳本數(shù)據(jù)片段。
由以上技術(shù)方案可見,本申請(qǐng)通過將需要更新的python腳本對(duì)應(yīng)的第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制應(yīng)用程序在內(nèi)存中將需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將第一腳本數(shù)據(jù)片段替換第二腳本數(shù)據(jù)片段,由于可以直接在內(nèi)存中替換需要更新的python腳本對(duì)應(yīng)的腳本數(shù)據(jù)片段,因此不需重啟應(yīng)用程序的本地進(jìn)程即可實(shí)現(xiàn)腳本數(shù)據(jù)片段的加載,不用關(guān)閉應(yīng)用程序便可完成python腳本的更新,提高了python腳本更新過程的穩(wěn)定性、安全性以及效率,縮短了應(yīng)用程序的灰度更新和發(fā)布的周期。
附圖說明
圖1示出了根據(jù)本發(fā)明的示例性實(shí)施例一的python腳本的更新方法的流程示意圖;
圖2示出了根據(jù)本發(fā)明的示例性實(shí)施例二的python腳本的更新方法的流程示意圖;
圖3示出了根據(jù)本發(fā)明的示例性實(shí)施例三的python腳本的更新方法的流程示意圖;
圖4示出了根據(jù)本發(fā)明的示例性實(shí)施例四的python腳本的更新方法的流程示意圖;
圖5示出了根據(jù)本發(fā)明的示例性實(shí)施例五的python腳本的更新方法的流程示意圖;
圖6示出了根據(jù)本發(fā)明的示例性實(shí)施例六的python腳本的更新方法的流程示意圖;
圖7示出了根據(jù)本發(fā)明的一示例性實(shí)施例的客戶端的結(jié)構(gòu)示意圖;
圖8示出了根據(jù)本發(fā)明的一示例性實(shí)施例的服務(wù)器的結(jié)構(gòu)示意圖;
圖9示出了根據(jù)本發(fā)明的示例性實(shí)施例一的python腳本的更新裝置的結(jié)構(gòu)示意圖;
圖10示出了根據(jù)本發(fā)明的示例性實(shí)施例二的python腳本的更新裝置的結(jié)構(gòu)示意圖;
圖11示出了根據(jù)本發(fā)明的示例性實(shí)施例三的python腳本的更新裝置的結(jié)構(gòu)示意圖;
圖12示出了根據(jù)本發(fā)明的示例性實(shí)施例四的python腳本的更新裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
為對(duì)本申請(qǐng)進(jìn)行進(jìn)一步說明,提供下列實(shí)施例:
圖1示出了根據(jù)本發(fā)明的示例性實(shí)施例一的python腳本的更新方法的流程示意圖;本實(shí)施例可應(yīng)用在客戶端,如圖1所示,包括如下步驟:
步驟101,當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
步驟102,將新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段。
步驟103,將第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制應(yīng)用程序在內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將第一腳本數(shù)據(jù)片段替換第二腳本數(shù)據(jù)片段。
可選的,本實(shí)施例還可以包括:
步驟104,啟動(dòng)內(nèi)存中的第一腳本數(shù)據(jù)片段。
在上述步驟101中,在一實(shí)施例中,可以通過比較客戶端當(dāng)前正在執(zhí)行的程序中的python腳本的第一校驗(yàn)值與服務(wù)器中的該同一python腳本的第二校驗(yàn)值,當(dāng)?shù)谝恍r?yàn)值和第二校驗(yàn)值不相同時(shí),確定檢測(cè)到需要對(duì)應(yīng)用程序進(jìn)行python腳本更新;在另一實(shí)施例中,服務(wù)器可以在接收到上傳的已經(jīng)更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊時(shí),向客戶端中發(fā)送更新通知消息, 客戶端在接收到該更新通知消息后,即可確定檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新。在一實(shí)施例,可以從服務(wù)器上下載需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
在上述步驟102中,在一實(shí)施例中,當(dāng)新版本數(shù)據(jù)塊為未加密的python腳本時(shí),可直接通過調(diào)用python提供的接口函數(shù)(例如,pystring_fromstring接口函數(shù))對(duì)腳本分解數(shù)據(jù)進(jìn)行詞法解析,得到可被執(zhí)行的腳本數(shù)據(jù)片段;當(dāng)新版本數(shù)據(jù)塊為已加密的python腳本時(shí),可對(duì)已加密的python腳本進(jìn)行與加密方法相對(duì)應(yīng)的解密方法進(jìn)行解密,并調(diào)用python提供的接口函數(shù)對(duì)腳本分解數(shù)據(jù)進(jìn)行詞法解析,得到可被執(zhí)行的腳本數(shù)據(jù)片段。
在上述步驟103和步驟104中,例如,一即時(shí)聊天應(yīng)用程序,包括功能a、功能b、功能c,在該即時(shí)聊天應(yīng)用程序正在運(yùn)行的過程中,當(dāng)通過上述步驟101-步驟102得到功能a對(duì)應(yīng)的可被執(zhí)行的第一腳本數(shù)據(jù)片段后,可以將該第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制功能a在內(nèi)存中對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,將功能a對(duì)應(yīng)的可被執(zhí)行的第一腳本數(shù)據(jù)片段替換內(nèi)存中功能a對(duì)應(yīng)的第二腳本數(shù)據(jù)片段塊,替換完成后,啟動(dòng)內(nèi)存中的功能a更新后的第一腳本數(shù)據(jù)片段。當(dāng)功能b與功能a相關(guān)聯(lián)時(shí),在更新功能a對(duì)應(yīng)的python腳本的過程中,還可以暫停功能b對(duì)應(yīng)的腳本數(shù)據(jù)片段,從而可以防止在python腳本更新過程中內(nèi)存中的其他邏輯腳本對(duì)應(yīng)用程序造成不可預(yù)知的異常情況,或者應(yīng)用程序?qū)ζ渌麅?nèi)存中的邏輯python腳本造成不可預(yù)知的異常情況。
由上述描述可知,本發(fā)明實(shí)施例通過將需要更新的python腳本對(duì)應(yīng)的第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制應(yīng)用程序在內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將第一腳本數(shù)據(jù)片段替換內(nèi)存中的第二腳本數(shù)據(jù)片段,由于可以直接在內(nèi)存中替換需要更新的腳本數(shù)據(jù)片段,因此不需重啟應(yīng)用程序的本地進(jìn)程即可實(shí)現(xiàn)腳本數(shù)據(jù)片段的加載,不用關(guān)閉應(yīng)用程序便可完成python腳本的更新,提高了python腳本更新過程的穩(wěn)定性、安全性以及效率,縮短了應(yīng)用程序的灰度更新和發(fā)布的周期。
圖2示出了根據(jù)本發(fā)明的示例性實(shí)施例二的python腳本的更新方法的流程示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以新版本數(shù)據(jù)塊在已加密的情形下如何對(duì)新版本數(shù)據(jù)塊進(jìn)行解密并解析成可被執(zhí)行的第一腳本數(shù)據(jù)片段為例進(jìn)行示例性說明,如圖2所示,包括如下步驟:
步驟201,當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
步驟202,確定新版本數(shù)據(jù)塊是否為已加密數(shù)據(jù)塊,當(dāng)新版本數(shù)據(jù)塊為已加密數(shù)據(jù)塊時(shí),執(zhí)行步驟203,當(dāng)新版本數(shù)據(jù)塊為非加密數(shù)據(jù)塊時(shí),執(zhí)行步驟205。
步驟203,根據(jù)與新版本數(shù)據(jù)塊的加密算法相一致的解密算法解密新版本數(shù)據(jù)塊,得到腳本分解數(shù)據(jù),執(zhí)行步驟204。
步驟204,將腳本分解數(shù)據(jù)解析成可被執(zhí)行的第一腳本數(shù)據(jù)片段,執(zhí)行步驟206。
步驟205,將新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段,執(zhí)行步驟206。
步驟206,將第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制應(yīng)用程序在內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將第一腳本數(shù)據(jù)片段替換成第二腳本數(shù)據(jù)片段,執(zhí)行步驟207。
步驟207,啟動(dòng)內(nèi)存中的第一腳本數(shù)據(jù)片段,流程結(jié)束。
步驟201、步驟204-步驟207的描述可以參見上述圖1所示實(shí)施例中的相關(guān)描述,在此不再詳述。
上述步驟202中,可以通過在新版本數(shù)據(jù)塊中添加一個(gè)標(biāo)識(shí)已確定該新版本數(shù)據(jù)塊是否已經(jīng)加密,例如,標(biāo)識(shí)為1時(shí),表示該新版本數(shù)據(jù)塊為已加密的數(shù)據(jù)塊,標(biāo)識(shí)為0時(shí),表示該新版本數(shù)據(jù)塊為未加密的數(shù)據(jù)塊。
上述步驟203中,客戶端可以與服務(wù)器預(yù)先確定好一致的加密算法和解密算法,客戶端在接收到已加密的新版本數(shù)據(jù)塊后,可以根據(jù)預(yù)先約定的與加密算法相一致的解密算法對(duì)已加密的新版本數(shù)據(jù)塊進(jìn)行解密,例如,當(dāng)已 更新的python腳本文件需要加密時(shí),對(duì)python腳本按每字節(jié)屬性分解開,并逐字節(jié)進(jìn)行加密之后,將己經(jīng)按字節(jié)加密過的整體數(shù)據(jù)混合進(jìn)行高強(qiáng)度對(duì)稱加密,被加密的腳本文件通過加密處理后已經(jīng)是非標(biāo)準(zhǔn)的可解析腳本文件(本申請(qǐng)中所述的“新版本數(shù)據(jù)塊”),客戶端在接收到該已加密的新版本數(shù)據(jù)塊,根據(jù)與上述過程相逆的解密算法對(duì)新版本數(shù)據(jù)塊進(jìn)行解密,從而可以得到需要更新的python腳本對(duì)應(yīng)的第一腳本數(shù)據(jù)片段。
本實(shí)施例在具有上述實(shí)施例的有益技術(shù)效果的基礎(chǔ)上,當(dāng)新版本數(shù)據(jù)塊為已加密數(shù)據(jù)塊時(shí),根據(jù)更新數(shù)據(jù)塊的加密數(shù)據(jù)結(jié)構(gòu)解密更新數(shù)構(gòu)據(jù)塊,得到腳本分解數(shù)據(jù),從而可以確保腳本數(shù)據(jù)在更新過程中的安全性要求。
圖3示出了根據(jù)本發(fā)明的示例性實(shí)施例三的python腳本的更新方法的流程示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何對(duì)新版本數(shù)據(jù)塊的完整性進(jìn)行校驗(yàn)為例進(jìn)行示例性說明,如圖3所示,包括如下步驟:
步驟301,檢測(cè)新版本數(shù)據(jù)塊是否包含有數(shù)字水印,如果新版本數(shù)據(jù)塊包含有數(shù)字水印,執(zhí)行步驟302,如果新版本數(shù)據(jù)塊未包含有數(shù)字水印,直接通過上述圖1或者圖2所示實(shí)施例更新python腳本即可,本實(shí)施例不再詳述。
步驟302,如果新版本數(shù)據(jù)塊包含有數(shù)字水印,根據(jù)數(shù)字水印確定新版本數(shù)據(jù)塊是否具有完整性,如果新版本數(shù)據(jù)塊具有完整性,執(zhí)行步驟303,如果新版本數(shù)據(jù)塊不具有完整性,可以發(fā)出更新錯(cuò)誤的通知消息,并控制應(yīng)用程序停止腳本更新。
步驟303,如果新版本數(shù)據(jù)塊具有完整性,去除新版本數(shù)據(jù)塊的數(shù)字水印,并通過上述圖1或者圖2所示實(shí)施例更新python腳本即可,本實(shí)施例不再詳述。
上述步驟301中,在一實(shí)施例中,可以通過在新版本數(shù)據(jù)塊中添加另一個(gè)標(biāo)識(shí)已確定該新版本數(shù)據(jù)塊是否已經(jīng)添加數(shù)字水印,例如,標(biāo)識(shí)為1時(shí),表示該新版本數(shù)據(jù)塊已經(jīng)添加有數(shù)字水印,標(biāo)識(shí)為0時(shí),表示該新版本數(shù)據(jù)塊未添加數(shù)字水印。
上述步驟302和步驟303中,可以通過現(xiàn)有技術(shù)提供的方法來通過數(shù)字水印確定新版本數(shù)據(jù)塊是否具有完整性,以及去除新版本數(shù)據(jù)塊的數(shù)字水印,本實(shí)施例不再詳述。
本實(shí)施例在具有上述實(shí)施例的有益技術(shù)效果的基礎(chǔ)上,通過數(shù)字水印對(duì)新版本數(shù)據(jù)塊的完整性進(jìn)行水印保護(hù),從而可以確保新版本數(shù)據(jù)塊不會(huì)被修改替換,避免被黑客攻擊,進(jìn)而保證新版本數(shù)據(jù)塊對(duì)應(yīng)的原始腳本文件的安全性。
圖4示出了根據(jù)本發(fā)明的示例性實(shí)施例四的python腳本的更新方法的流程示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何確定檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新為例進(jìn)行示例性說明,如圖4所示,包括如下步驟:
步驟401,從服務(wù)器獲取需要更新的python腳本對(duì)應(yīng)的md5文件。
步驟402,從md5文件中獲取需要更新的python腳本對(duì)應(yīng)的第一校驗(yàn)值,以及確定應(yīng)用程序的需要更新的python腳本對(duì)應(yīng)的第二校驗(yàn)值。
步驟403,當(dāng)?shù)谝恍r?yàn)值和第二校驗(yàn)值不相同時(shí),確定檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新。
在上述步驟401中,在一實(shí)施例中,客戶端可以主動(dòng)從服務(wù)器處獲取需要更新的python腳本對(duì)應(yīng)的md5文件,服務(wù)器在生成新版本數(shù)據(jù)塊時(shí),通過哈希算法計(jì)算新版本數(shù)據(jù)塊對(duì)應(yīng)的第一哈希值,將該第一哈希值存儲(chǔ)在md5文件中。
在上述步驟402和步驟403中,例如,一即時(shí)聊天應(yīng)用程序,包括功能a、功能b、功能c,在該即時(shí)聊天應(yīng)用程序正在運(yùn)行的過程中,當(dāng)從服務(wù)器上獲取到功能a、功能b、功能c各自對(duì)應(yīng)的md5文件后,從各自對(duì)應(yīng)的md5文件中獲取各自對(duì)應(yīng)的第一校驗(yàn)值,根據(jù)與計(jì)算第一校驗(yàn)值相同的哈希算法計(jì)算即時(shí)聊天應(yīng)用程序的功能a、功能b、功能c各自正在運(yùn)行的python腳本對(duì)應(yīng)的第二校驗(yàn)值,當(dāng)檢測(cè)到功能b和功能c各自的第一校驗(yàn)值和第二校驗(yàn)值相同時(shí),說明功能b和功能c在服務(wù)器與客戶端的python腳本相同,此時(shí)不需要對(duì)功能b和功能c各自對(duì)應(yīng)的python腳本進(jìn)行更新,當(dāng)檢測(cè)到 功能a的第一校驗(yàn)值和第二校驗(yàn)值不相同時(shí),說明客戶端上的功能a對(duì)應(yīng)的python腳本需要更新,通過上述圖1或者圖2實(shí)施例即可對(duì)功能a對(duì)應(yīng)的python腳本進(jìn)行更新,本實(shí)施例不再詳述python腳本的更新過程。
本實(shí)施例在具有上述實(shí)施例有益技術(shù)效果的基礎(chǔ)上,通過客戶端主動(dòng)向服務(wù)器獲取python腳本對(duì)應(yīng)的md5文件,根據(jù)md5文件在服務(wù)器上的第一校驗(yàn)值以及客戶端的第二校驗(yàn)值來確定是否需要對(duì)python腳本進(jìn)行更新,從而可以使客戶端能夠主動(dòng)自行檢查是否需要更新python腳本,可以使用戶能夠盡快使用到應(yīng)用程序更新后的功能,提高用戶體驗(yàn)。
圖5示出了根據(jù)本發(fā)明的示例性實(shí)施例五的python腳本的更新方法的流程示意圖;本實(shí)施例可應(yīng)用在服務(wù)器,如圖5所示,包括如下步驟:
步驟501,確定已更新的python腳本。
步驟502,將已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密。
步驟503,對(duì)逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
在上述步驟501中,例如,當(dāng)確定需要對(duì)應(yīng)用程序的其中一個(gè)功能更新時(shí),研發(fā)人員可以編寫該功能對(duì)應(yīng)的基于python腳本的邏輯代碼,例如,一即時(shí)聊天應(yīng)用程序,包括功能a、功能b、功能c,當(dāng)研發(fā)人員根據(jù)應(yīng)用程序的需求更新功能a時(shí),可以基于python腳本編寫更新后的功能a對(duì)應(yīng)的邏輯代碼,該python腳本即為功能a對(duì)應(yīng)的已更新的python腳本,將該已更新的python腳本更新到服務(wù)器上。
當(dāng)通過上述步驟502和步驟503對(duì)已更新的python腳本進(jìn)行加密后,得到的已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊,該新版本數(shù)據(jù)塊通過加密處理后已經(jīng)不是一個(gè)標(biāo)準(zhǔn)的可解析腳本文件,而是以密文方式將新版本數(shù)據(jù)塊保存在服務(wù)器上。
客戶端在接收到新版本數(shù)據(jù)塊后,通過上述圖1-圖4任一實(shí)施例提供的更新方法替換成在內(nèi)存中更新腳本數(shù)據(jù)片段,本實(shí)施例不再詳述。
本實(shí)施例中,通過對(duì)已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密,對(duì)逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊,有利于增強(qiáng)python腳本的安全性和穩(wěn)定性,并可防止腳本出現(xiàn)錯(cuò)誤的情形下影響后續(xù)更新過程,進(jìn)而影響客戶端的腳本更新。
圖6示出了根據(jù)本發(fā)明的示例性實(shí)施例六的python腳本的更新方法的流程示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何對(duì)已更新數(shù)據(jù)添加數(shù)字水印為例進(jìn)行示例性說明,如圖6所示,包括如下步驟:
步驟601,確定新版本數(shù)據(jù)塊對(duì)應(yīng)的數(shù)字水印。
步驟602,將數(shù)字水印添加到新版本數(shù)據(jù)塊中。
步驟603,根據(jù)新版本數(shù)據(jù)塊生成新版本數(shù)據(jù)塊對(duì)應(yīng)的第一校驗(yàn)值。
步驟604,將第一校驗(yàn)值存儲(chǔ)在新版本數(shù)據(jù)塊對(duì)應(yīng)的md5文件中。
上述步驟601和步驟602中,可以通過現(xiàn)有技術(shù)提供的方法將數(shù)字水印添加到新版本數(shù)據(jù)塊中,本實(shí)施例不再詳述。
上述步驟603和步驟604中,可以通過現(xiàn)有技術(shù)提供的哈希算法生成新版本數(shù)據(jù)塊對(duì)應(yīng)的第一校驗(yàn)值,并將第一校驗(yàn)值存儲(chǔ)在新版本數(shù)據(jù)塊對(duì)應(yīng)的md5文件中,本實(shí)施例不再詳述。
本領(lǐng)域技術(shù)人員可以理解的是,本實(shí)施例不對(duì)步驟601-步驟604的執(zhí)行順序做限制,也可以通過先執(zhí)行步驟603和步驟604得到md5文件,或者同時(shí)執(zhí)行步驟601-步驟602、步驟603-步驟604,從而同時(shí)對(duì)已更新數(shù)據(jù)添加水印以及生成md5文件。
本實(shí)施例在具有上述實(shí)施例的有益技術(shù)效果的基礎(chǔ)上,通過數(shù)字水印對(duì)新版本數(shù)據(jù)塊的完整性進(jìn)行水印保護(hù),從而可以確保新版本數(shù)據(jù)塊不會(huì)被修改替換,避免被黑客攻擊,進(jìn)而保證新版本數(shù)據(jù)塊對(duì)應(yīng)的原始腳本文件的安全性;通過md5文件中的第一校驗(yàn)值可以使客戶端主動(dòng)檢測(cè)是否需要對(duì)python腳本進(jìn)行更新。
通過上述實(shí)施例可知,本申請(qǐng)可以將所有邏輯功能和代碼寫在python腳本中,并基于解釋型腳本語(yǔ)言python跟應(yīng)用程序的宿主進(jìn)程進(jìn)行交互;通過 本地進(jìn)程來更新和重加載python腳本,即可實(shí)現(xiàn)不需要重啟進(jìn)程亦不需要灰度發(fā)布即可成一次邏輯功能的更新;由于python腳本在出錯(cuò)的情形下并不會(huì)影響應(yīng)用程序的宿主進(jìn)程的穩(wěn)定性,因此在對(duì)python腳本進(jìn)行更新時(shí)不會(huì)導(dǎo)致腳本功能出錯(cuò)。
對(duì)應(yīng)于上述的python腳本的更新方法,本申請(qǐng)還提出了圖7所示的根據(jù)本申請(qǐng)的一示例性實(shí)施例的客戶端的示意結(jié)構(gòu)圖。請(qǐng)參考圖7,在硬件層面,該客戶端包括第一處理器、內(nèi)部總線、第一網(wǎng)絡(luò)接口、內(nèi)存以及存儲(chǔ)第一處理器可執(zhí)行指令的第一存儲(chǔ)器,當(dāng)然還可能包括其他業(yè)務(wù)所需要的硬件。
其中,第一網(wǎng)絡(luò)接口,用于當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊;
第一處理器,用于將所述新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段;將所述第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制所述應(yīng)用程序在所述內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將所述第一腳本數(shù)據(jù)片段替換所述第二腳本數(shù)據(jù)片段。
對(duì)應(yīng)于上述的python腳本的更新方法,本申請(qǐng)還提出了圖8所示的根據(jù)本申請(qǐng)的一示例性實(shí)施例的服務(wù)器的示意結(jié)構(gòu)圖。請(qǐng)參考圖8,在硬件層面,該服務(wù)器包括第二處理器、內(nèi)部總線、第二網(wǎng)絡(luò)接口、內(nèi)存以及存儲(chǔ)第二處理器可執(zhí)行指令的第二存儲(chǔ)器,當(dāng)然還可能包括其他業(yè)務(wù)所需要的硬件。
其中,第二網(wǎng)絡(luò)接口,用于接收已更新的python腳本;
所述第二處理器,用于將所述已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密;對(duì)逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到所述已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊,以供客戶端在接收到所述新版本數(shù)據(jù)塊后,將所述新版本數(shù)據(jù)塊通過上述圖1-圖4所示的更新方法替換成內(nèi)存中的待更新的python腳本數(shù)據(jù)塊。
圖9示出了根據(jù)本發(fā)明的示例性實(shí)施例一的python腳本的更新裝置的結(jié)構(gòu)示意圖;如圖9所示,該python腳本的更新裝置可應(yīng)用在客戶端,可以包括:第一獲取模塊91、還原模塊92、更新模塊93、啟動(dòng)模塊94。其中:
第一獲取模塊91,用于當(dāng)檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新時(shí),獲取需要更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊;
還原模塊92,用于將第一獲取模塊91獲取到的新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段;
更新模塊93,用于將還原模塊92還原得到的第一腳本數(shù)據(jù)片段加載至內(nèi)存,控制應(yīng)用程序在內(nèi)存中需要更新的python腳本對(duì)應(yīng)的第二腳本數(shù)據(jù)片段暫停執(zhí)行,并將第一腳本數(shù)據(jù)片段替換第二腳本數(shù)據(jù)片段。
圖10示出了根據(jù)本發(fā)明的示例性實(shí)施例二的python腳本的更新裝置的結(jié)構(gòu)示意圖;在上述圖9所示實(shí)施例的基礎(chǔ)上,如圖10所示,
在一實(shí)施例中,還原模塊92包括:
第一確定單元921,用于確定新版本數(shù)據(jù)塊是否為已加密數(shù)據(jù)塊;
解密單元922,用于當(dāng)?shù)谝淮_定單元921確定新版本數(shù)據(jù)塊為已加密數(shù)據(jù)塊時(shí),根據(jù)與新版本數(shù)據(jù)塊的加密算法相一致的解密算法解密新版本數(shù)據(jù)塊,得到腳本分解數(shù)據(jù);
解析單元923,用于將解密單元922解密得到的腳本分解數(shù)據(jù)解析成可被執(zhí)行的第一腳本數(shù)據(jù)片段;
當(dāng)?shù)谝淮_定單元921確定新版本數(shù)據(jù)塊為非加密數(shù)據(jù)塊時(shí),還原模塊92將新版本數(shù)據(jù)塊作為腳本分解數(shù)據(jù),并執(zhí)行將新版本數(shù)據(jù)塊還原成可被執(zhí)行的第一腳本數(shù)據(jù)片段的步驟。
在一實(shí)施例中,解析單元923包括:
解析子單元(圖中未示),用于通過python提供的接口函數(shù)對(duì)腳本分解數(shù)據(jù)進(jìn)行詞法解析,得到可被執(zhí)行的第一腳本數(shù)據(jù)片段。
在一實(shí)施例中,裝置還可包括:
啟動(dòng)模塊94,用于在更新模塊93將第一腳本數(shù)據(jù)片段替換第二腳本數(shù)據(jù)片段后,啟動(dòng)內(nèi)存中的第一腳本數(shù)據(jù)片段。
在一實(shí)施例中,裝置還可包括:
檢測(cè)模塊95,用于檢測(cè)下載模塊91下載得到的新版本數(shù)據(jù)塊是否包含 有數(shù)字水??;
第一確定模塊96,用于如果檢測(cè)模塊95檢測(cè)到新版本數(shù)據(jù)塊包含有數(shù)字水印,根據(jù)數(shù)字水印確定新版本數(shù)據(jù)塊是否具有完整性;
去除模塊97,用于如果第一確定模塊96確定新版本數(shù)據(jù)塊具有完整性,去除新版本數(shù)據(jù)塊的數(shù)字水印。
在一實(shí)施例中,裝置還可包括:
第二獲取模塊98,用于從服務(wù)器上獲取的第一獲取模塊91獲取到的新版本數(shù)據(jù)塊對(duì)應(yīng)的md5文件;
第三獲取模塊99,用于從第二獲取模塊98獲取到的md5文件中獲取需要更新的python腳本對(duì)應(yīng)的第一校驗(yàn)值,以及確定應(yīng)用程序的需要更新的python腳本對(duì)應(yīng)的第二校驗(yàn)值;
第二確定模塊90,用于當(dāng)?shù)诙@取模塊99獲取到的第一校驗(yàn)值和第二校驗(yàn)值不相同時(shí),確定檢測(cè)到應(yīng)用程序需要進(jìn)行python腳本更新。
圖11示出了根據(jù)本發(fā)明的示例性實(shí)施例三的python腳本的更新裝置的結(jié)構(gòu)示意圖;如圖11所示,該python腳本的更新裝置可應(yīng)用在服務(wù)器,可以包括:第三確定模塊111、分解模塊112、加密模塊113。其中:
第三確定模塊111,用于確定已更新的python腳本;
分解模塊112,用于將第三確定模塊111確定的已更新的python腳本按字節(jié)屬性進(jìn)行分解并逐字節(jié)進(jìn)行加密;
加密模塊113,用于對(duì)分解模塊112逐字節(jié)加密后的python腳本進(jìn)行對(duì)稱加密,得到已更新的python腳本對(duì)應(yīng)的新版本數(shù)據(jù)塊。
圖12示出了根據(jù)本發(fā)明的示例性實(shí)施例四的python腳本的更新裝置的結(jié)構(gòu)示意圖;在上述圖11所示實(shí)施例的基礎(chǔ)上,如圖12所示,裝置還包括:
第四確定模塊114,用于確定加密模塊113加密后得到的新版本數(shù)據(jù)塊對(duì)應(yīng)的數(shù)字水??;
添加模塊115,用于將第四確定模塊114確定的數(shù)字水印添加到新版本數(shù)據(jù)塊中。
在一實(shí)施例中,裝置還可包括:
生成模塊116,用于根據(jù)加密模塊113加密后得到的新版本數(shù)據(jù)塊生成新版本數(shù)據(jù)塊對(duì)應(yīng)的第一校驗(yàn)值;
存儲(chǔ)模塊117,用于將生成模塊116生成的第一校驗(yàn)值存儲(chǔ)在新版本數(shù)據(jù)塊對(duì)應(yīng)的md5文件中。
上述實(shí)施例可見,本申請(qǐng)可以將所有邏輯功能和代碼寫在python腳本中,并基于解釋型腳本語(yǔ)言python跟應(yīng)用程序的宿主進(jìn)程進(jìn)行交互;通過本地進(jìn)程來更新和重加載python腳本,即可實(shí)現(xiàn)不需要重啟進(jìn)程亦不需要灰度發(fā)布即可成一次邏輯功能的更新;由于python腳本在出錯(cuò)的情形下并不會(huì)影響應(yīng)用程序的宿主進(jìn)程的穩(wěn)定性,因此在對(duì)python腳本進(jìn)行更新時(shí)不會(huì)導(dǎo)致底層引擎出錯(cuò),當(dāng)更新過程出現(xiàn)問題時(shí)可依靠更新引擎再次回滾。
本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本申請(qǐng)的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本申請(qǐng)的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請(qǐng)的一般性原理并包括本申請(qǐng)未公開的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本申請(qǐng)的真正范圍和精神由下面的權(quán)利要求指出。
還需要說明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。