Rev 261 | Rev 291 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*QBPWCF, Quick Build PHP website Component base on Fedora Linux.Copyright (C) 2014~2026 MIN ZHI, CHENThis file is part of QBPWCF.QBPWCF is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.QBPWCF is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with QBPWCF. If not, see <http://www.gnu.org/licenses/>.*/namespace qbpwcf;/*類別說明:應用 zerossl 的類別.備註:無.*/class zerossl{/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無.*/public function __call($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __call end/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無.*/public static function __callStatic($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __callStatic end/*#函式說明:#取得api的資訊#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"],api資訊陣列.#必填參數:#無#可省略參數:#無#參考資料:#無.#備註:#無.*/public static function getApiInfo(){#初始化要回傳的陣列$result=array();#api domain$result["apiDomain"]="api.zerossl.com";#create certificate api path$result["csrPath"]="/certificates";#create certificate url$result["csrUrl"]=$result["apiDomain"].$result["csrPath"];#api access key$result["apiKey"]=zeroSSLapiKey;#設置執行正常$result["status"]="true";#回傳結果return $result;}#function getApiInfo end/*#函式說明:#產生ssl private key.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],ssl用的private key.#必填參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["length"],整數,金鑰的長度,預設為 4096(bit).#$conf["length"]=4096';#參考資料:#無.#備註:#key generated by openssl with RSA.*/public static function createPrivateKey(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("length");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("length");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("integer");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(4096);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果 $checkArguments["status"]等於 "false"if($checkArguments["status"]==="false"){#設置執行錯誤的識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果 $checkArguments["passed"]等於 "false"if($checkArguments["passed"]==="false"){#設置執行錯誤的識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="openssl";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("genrsa",$conf["length"]);#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果異常if($callShell["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#函式說明:#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的function名稱#$result["error"],錯誤訊息陣列.#$result["content"],處理好的字串.#$result["argu"],使用的參數.#必填參數:#$conf["inputArray"],字串陣列,要轉成字串的一維陣列.$conf["arrays::arrayToString"]["inputArray"]=$callShell["output"];#可省略參數:#$conf["spiltSymbol"],字串,用來區隔字串的符號,預設為;$conf["arrays::arrayToString"]["spiltSymbol"]=PHP_EOL;#$conf["skipEnd"],字串,結尾是否不要加上符號,預設為"false",要加上符號,"true"代表不要加上符號。$conf["arrays::arrayToString"]["skipEnd"]="true";#$conf["spiltSymbolAtStart"],字串,是否要在開頭加上spiltSymbol,預設為"false",代表不要;反之為“true”.#$conf["spiltSymbolAtStart"]="";#參考資料:#無.#備註:#無.$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);unset($conf["arrays::arrayToString"]);#如果異常if($arrayToString["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$arrayToString;#回傳結果return $result;}#if end#取得 private key 字串$result["content"]=$arrayToString["content"];#設置執行正常$result["status"]="true";#回傳結果return $result;}#function createPrivateKey end/*#函式說明:#產生certificate sign request(CSR).#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],csr內容.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["privateKey"], private key 的內容.#必填參數:#$conf["domain"],字串,csr內容的網域名稱.#$conf["domain"]="";#可省略參數:#$conf["pKey"],字串,若要使用既有的privateKey檔案,則需要提供檔案位置與名稱;反之預設為自動產生,記得要從回傳結果的"privateKey"取得其內容.#$conf["pKey"]="";#$conf["country"],字串,csr內容的國家名稱,預設為"TW".#$conf["country"]="";#$conf["state"],字串,csr內容的State名稱,預設為"Taiwan".#$conf["state"]="";#$conf["org"],字串,csr內容的組織名稱,預設為"QBPWCF".#$conf["org"]="";#$conf["unit"],字串,csr內容的組織所屬單位,預設為"RD".#$conf["unit"]="";#參考資料:#無.#備註:#無.*/public static function createCSR(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("domain");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("pKey","country","state","city","org","unit");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,"TW","Taiwan","Taoyuan City","QBPWCF","RD");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果沒有指定 pKeyif(!isset($conf["pKey"])){#產生uuid名稱#函式說明:#使用 linux 的 uuid 指令來產生 uuid 字串#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["content"],uuid.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.$uuid=cmd::uuid();#如果執行異常if($uuid["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$uuid;#回傳結果return $result;}#if end#取得暫存的檔案名稱$TFN=$uuid["content"];#函式說明:#於本套件位置底下的tmp資料夾下建立與回傳暫存檔案名稱路徑#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["content"],暫存檔案的路徑與名稱.#$result["fileName"],暫存檔案的名稱.#$result["path"],暫存檔案的路徑.#必填參數:#無.#可省略參數:#$conf["content"],陣列,每行檔案的內容,預設為空陣列,不寫入任何資料.#$conf["contant"]=array();#參考資料:#無.#備註:#無.$conf["fileAccess::createTempFile"]=array();$createTempFile=fileAccess::createTempFile($conf["fileAccess::createTempFile"]);unset($conf["fileAccess::createTempFile"]);#如果執行異常if($createTempFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createTempFile;#回傳結果return $result;}#if end#暫存的檔案路徑與名稱$TFN=$createTempFile["content"];#產生 privae key#openssl genrsa -out output.key 4096#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEcaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="openssl";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("genrsa","-out",$TFN,"4096");#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.#$conf["escapeshellarg"]="false";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.$conf["external::callShell"]["doNotRun"]="true";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShell["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#debug#var_dump(__LINE__,$callShell);exit;#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($callShell["cmd"]);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="true";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$proc;#回傳結果return $result;}#if end#debug#var_dump(__LINE__,$proc);exit;#如果執行異常if($proc["content"][0]["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$proc["content"][0]["error"];#回傳結果return $result;}#if end#儲存錯誤訊息$errorMsg=$proc["content"][0]["error"];#如果有錯誤訊息if(!empty($errorMsg)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$errorMsg;#回傳結果return $result;}#if end}#if end#反之else{#檢查 pKey 是否存在#函式說明:#檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$resutl["function"],當前執行的涵式名稱.#$result["argu"],使用的參數.#$result["allExist"],所有檔案皆存在的識別,"true"代表皆存在,"false"代表沒有全部都存在.#$result["varName"][$i],爲第$i個資料夾或檔案的路徑與名稱。#$result["varNameFullPath"][$i],爲第$i個資料夾或檔案的完整檔案系統路徑與名稱,如果不存在則代表路徑是網址.#$result["varNameWebPath"][$i],為第$i個資料夾或檔案的網址,若"web"參數為"true",才會有該內容.#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填參數:#$conf["fileArray"],陣列字串,要檢查是否存在的檔案有哪些,須爲一維陣列數值。$conf["fileAccess::checkMultiFileExist"]["fileArray"]=$conf["pKey"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::checkMultiFileExist"]["fileArgu"]=__FILE__;#可省略參數:#$conf["disableWebSearch"],"字串",是否取消「當檔案找不到時,改用catchWebContent類別的wget函數來檢查檔案是否存在於網路上」的功能,"false"不取消,若要取消該功能請設為"true",若抓到的內容為空字串則會視為檔案不存在,預設為"true".#$conf["disableWebSearch"]="false";#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,預設為"true".$conf["fileAccess::checkMultiFileExist"]["userDir"]="false";#$conf["web"],字串,檔案是放在web就是"true",反之為檔案系統"false",預設為"true".$conf["fileAccess::checkMultiFileExist"]["web"]="false";#參考資料:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php#備註:#函數file_exists檢查的路徑為檔案系統的路徑#$result["varName"][$i]結果未實作$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess::checkMultiFileExist"]);unset($conf["fileAccess::checkMultiFileExist"]);#如果執行異常if($checkMultiFileExist["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkMultiFileExist;#回傳結果return $result;}#if end#設置pKey$TFN=$conf["pKey"];}#else#範例指令#C,國家,例如TW,代表Taiwan#ST,州、省,要完整名稱,例如:Taiwan#L,城市名稱,例如Taoyuan City.#O=,組織或公司名稱,例如QBPWCF.#OU,單位名稱,例如RD.#CN,網域名稱,例如www.qbpwcf.org#openssl req -new -key qbpwcf.org.key -out qbpwcf.org.csr "-subj=/C=TW/ST=Taiwan/L=Taoyuan City/O=QBPWCF/OU=RD/CN=www.qbpwcf.org/"#初始化subj參數$subjStr="-subj=/";#設置 Country 參數$subjStr=$subjStr."C=".$conf["country"]."/";#設置 State 參數$subjStr=$subjStr."ST=".$conf["state"]."/";#設置 city 參數$subjStr=$subjStr."L=".$conf["city"]."/";#設置 Org 參數$subjStr=$subjStr."O=".$conf["org"]."/";#設置 Unit 參數$subjStr=$subjStr."OU=".$conf["unit"]."/";#設置 domain name 參數$subjStr=$subjStr."CN=".$conf["domain"]."/";#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEcaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="openssl";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("req","-new","-key",$TFN,$subjStr);#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.$conf["external::callShell"]["doNotRun"]="true";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShell["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#debug#var_dump(__LINE__,$callShell);exit;#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($callShell["cmd"]);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="true";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$proc;#回傳結果return $result;}#if end#如果執行異常if($proc["content"][0]["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$proc["content"][0]["error"];#回傳結果return $result;}#if end#debug#var_dump(__LINE__,$proc);exit;#儲存csr$csr=$proc["content"][0]["content"];#取得 csr 內容$result["content"]=$csr;#取得 private key 的內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.#$result["error"],錯誤訊息提示.#$result["warning"],警告訊息.#$result["function"],當前執行的函數名稱.#$result["fileContent"],爲檔案的內容陣列.#$result["lineCount"],爲檔案內容總共的行數.#$result["fullContent"],為檔案的完整內容.#$result["base64dataOnly"],檔案的base64data.#$result["base64data"],為在網頁上給予src參數的數值.#$result["mimeType"],為檔案的mime type.#必填參數:#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.$conf["fileAccess::getFileContent"]["filePositionAndName"]=$TFN;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::getFileContent"]["fileArgu"]=__FILE__;#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".#$conf["web"]="true";#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".#$conf["createIfnotExist"]="false";#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"#$conf["autoDeleteSpaceOnEachLineStart"]="false";#參考資料:#file(),取得檔案內容的行數.#file=>http:#php.net/manual/en/function.file.php#rtrim(),剔除透過file()取得每行內容結尾的換行符號.#filesize=>http://php.net/manual/en/function.filesize.php#參考資料:#無.#備註:#無.$getFileContent=fileAccess::getFileContent($conf["fileAccess::getFileContent"]);unset($conf["fileAccess::getFileContent"]);#如果執行異常if($getFileContent["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getFileContent;#回傳結果return $result;}#if end#設置要回傳的 private key 的內容$result["privateKey"]=$getFileContent["fullContent"];#如果沒有設置 pKeyif(!isset($conf["pKey"])){#移除private key#函式說明:#移除檔案#回傳結果:#$result["status"],"true"代表移除成功,"false"代表移除失敗.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],當前函式使用的參數.#必填參數:#$conf["fileAddress"],字串,要移除檔案的位置.$conf["fileAccess::delFile"]["fileAddress"]=$TFN;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.$conf["fileAccess::delFile"]["fileArgu"]=__FILE__;#可省略參數:#$conf["commentsArray"],字串陣列,提示的文字描述,$conf["commentsArray"][$i]代表第($+1)行的描述.#$conf["commentsArray"]=array("");#$conf["allowDelSymlink"],字串,預設為"false",不移除軟連結;"true"代表要移除軟連結.#$conf["allowDelSymlink"]="true";#$conf["allowDelFolder"],字串,預設為"false",不移除目錄;"true"代表要移除目錄.#$conf["allowDelFolder"]="true";#參考資料:#無.#備註:#無.$delFile=fileAccess::delFile($conf["fileAccess::delFile"]);unset($conf["fileAccess::delFile"]);#如果執行異常if($delFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delFile;#回傳結果return $result;}#if end}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function createCSR end/*#函式說明:#提供certificate sign request(CSR)透過zerossl產生certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["id"],用於zerossl api驗證domain的id.#$result["content"],字串,得到的json字串回應.#$result["cnameKey"],用於dns CNAME驗證鍵名.#$result["cnameVal"],用於dms CNAME驗證鍵值.#必填參數:#$conf["certificate_domains"],字串,要簽署的doamin名稱.$conf["certificate_domains"]="";#$conf["certificate_csr"],字串,簽署的資訊.$conf["certificate_csr"]="";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["path"],字串,提供服務的path,預設為 self::getApiInfo()["csrPath"].#$conf["path"]=self::getApiInfo()["csrPath"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#參考資料:#無.#備註:#無.*/public static function createCertificate(&$conf){#break point#var_dump(self::getApiInfo());exit;#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","certificate_domains","certificate_csr");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","path","key");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["csrPath"],self::getApiInfo()["apiKey"]);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#要傳送的 key -> value$postArray=array();#設置要簽署的domain$postArray["certificate_domains"]=$conf["certificate_domains"];#設置csr$postArray["certificate_csr"]=$conf["certificate_csr"];#預設為 90 天的憑證$postArray["certificate_validity_days"]=90;#強制讓 要簽署的domain 為 $postArray["certificate_domains"]$postArray["strict_domains"]=1;#設置要傳送的 json$postJson=json_encode($postArray);#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]="https://".$conf["apiDomain"].$conf["path"]."?access_key=".$conf["key"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["header"],字串陣列,要傳送的header.$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;/* 範例 json content{"id":"de9bfbbc78ad2b04323ac0670efefe58","type":"1","common_name":"qbpwcf.org","additional_domains":"","created":"2026-01-19 11:47:13","expires":"2026-04-19 23:59:59","status":"draft","validation_type":null,"validation_emails":null,"replacement_for":"","fingerprint_sha1":null,"brand_validation":null,"validation":{"email_validation":{"qbpwcf.org":["admin@qbpwcf.org","administrator@qbpwcf.org","hostmaster@qbpwcf.org","postmaster@qbpwcf.org","webmaster@qbpwcf.org"]},"other_methods":{"qbpwcf.org":{"file_validation_url_http":"http:\/\/qbpwcf.org\/.well-known\/pki-validation\/3FE7CA1D6DA057FB40FDD333B4C105F9.txt","file_validation_url_https":"https:\/\/qbpwcf.org\/.well-known\/pki-validation\/3FE7CA1D6DA057FB40FDD333B4C105F9.txt","file_validation_content":["7B29341B7148276F5025CE90FC1138037871040E5B7FBDB8E7EEF7CC8DAA4A56","comodoca.com","2e85598b7f1b864"],"cname_validation_p1":"_3FE7CA1D6DA057FB40FDD333B4C105F9.qbpwcf.org","cname_validation_p2":"7B29341B7148276F5025CE90FC113803.7871040E5B7FBDB8E7EEF7CC8DAA4A56.2e85598b7f1b864.comodoca.com"}}},"signature_algorithm_properties":null}*/#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#解析json$jsonRes=json_decode($result["content"]);#另存 certifucate domain$cerDomain=$conf["certificate_domains"];#如果缺少必備的資訊if(!isset($jsonRes->validation)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#取得用於 dns CNAME 驗證的名稱$result["cnameKey"]=$jsonRes->validation->other_methods->$cerDomain->cname_validation_p1;#取得用於 dns CNAME 驗證的數值$result["cnameVal"]=$jsonRes->validation->other_methods->$cerDomain->cname_validation_p2;#取得用於認證domain時識別用的id$result["id"]=$jsonRes->id;#設置執行正常$result["status"]="true";#回傳結果return $result;}#function createCertificate end/*#函式說明:#新增DNS記錄到檔案裡面.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],字串陣列,更新後的檔案RR(DNS記錄).#$result["domain"],字串,RR所屬domain.#$result["defaultTTL"],字串,預設的RR更新時間.#$result["comment"],字串陣列,逐行的註解.#必填參數:#$conf["add"],多維陣列,每個元素有為有三個元素的陣列,key有"query"跟"update"跟"type"跟"value"以及"comment",分別代表要查詢的數值、更新周期、類型(支援的有"A","TXT","CNAME","SOA","$TTL","$ORIGIN")、答案、註解.$conf["add"]=array();#$conf["dnsRecordFile"],字串,該ZONE檔案位置與名稱.$conf["dnsRecordFile"]="";#可省略參數:#$conf["writeNow"],字串,是否要直接寫入既有ZONE檔案,預設為"false",不寫入;"true"為直接覆寫內容.#$conf["writeNow"]="false";#$conf["debug"],字串,是否要開啟debug模式,預設為"false"不開啟;反之為"true"要開啟,會在/tmp/建立debug檔案zerossl\:\:updateDnsRecordFile.#$conf["debug"]="false";#參考資料:#無.#備註:#目前支援的DNS記錄檔案是給bind(Berkeley Internet Name Domain)套件使用的.#通常qbpwcf使用者沒有權限存取RR(dns記錄檔案),本套件是透過sshfs掛載來繞過該問題.#php-pear上的Net_DNS2也可以解析RR.*/public static function updateDnsRecordFile(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("add","dnsRecordFile");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("writeNow","debug");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false","false");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#初始化要回傳的content$result["content"]=array();#初始化儲存逐行的註解.$result["comment"]=array();#預設的zone file domain為空$result["domain"]="";#預設的 update 時間$result["defaultTTL"]=3600;#取得 dns 記錄檔案的內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.#$result["error"],錯誤訊息提示.#$result["warning"],警告訊息.#$result["function"],當前執行的函數名稱.#$result["fileContent"],爲檔案的內容陣列.#$result["lineCount"],爲檔案內容總共的行數.#$result["fullContent"],為檔案的完整內容.#$result["base64dataOnly"],檔案的base64data.#$result["base64data"],為在網頁上給予src參數的數值.#$result["mimeType"],為檔案的mime type.#必填參數:#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.$conf["fileAccesss::getFileContent"]["filePositionAndName"]=$conf["dnsRecordFile"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccesss::getFileContent"]["fileArgu"]=__FILE__;#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".$conf["fileAccesss::getFileContent"]["web"]="false";#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".#$conf["createIfnotExist"]="false";#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"#$conf["autoDeleteSpaceOnEachLineStart"]="false";#參考資料:#file(),取得檔案內容的行數.#file=>http:#php.net/manual/en/function.file.php#rtrim(),剔除透過file()取得每行內容結尾的換行符號.#filesize=>http://php.net/manual/en/function.filesize.php#參考資料:#無.#備註:#無.$getFileContent=fileAccess::getFileContent($conf["fileAccesss::getFileContent"]);unset($conf["fileAccesss::getFileContent"]);#如果檢查失敗if($getFileContent["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getFileContent;#回傳結果return $result;}#if end#取得每行內容$lines=$getFileContent["fileContent"];/*範例每行內容:$ORIGIN server.domain. ;base domain-name,in this Resource Records (RR) file,"@" equal to base domain-name.$TTL 86400 ;default TTL for zone@ 1200 IN SOA dns.server.domain. admin.server.domain. 2026012205 10800 1800 1728000 1200 ;domain name server, admin mail, serial, refresh time, expire, Negative Caching, https://bind9.readthedocs.io/en/latest/chapter3.html#term-SOA-minimum@ 3600 IN TXT "v=spf1 a mx ~all"@ 86400 IN MX 1 mail.server.domain.@ 86400 IN A 1.1.1.1mail.server.domain. IN 1.1.1.110-42-0-1 IN A 10.42.0.1101-free IN A 101.101.101.101127-0-0-1 IN A 127.0.0.1_dmarc IN TXT "v=DMARC1;p=reject;sp=reject;pct=100;adkim=r;aspf=r;fo=1;ri=86400;rua=mailto:admin@server.domain"default._domainkey IN TXT ( "v=DKIM1; k=rsa;" "p=MIGfMA0GCSqG/SIb3DQEBAQQAB" ) ; ----- DKIM key default for qbpwcf.org...*/#針對每行內容foreach($lines as $lineNo => $line){#另存一份要處理的RR$unFormatStr=$line;#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="processing lineNo:".$lineNo." content:".$line.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#初始化該行的資訊陣列$info=array();#尋找";"開頭的內容,亦即整行都是註解.#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]=";\${else}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有找到符合格式的內容if($findSpecifyStrFormat["found"]==="true"){#儲存為註解$result["comment"][]=$unFormatStr;#換下一行continue;}#if end#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\$ORIGIN\${else}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有找到符合格式的內容if($findSpecifyStrFormat["found"]==="true"){#設置 type 的數值$info["type"]="\$ORIGIN";#取得後面待處理的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["else"][0];#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array(" ","\t");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#如果有移除開頭的字串if($delHeadStr["founded"]==="true"){#取得處理後的結果$unFormatStr=$delHeadStr["content"];}#if end#解析 $ORIGN 的數值, 以及後面是否有註解...#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有數值跟註解if($findSpecifyStrFormat["found"]==="true"){#儲存數值$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存zone domain$result["domain"]=trim($info["value"]);#儲存註解$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];#儲存解析好的RR$result["content"][]=$info;#換下一行continue;}#if end#執行到這邊代表剩下的內容都是 value$info["value"]=$unFormatStr;#儲存zone domain$result["domain"]=trim($info["value"]);#儲存解析好的RR$result["content"][]=$info;#換下一行continue;}#if end#檢查是否為 $TTL 開頭#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\$TTL\${else}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有找到符合格式的內容if($findSpecifyStrFormat["found"]==="true"){#設置 type 的數值$info["type"]="\$TTL";#取得後面待處理的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["else"][0];#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array(" ","\t");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#如果有移除開頭的字串if($delHeadStr["founded"]==="true"){#取得處理後的結果$unFormatStr=$delHeadStr["content"];}#if end#解析 $TTL 的數值, 以及後面是否有註解...#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有數值跟註解if($findSpecifyStrFormat["found"]==="true"){#儲存數值$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存註解$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];#儲存預設的 TTL$result["defaultTTL"]=trim($info["value"]);#儲存解析好的RR$result["content"][]=$info;#換下一行continue;}#if end#執行到這邊代表剩下的內容都是 value$info["value"]=$unFormatStr;#儲存預設的 TTL$result["defaultTTL"]=trim($info["value"]);#儲存解析好的RR$result["content"][]=$info;#換下一行continue;}#if end#如果 內容為 query updatTime IN type value;comment,或value含有(或",則需要將其符號與後面的內容先暫時拆開#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left}(\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在"("if($findSpecifyStrFormat["found"]==="true"){#取得無"("的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭"("內容$unFormatStr2add="(".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end#反之else{#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left}\"\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在"if($findSpecifyStrFormat["found"]==="true"){#取得無"的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭"內容$unFormatStr2add="\"".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end#反之else{#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left};\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在";"if($findSpecifyStrFormat["found"]==="true"){#取得無";"的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭";"內容$unFormatStr2add=";".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end}#else end}#else end#檢查是否為 @ 開頭#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="@\${else}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有找到符合格式的內容if($findSpecifyStrFormat["found"]==="true"){#設置 query 的數值$info["query"]="@";#取得後面待處理的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["else"][0];#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array(" ","\t");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#如果有移除開頭的字串if($delHeadStr["founded"]==="true"){#取得處理後的結果 update time..IN..type...value;comment$unFormatStr=$delHeadStr["content"];}#if end#debug#var_dump(__LINE__,$delHeadStr);}#if end#反之else{#執行到這邊,代表 query 為一非 @ 的字串#函式說明:#將指令字串解析成陣列,方便給予 external::callShell 使用#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"],解析好的指令陣列.#$result["cmd"],解析好的指令名稱.#$result["argus"],解析好的參數陣列.#$result["argu"],所使用的參數.#必填參數#$conf["cmdStr"],字串,要解析的指令字串$conf["stringProcess::parseCmdString"]["cmdStr"]=$unFormatStr;#可省略參數:#無.#參考資料:#無.#備註:#無.$parseCmdString=cmd::parseCmdString($conf["stringProcess::parseCmdString"]);unset($conf["stringProcess::parseCmdString"]);#如果執行失敗if($parseCmdString["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$parseCmdString;#debug#$result["errorProcessLine"]=$line;#回傳結果return $result;}#if end#取得 query 的內容$info["query"]=$parseCmdString["content"][0];#剔除 query以及後面的" "跟\t#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array($info["query"]," ","\t");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#取得update time..IN..type...value;comment$unFormatStr=$delHeadStr["content"];}#else end#無窮迴圈while(true){#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." \$unFormatStr:".$unFormatStr.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#解析 updateTime..IN..type...value...comment#判斷是否無 update time#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="IN\${else}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有找到符合格式的內容if($findSpecifyStrFormat["found"]==="true"){#代表沒有 update time 欄位,因此儲存預設的TTL$info["update"]=&$result["defaultTTL"];#取得剩下的 ...type...value;comment$unFormatStr=$findSpecifyStrFormat["parsedVar"]["else"][0];#設置該行沒有指定 update time$noUpdateTime="true";#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." \$unFormatStr:".$unFormatStr.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end}#if end#反之else{#設置該行有指定 update time$noUpdateTime="false";#如果有指定 update timeif($noUpdateTime==="false"){#要來解析 update time#函式說明:#將字串進行解析,變成多個參數.#回傳結果:#$result["status"],執行正常與否,"false"代表不正常,"true"代表正常.#$result["function"],當前執行的函式內容.#$result["error"],錯誤訊息陣列.#$result["content"],參數陣列.#$result["count"],總共有幾個參數.#必填參數:#$conf["input"],字串,要解析成參數的字串.$conf["stringProcess::parse"]["input"]=$unFormatStr;#可省略參數:#無.#參考資料:#無.#備註:#無.$parse=stringProcess::parse($conf["stringProcess::parse"]);unset($conf["stringProcess::parse"]);#如果執行異常if($parse["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$parse;#回傳結果return $result;}#if end#取得更新時間$info["update"]=$parse["content"][0];#取得 update time 後面的內容#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array($info["update"]);#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#取得...IN...value;comment$unFormatStr=$delHeadStr["content"];}#if end#取得 ...IN... 後面的內容#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array(" ","\t","IN");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#取得IN...value;comment$unFormatStr=$delHeadStr["content"];#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." \$unFormatStr:".$unFormatStr.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end}#else end#解析 type...value;comment#函式說明:#將字串進行解析,變成多個參數.#回傳結果:#$result["status"],執行正常與否,"false"代表不正常,"true"代表正常.#$result["function"],當前執行的函式內容.#$result["error"],錯誤訊息陣列.#$result["content"],參數陣列.#$result["count"],總共有幾個參數.#必填參數:#$conf["input"],字串,要解析成參數的字串.$conf["stringProcess::parse"]["input"]=$unFormatStr;#可省略參數:#無.#參考資料:#無.#備註:#無.$parse=stringProcess::parse($conf["stringProcess::parse"]);unset($conf["stringProcess::parse"]);#如果執行異常if($parse["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$parse;#回傳結果return $result;}#if end#取得 type$info["type"]=$parse["content"][0];#取得 type...後面的value;comment內容#函式說明:#將字串開頭的特定關鍵字移除.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["founded"],有無找到開頭要移除的特定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delHeadStr"]["stringIn"]=$unFormatStr;#$conf["headStr"],字串陣列,開頭為哪些字串就要移除.$conf["stringProcess::delHeadStr"]["headStr"]=array($info["type"]," ","\t");#可省略參數:#無.#參考資料:#無.#備註:#無.$delHeadStr=stringProcess::delHeadStr($conf["stringProcess::delHeadStr"]);unset($conf["stringProcess::delHeadStr"]);#如果執行異常if($delHeadStr["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$delHeadStr;#回傳結果return $result;}#if end#取得 value;comment$unFormatStr=$delHeadStr["content"];#如果有要合併回去的內容if(isset($unFormatStr2add)){#合併回去內容$unFormatStr=$unFormatStr.$unFormatStr2add;#移除用不到的變數unset($unFormatStr2add);}#if end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." \$unFormatStr:".$unFormatStr.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#如果type不為 CNAME 跟 TXT 跟 SOAif( $info["type"]!=="CNAME" && $info["type"]!=="TXT" && $info["type"]!=="SOA" ){#儲存value$info["value"]=$unFormatStr;#判斷是否有 ";" 存在#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 ";"if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存comment$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];}#if end#儲存該筆RR$result["content"][]=$info;#解析完畢換下一行continue 2;}#if end#執行到這邊,代表type為CNAME或TXT或SOA#如果 type 是 SOAif($info["type"]==="SOA"){#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." type:".$info["type"].PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#SOA 範例#@ 1200 IN SOA dns.qbpwcf.org. liveuser.qbpwcf.org. 2026012205 10800 1800 1728000 1200 ;domain name server, admin mail, serial, refresh time, expire, Negative Caching, https://bind9.readthedocs.io/en/latest/chapter3.html#term-SOA-minimum#再度嘗試分割#如果 內容為 query updatTime IN type value;comment,或value含有(或",則需要將其符號與後面的內容先暫時拆開#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left}(\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在"("if($findSpecifyStrFormat["found"]==="true"){#取得無"("的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭"("內容$unFormatStr2add="(".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end#反之else{#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left}\"\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在"if($findSpecifyStrFormat["found"]==="true"){#取得無"的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭"內容$unFormatStr2add="\"".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end#反之else{#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容,變數的key從0開始.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${left};\${right}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果存在";"if($findSpecifyStrFormat["found"]==="true"){#取得無";"的內容$unFormatStr=$findSpecifyStrFormat["parsedVar"]["left"][0];#取得拆下來的含開頭";"內容$unFormatStr2add=";".$findSpecifyStrFormat["parsedVar"]["right"][0];}#if end}#else end}#else end#取得 serial number#函式說明:#將字串進行解析,變成多個參數.#回傳結果:#$result["status"],執行正常與否,"false"代表不正常,"true"代表正常.#$result["function"],當前執行的函式內容.#$result["error"],錯誤訊息陣列.#$result["content"],參數陣列.#$result["count"],總共有幾個參數.#必填參數:#$conf["input"],字串,要解析成參數的字串.$conf["stringProcess::parse"]["input"]=$unFormatStr;#可省略參數:#無.#參考資料:#無.#備註:#無.$parse=stringProcess::parse($conf["stringProcess::parse"]);unset($conf["stringProcess::parse"]);#如果執行異常if($parse["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$parse;#回傳結果return $result;}#if end#取得serial number$serialNo=$parse["content"][2];#serialNo+1$serialNo++;#回存$parse["content"][2]=(string)$serialNo;#函式說明:#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的function名稱#$result["error"],錯誤訊息陣列.#$result["content"],處理好的字串.#$result["argu"],使用的參數.#必填參數:#$conf["inputArray"],字串陣列,要轉成字串的一維陣列.$conf["arrays::arrayToString"]["inputArray"]=$parse["content"];#可省略參數:#$conf["spiltSymbol"],字串,用來區隔字串的符號,預設為;$conf["arrays::arrayToString"]["spiltSymbol"]=" ";#$conf["skipEnd"],字串,結尾是否不要加上符號,預設為"false",要加上符號,"true"代表不要加上符號。$conf["arrays::arrayToString"]["skipEnd"]="true";#$conf["spiltSymbolAtStart"],字串,是否要在開頭加上spiltSymbol,預設為"false",代表不要;反之為“true”.#$conf["spiltSymbolAtStart"]="";#參考資料:#無.#備註:#無.$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);unset($conf["arrays::arrayToString"]);#如果執行異常if($arrayToString["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$arrayToString;#回傳結果return $result;}#if end#取得更新 serial number 後的 SOA value string$unFormatStr=$arrayToString["content"];#如果有要合併回去的內容if(isset($unFormatStr2add)){#合併回去內容$unFormatStr=$unFormatStr.$unFormatStr2add;#移除用不到的變數unset($unFormatStr2add);}#if end#假設剩下的沒有註解都是 value$info["value"]=$unFormatStr;#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有符合格式if($findSpecifyStrFormat["found"]==="true"){#儲存 value$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存 comment$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];}#if end#儲存該筆RR$result["content"][]=$info;#換下解析下筆RRcontinue 2;}#if end#執行到這邊代表不是 SOA#尋找是否有(...)...的內容存在#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="(\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 有符合 ($value);${comment} 的格式if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]="(".$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存comment$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#if end#執行到這邊代表沒有 (...)... 的內容存在#尋找是否有 (...) 的內容存在#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="(\${value})";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 有符合 ($value);${comment} 的格式if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#if end#執行到這邊代表沒有 (...) 的內容存在#尋找有無 "...";... 的內容存在#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\"\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 有符合 "$value";${comment} 的格式if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]="\"".$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存comment$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#if end#執行到這邊代表沒有 "$value";${comment} 的格式#尋找有無 "..." 的內容存在#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\"\${value}\"";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 有符合 "$value" 的格式if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]="\"".$findSpecifyStrFormat["parsedVar"]["value"][0]."\"";#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#if end#執行到這邊代表沒有 "$value" 格式的內容#檢查是否有 $value;$comment 格式的內容#函式說明:#尋找字串中是否含有符合格式的內容,且回傳解析好的變數數值.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["found"],是否有找到符合格式的字串內容,"true"代表有找到,"false"代表沒有找到.#$result["content"],陣列,若為n個${*},則當found為"true"時,就會回傳n個元素.#$result["parsedVar"][varName],陣列,解析好的變數陣列,varName為${}中的內容.#必填參數:#$conf["input"],字串,要檢查的字串.$conf["search::findSpecifyStrFormat"]["input"]=$unFormatStr;#$conf["format"],格式字串,要尋找的格式字串.格式為固定的字串("fixedStr format")與變數("${keyWordVarName}")組成.$conf["search::findSpecifyStrFormat"]["format"]="\${value};\${comment}";#可省略參數:#$conf["varEqual"],陣列,變數對應的數值,null代表不指定,其他內容代表該變數解析出來必須要為該內容.#$conf["varEqual"]=array(null,"found");#$conf["varCon"],陣列,每個varEqual為null者,其是否有其他條件,預設為null代表無其他條件,條件的表示是用陣列的key與value來表達,例如:array("no_tail"=>" not"),就代表變數的結尾不能為" not",可以用的key有"head",代表開頭要有什麼;"no_head",代表不能為什麼開頭;"tail",代表要什麼結尾;"no_tail",代表不能什麼結尾.#$conf["varCon"]=array("no_tail"=>" not");#參考資料:#無.#備註:#無.$findSpecifyStrFormat=search::findSpecifyStrFormat($conf["search::findSpecifyStrFormat"]);unset($conf["search::findSpecifyStrFormat"]);#如果執行異常if($findSpecifyStrFormat["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$findSpecifyStrFormat;#回傳結果return $result;}#if end#如果有 有符合 "$value" 的格式if($findSpecifyStrFormat["found"]==="true"){#儲存value$info["value"]=$findSpecifyStrFormat["parsedVar"]["value"][0];#儲存comment$info["comment"]=$findSpecifyStrFormat["parsedVar"]["comment"][0];#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#if end#執行到這邊代表沒有 ${value};${comment} 格式的內容#亦即剩下的內容都是 value#儲存value$info["value"]=$unFormatStr;#儲存 RR 的記錄$result["content"][]=$info;#跳到下一筆要解析的RRcontinue 2;}#while end}#foreach end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." parse RR fin.".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#$conf["add"],多維陣列,每個元素有為有三個元素的陣列,key有"query"跟"update"跟"type"跟"value"以及"comment",分別代表要查詢的數值、更新周期、類型、答案、註解.#針對每個要新增的RR記錄foreach($conf["add"] as $nri => $newRR){#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." ori newRR:".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$newRR;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#如果新的 RR 缺少必備的資訊if(!isset($newRR["type"])){#設置執行異常$result["status"]="false";#設置執行錯誤$result["error"]="add參數的格式缺少type";#回傳結果return $result;}#if end#如果 query 結尾不是"@"也不為"."結尾if( ($newRR["query"]!=="@") && ($newRR["query"][strlen($newRR["query"])-1]!==".") ){#加上 "."$conf["add"][$nri]["query"]=$newRR["query"]=$newRR["query"].".";}#if end#如果新的 query 為 $ORGIN 結尾#函式說明:#將字串特定關鍵字與其後面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#$result["argu"],使用的參數.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$newRR["query"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=$result["domain"];#可省略參數:#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].#$conf["deleteLastRepeatedOne"]="";#參考資料:#無.#備註:#無.$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);unset($conf["stringProcess::delStrAfterKeyWord"]);#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." try process newRR with \$ORIGIN end".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$delStrAfterKeyWord;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#如果異常if($delStrAfterKeyWord["status"]==="false"){#設置執行異常$result["status"]="false";#設置執行錯誤$result["error"]=$delStrAfterKeyWord;#回傳結果return $result;}#if end#如果有找到 $ORIGIN 結尾if($delStrAfterKeyWord["founded"]==="true"){#更新 query$conf["add"][$nri]["query"]=$newRR["query"]=$delStrAfterKeyWord["content"];#如果$newRR["query"] 變成 ""if(empty($newRR["query"])){#變成 zone domain,亦即 $result["domain"]$conf["add"][$nri]["query"]=$newRR["query"]="@";}#if end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." new newRR:".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$conf["add"][$nri];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end}#if end#如果新的 query 為 "." 結尾#函式說明:#將字串特定關鍵字與其後面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#$result["deleted"],被移除的內容.#$result["argu"],使用的參數.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$newRR["query"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=".";#可省略參數:#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].#$conf["deleteLastRepeatedOne"]="";#參考資料:#無.#備註:#無.$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);unset($conf["stringProcess::delStrAfterKeyWord"]);#如果異常if($delStrAfterKeyWord["status"]==="false"){#設置執行異常$result["status"]="false";#設置執行錯誤$result["error"]=$delStrAfterKeyWord;#回傳結果return $result;}#if end#如果有找到 "." 結尾if($delStrAfterKeyWord["founded"]==="true"){#更新 query$conf["add"][$nri]["query"]=$newRR["query"]=$delStrAfterKeyWord["content"];#如果 $newRR["query"] 變成 ""if(empty($newRR["query"])){#變成 zone domain,亦即 $result["domain"]$conf["add"][$nri]["query"]=$newRR["query"]="@";}#if end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." new newRR:".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$conf["add"][$nri];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end}#if end#如果新 RR 的 type 不是 A 且 value 不為 "." 結尾.if( $newRR["type"]!=="A" && $newRR["value"][strlen($newRR["value"])-1]!=="." ){#new RR add dot to value end.$conf["add"][$nri]["value"]=$newRR["value"]=$newRR["value"].".";#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." new newRR:".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$conf["add"][$nri];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end}#if end#針對 zone file 中既有的每個RR記錄foreach($result["content"] as $index => $oldRR){#如果既有的跟新的RR都為 $ORIGINif($oldRR["type"]==="\$ORIGIN" && $newRR["type"]==="\$ORIGIN"){#取代既有的 RR$result["content"][$index]=$newRR;#換看下一筆newRRcontinue 2;}#if end#如果既有的跟新的RR都為 $TTLif($oldRR["type"]==="\$TTL" && $newRR["type"]==="\$TTL"){#取代既有的 RR$result["content"][$index]=$newRR;#換看下一筆newRRcontinue 2;}#if end#如果新舊資料都有query資訊if( isset($newRR["query"]) && isset($oldRR["query"]) ){#如果跟既有的 query、type、value 有相同if($newRR["query"]===$oldRR["query"] && $newRR["type"]===$oldRR["type"] && $newRR["value"]===$oldRR["value"] ){#如果新 RR 有 update timeif(isset($newRR["update"])){#如果新舊 update time 不相同if( $newRR["update"] !== $oldRR["update"] ){#取代既有的 RR$result["content"][$index]=$newRR;#換看下一筆newRRcontinue 2;}#if end}#if end#反之既有的 update time 若跟 global TTL 不一樣else if( $oldRR["update"] !== $result["defaultTTL"] ){#更新為 global TTL$result["content"][$index]["update"]=$result["defaultTTL"];}#if end#如果新 RR 有 commentif( isset($newRR["comment"]) ){#更新既有 RR 的 comment$result["content"][$index]["comment"]=$newRR["comment"];#換看下一筆newRRcontinue 2;}#if end#反之,如果有既有 commentelse if(isset($result["content"][$index]["comment"])){#移除既有 commentunset($result["content"][$index]["comment"]);#換看下一筆newRRcontinue 2;}#else end}#if end}#if end}#foreach end#儲存確定要新增的RR$result["content"][]=$newRR;}#foreach end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." total RR record count:".count($result["content"])." list:".PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#如果要debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]=$result["content"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#初始化要寫入的內容$strs2write=array();#針對每個RR記錄foreach($result["content"] as $RR){#初始化暫存要寫入的行內容$str2write="";#如果是if( $RR["type"]==="\$ORIGIN" || $RR["type"]==="\$TTL" ){#組合變數名稱與數值$str2write=$str2write.$RR["type"]."\t".$RR["value"];}#if end#反之else{#加上查詢的字句$str2write=$str2write.$RR["query"];#如果該筆RR有指定update time該ZONE具備 global TTL.if(isset($RR["update"])){#如果 該ZONE具備 global TTL.if(isset($result["defaultTTL"])){#如果該筆 RR 的 update time 不等於 global TTLif($RR["update"]!==$result["defaultTTL"]){#加上TTL的字句$str2write=$str2write."\t".$RR["update"];}#if end}#if end#反之else{#加上TTL的字句$str2write=$str2write."\t".$RR["update"];}#else end}#if end#反之且該ZONE不具備 global TTL.else if(!isset($result["defaultTTL"])){#加上global TTL的字句$str2write=$str2write."\t".$result["defaultTTL"];}#if end#加上IN跟TYPE跟value$str2write=$str2write."\tIN\t".$RR["type"]."\t".$RR["value"];}#else end#如果有註解if(isset($RR["comment"])){#加上comment$str2write=$str2write.";".$RR["comment"];}#if end#如果要 debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." build RR record:".$str2write.PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#加上要寫入的元素$strs2write[]=$str2write;}#foreach end#如果有逐行註解if(count($result["comment"])>0){#加到結尾#函式說明:#將多個一維陣列串聯起來,key從0開始排序.#回傳的結果:#$result["status"],"true"表執行正常,"false"代表執行不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["content"],合併好的一維陣列.#必填參數#$conf["inputArray"],陣列,要合併的一維陣列變數,例如:=array($array1,$array2);$conf["arrays::mergeArray"]["inputArray"]=array($strs2write,$result["comment"]);#可省略參數:#$conf["allowRepeat"],字串,預設為"true",允許重複的結果;若為"false"則不會出現重複的元素內容.#$conf["allowRepeat"]="true";#$conf["looseDiff"],字串,預設為"false",代表要嚴謹判斷為有相異,例如陣列中元素的key順序不同(整數)就代表有相異;反之為"true",例如陣列中元素的key順序不同(非整數),但value有相同,則視為無相異.#$conf["looseDiff"]="false";#參考資料:#無.#備註:#無.$mergeArray=arrays::mergeArray($conf["arrays::mergeArray"]);unset($conf["arrays::mergeArray"]);#如果執行異常if($mergeArray["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$mergeArray;#回傳結果return $result;}#if end#取得合併好的陣列$strs2write=$mergeArray["content"];}#if end#如果要 debugif($conf["debug"]==="true"){#函式說明:#撰寫log#回傳結果:#$result["status"],狀態,"true"或"false".#$result["error"],錯誤訊息陣列.#$result["function"],當前函式的名稱.#$result["argu"],使用的參數.#$result["content"],要寫入log的內容字串.#必填參數:#$conf["path"],字串,log檔案的路徑與名稱.$conf["logs::record"]["path"]="/tmp/zerossl::".__FUNCTION__;#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.$conf["logs::record"]["content"]="lineNo:".__LINE__." total line to write:".count($strs2write).PHP_EOL;#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["logs::record"]["fileArgu"]=__FILE__;#可省略參數:#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.#$conf["rewrite"]="false";#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.#$conf["returnOnly"]="true";#參考資料:#無.#備註:#無.$record=logs::record($conf["logs::record"]);unset($conf["logs::record"]);}#if end#儲存新zone file每行的內容$result["newZoneFileContent"]=$strs2write;#如果要寫入ZONE檔案if($conf["writeNow"]==="true"){#覆寫 ZONE file#函式說明:#更新檔案的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["content"],更新的資訊.#$result["content"][$lineIndex]["ori"],原始 $lineIndex+1 行的內容,若為null則代表不存在.#$result["content"][$lineIndex]["new"],新 $lineIndex+1 行的內容,若為null則代表不存在.#必填參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["fileAccess::updateFile"]["fileArgu"]=__FILE__;#$conf["file"],字串,要更新的檔案位置與名稱.$conf["fileAccess::updateFile"]["file"]=$conf["dnsRecordFile"];#可省略參數:#$conf["overWriteWith"],字串陣列,要置換成什麼樣的內容,每個元素代表一行內容.$conf["fileAccess::updateFile"]["overWriteWith"]=$strs2write;#$conf["replaceWith"],字串陣列,要將什麼內容置換成什麼內容.#$conf["replaceWith"]=array(array("ori content","new content"),array("ori content","new content"),...);#$conf["replaceLike"],字串,預設為"false",代表要完全符合關鍵字才能進行整行替換;反之為"true".#$conf["replaceLike"]="false";#$conf["addToTailWhenNoMatch"],字串,預設為"false"不做事;若為"true",則代表若使用 "replaceWith" 參數但沒有符合條件的內容出現,則新增到檔案的尾端.#$conf["addToTailWhenNoMatch"]="false";#$conf["addToTailBeforeThat"],字串,當 "replaceWith" 參數有使用,且 "addToTailWhenNoMatch" 為 "true" 時,若有使用該參數,則會從尾端尋找符合條件的行內容,然後將 沒有符合 "replaceWith" 條件的內容新增在此之前.#$conf["addToTailBeforeThat"]="?\>";#$conf["replaceSpecifyLine"],字串陣列,將指定的行取代成指定的內容,元素的key為原始檔案的行索引,若key為$i+1,則代表第$i行;元素的數值就為該行的新內容.#$conf["replaceSpecifyLine"]=array();#$conf["outputPath"],字串,檔案要輸出到哪個位置,預設不指定,直接取代原始檔案的內容.#$conf["outputPath"]="";#參考資料:#無.#備註:#無.$updateFile=fileAccess::updateFile($conf["fileAccess::updateFile"]);unset($conf["fileAccess::updateFile"]);#如果執行異常if($updateFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$updateFile;#回傳結果return $result;}#if end}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function updateDnsRecordFile end/*#函式說明:#請求驗證已經透過zerossl::createCertificate要求的domain.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["id"]="";#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#參考資料:#https://zerossl.com/documentation/api/verify-domains/#備註:#無.*/public static function verifyDomain(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"]);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#要傳送的 key -> value$postArray=array();#設置要簽署的domain$postArray["validation_method"]="CNAME_CSR_HASH";#設置要傳送的 json$postJson=json_encode($postArray);#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/".$conf["id"]."/challenges?access_key=".$conf["key"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#解析json$jsonRes=json_decode($result["content"]);#如果沒有 statusif(!isset($jsonRes->status)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#如果是 "pending_validation"if($json->status==="pending_validation"){#do nothing}#if end#反之如果為 "issued"else if($json->status==="issued"){#do nothing}#else#反之else{#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#else end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function verifyDomain end/*#函式說明:#取得CSR在zerossl上的狀態#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["cerStatus"],csr在zerossl上的狀態,"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["id"]="";#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#參考資料:#https://zerossl.com/documentation/api/get-certificate/#備註:#無.*/public static function getCertSta(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"]);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/".$conf["id"]."?access_key=".$conf["key"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#解析json$jsonRes=json_decode($result["content"]);#如果沒有 statusif(!isset($jsonRes->status)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#取得csr在zerossl上的狀態$result["cerStatus"]=$jsonRes->status;#設置執行正常$result["status"]="true";#回傳結果return $result;}#function getCertSta end/*#函式說明:#取得在zerossl上的CSR清單#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["tCount"],總共的資料筆數.#$result["count"],該頁的筆數.#$result["page"],當前的頁碼.#$result["certs"],陣列,certificates清單,key為certificate的id.#$result["certs"][$cerId]["cname"],該certificate主要包含的 domain name.#$result["certs"][$cerId]["anames"],該certificate額外包含的 domain name.#$result["certs"][$cerId]["expiresYMD"],該certificate最後有效年月日,格式為"2020-07-28 00:00:00".#$result["certs"][$cerId]["expiresIn"],該certificate距離系統時間還有多少秒數就過期.#$result["certs"][$cerId]["status"],該certificate憑證的狀態,可能的數值有:"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.#必填參數:#無#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#$conf["cerStatus"],字串,需要取得的certificate狀態,預設為全部,若要多個狀態,可用","區隔,可以用的狀態有"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.#$conf["cerStatus"]="";#$conf["cerType"],字串,需要取得的certificate類型,預設為不篩選,可以用的類型有"single90Days"代表單一domain90天效期的;"wildcard90Days"代表所有子網域90效期的;”multiDomain90Days“多個domain90天效期的;"single1Year"單一domain一年效期的;"wildcard1Year"所有子網域一年效期的;"multiDomain1Year"多個網域一年效期的;"acme90Days"透過acme取得的90天效期.#$conf["cerType"]="";#$conf["search"],字串,透過certificate包含的domain來搜尋.#$conf["search"]="";#$conf["limit"],字串,一頁要多少筆,預設為100筆.#$conf["limit"]="";#$conf["page"],字串,要第幾頁的資料,預設為第一頁.#$conf["page"]="";#參考資料:#https://zerossl.com/documentation/api/list-certificates/#備註:#無.*/public static function getCertList(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key","cerStatus","cerType","search","limit","page");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string","string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"],null,null,null,null,null);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#預設網址$url="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/?access_key=".$conf["key"];#如果有設置 cerStatusif(isset($conf["cerStatus"])){#設置 certificate_status$url=$url."?certificate_status=".urlencode($conf["cerStatus"]);}#if end#如果有設置 cerTypeif(isset($conf["cerType"])){#設置 certificate_type$url=$url."?certificate_type=".$conf["cerType"];}#if end#如果有設置 searchif(isset($conf["search"])){#設置 search$url=$url."?search=".urlencode($conf["search"]);}#if end#如果有設置 limitif(isset($conf["limit"])){#設置 search$url=$url."?limit=".$conf["limit"];}#if end#如果有設置 pageif(isset($conf["page"])){#設置 search$url=$url."?page=".$conf["page"];}#if end#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$url;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];/* json response 範例{"total_count": 11,"result_count": 10,"page": 1,"limit": 10,"acmeUsageLevel": "LOW","isAcmeLocked": false,"results":[{"id": "a856a39a1c3ad0s8asa606g37667d221","type": "1","common_name": "domain.com","additional_domains": "www.domain.com","created": "2020-04-29 09:04:19","expires": "2020-07-28 00:00:00","status": "draft","validation_type": null,"validation_emails": null,"replacement_for": "","fingerprint_sha1": null,"brand_validation": null,"signature_algorithm_properties": "sha384WithRSAEncryption:2048","validation":{"email_validation":{"domain.com":["admin@domain.com","administrator@domain.com","hostmaster@domain.com","postmaster@domain.com","webmaster@domain.com"]},"other_methods":{"domain.com":{"file_validation_url_http": "http://domain.com/.well-known/pki-validation/2449B.txt","file_validation_url_https": "https://domain.com/.well-known/pki-validation/2449B.txt","file_validation_content":["2B449B722B449B729394793947","comodoca.com","4bad7360c7076ba"],"cname_validation_p1": "2B449B7293947.domain.com","cname_validation_p2": "2B449B7293947.23DD7293947.11DD7293941.ca.com"},"www.domain.com":{"file_validation_url_http": "http://www.domain.com/.well-known/pki-validation/2449B.txt","file_validation_url_https": "https://www.domain.com/.well-known/pki-validation/2449B.txt","file_validation_content":["2B449B722B449B729394793947","comodoca.com","4bad7360c7076ba"],"cname_validation_p1": "2B449B7293947.www.domain.com","cname_validation_p2": "2B449B7293947.23DD7293947.11DD7293941.ca.com"}}}},{...}]}*/#解析json$jsonRes=json_decode($result["content"]);#總共的資料筆數$result["tCount"]=$jsonRes->total_count;#取得該頁的筆數$result["count"]=$jsonRes->result_count;#取得certificate清單$cers=$jsonRes->results;#針對每個certificateforeach($certs as $index => $cert){#初始化暫存的陣列$tmpA=array();#儲存 cert id#$tmpA["id"]=$cert->id;#儲存 主要包含的 domain name$tmpA["cname"]=$cert->common_name;#儲存額外包含的 domain name$tmpA["anames"]=$cert->additional_domains;#最後有效年月日,格式為"2020-07-28 00:00:00".$tmpA["expiresYMD"]=$cert->expires;#產生對於當前系統時間的差距(秒數)#函式說明:#計算時間點距離1970/01/01多少秒,亦即unixtime.#回傳結果:#$result["stauts"],執行是否成功,"true"代表執行成功;"false"代表執行失敗.#$result["error"],錯誤訊息陣列.#$result["content"],時間點距離1970/01/01的多少秒.#$result["argu"],使用的參數.#$result["unixtime"],執行本函式時的unixtime.#$result["oriDateAndTime"],原始輸入的內容,若replace0參數為"true",才會有該回傳內容.#必填參數:#$conf["dateAndTime"],字串,格式爲 2011-05-27 23:59:59.$conf["time::caculateTimeAmount"]["dateAndTime"]=$tmpA["expiresYMD"];#可省略參數:#$conf["UTC"],字串,是否要用當前時區的設定去換算成unixtime,預設為"false",代表不要;反之為"true".#$conf["UTC"]="false";#$conf["replace0"],字串,是否要將連續為0的內容替換成當下時間,預設為"true"代表要;反之為"false".$conf["time::caculateTimeAmount"]["replace0"]="false";#參考資料:#無.#備註:#無.$caculateTimeAmount=time::caculateTimeAmount($conf["time::caculateTimeAmount"]);unset($conf["time::caculateTimeAmount"]);#如果執行異常if($caculateTimeAmount["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$caculateTimeAmount;#回傳結果return $result;}#if end#儲存還要多少秒要過期$tmpA["expiresIn"]=$caculateTimeAmount["unixtime"]-time();#憑證的狀態$tmpA["status"]=$cert->status;#儲存要回傳的 cers 清單,key為cert的id.$result["cers"][$cert->id]=$tmpA;}#foreach end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function getCertList end/*#函式說明:#下載certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["certificate.crt"],字串,certificate.crt的內容.#$result["ca_bundle.crt"],字串,ca_bundle.crt的內容.#必填參數:#無.#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#$conf["id"],字串,zerossl::createCertificate回傳的id,透過id來下載單一憑證.#$conf["id"]="";#$conf["cname"],字串,主要的domain,透過common name來取得符合的憑證.#$conf["cname"]="";#參考資料:#https://zerossl.com/documentation/api/download-certificate-inline/#備註:#無.*/public static function getCert(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key","id","cname");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"],null,null);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果有設置 idif(isset($conf["id"])){#設置 id$id=$conf["id"];}#if end#反之如果有設置 cnameelse if(isset($conf["cname"])){#函式說明:#取得在zerossl上的CSR清單#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["tCound"],總共的資料筆數.#$result["count"],該頁的筆數.#$result["page"],當前的頁碼.#$result["certs"],陣列,certificates清單,key為certificate的id.#$result["certs"][$cerId]["cname"],該certificate主要包含的 domain name.#$result["certs"][$cerId]["anames"],該certificate額外包含的 domain name.#$result["certs"][$cerId]["expiresYMD"],該certificate最後有效年月日.#$result["certs"][$cerId]["status"],該certificate憑證的狀態,可能的數值有:"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.#必填參數:#無#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#$conf["cerStatus"],字串,需要取得的certificate狀態,預設為全部,若要多個狀態,可用","區隔,可以用的狀態有"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.$conf["zerossl::getCertList"]["cerStatus"]="issued";#$conf["cerType"],字串,需要取得的certificate類型,預設為不篩選,可以用的類型有"single90Days"代表單一domain90天效期的;"wildcard90Days"代表所有子網域90效期的;”multiDomain90Days“多個domain90天效期的;"single1Year"單一domain一年效期的;"wildcard1Year"所有子網域一年效期的;"multiDomain1Year"多個網域一年效期的;"acme90Days"透過acme取得的90天效期.#$conf["cerType"]="";#$conf["search"],字串,透過certificate包含的domain來搜尋.$conf["zerossl::getCertList"]["search"]=$conf["cname"];#$conf["limit"],字串,一頁要多少筆,預設為100筆.#$conf["limit"]="";#$conf["page"],字串,要第幾頁的資料,預設為第一頁.#$conf["page"]="";#參考資料:#https://zerossl.com/documentation/api/get-certificate/#備註:#無.$getCertList=zerossl::getCertList($conf["zerossl::getCertList"]);unset($conf["zerossl::getCertList"]);#如果檢查失敗if($getCertList["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCertList;#回傳結果return $result;}#if end#如果資料筆數大於0if($getCertList["count"]>0){#取得第一筆foreach($getCertList["certs"] as $cerId => $detail){#取得cettificate id$id=$cerId;}#foreach end}#if end}#if end#預設網址$url="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/".$id."/download/return?access_key=".$conf["key"];#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$url;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#取得 json$json=json_decode($curlCmd["fullContent"]);#取得certificate.crt的內容$result["certificate.crt"]=$json->certificate.crt;#取得ca_bundle.crt的內容$result["ca_bundle.crt"]=$json->ca_bundle.crt;#設置執行正常$result["status"]="true";#回傳結果return $result;}#function getCert end/*#函式說明:#請求廢除 issued zerossl certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["id"]="";#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#$conf["reason"],字串,廢除該certificate的原因,可以設置的原因有"keyCompromise",ssl private key 泄漏了;"affiliationChanged",憑證的使用對象變更了;"Superseded",已經有可以替換的憑證了;"cessationOfOperation",domain name已經換擁有着.#$conf["reason"]="";#參考資料:#https://zerossl.com/documentation/api/revoke-certificate/#備註:#無.*/public static function revokeCert(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key","reason");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","status");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"],null);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#url to call$url="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/".$conf["id"]."/revoke?access_key=".$conf["key"];#如果有設置 reasonif(isset($conf["reason"])){#設置reason$reason="&reason=".$conf["reason"];#串接reason$url=$url.$reason;}#if end#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$url;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#解析json$jsonRes=json_decode($result["content"]);#如果沒有要有的attrif(!isset($jsonRes->success)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#如果 success 不等於 1if($jsonRes->success!==1){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function revokeCert end/*#函式說明:#請求取消 draft or unvalidated zerossl certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["id"]="";#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#參考資料:#https://zerossl.com/documentation/api/revoke-certificate/#備註:#無.*/public static function cancelCert(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"]);#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#url to call$url="https://".$conf["apiDomain"].self::getApiInfo()["csrPath"]."/".$conf["id"]."/cancel?access_key=".$conf["key"];#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$url;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["catchWebContent::curlCmd"]["header"]=array("content-type: application/json");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["catchWebContent::curlCmd"]["rawPost"]=$postJson;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["catchWebContent::curlCmd"]["urlEncode"]="true";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".#$conf["inBg"]="true";#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.#$conf["bgInProc"]="false";#參考資料:#無.#備註:#無.$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果異常if($curlCmd["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置curl的詳細資訊$result["curl_verbose_info"]=$curlCmd;#驗證結果是否為 json$json_validate=json_validate($curlCmd["fullContent"]);#如果回應不是 jsonif(!$json_validate){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置json string結果$result["content"]=$curlCmd["fullContent"];#解析json$jsonRes=json_decode($result["content"]);#如果沒有要有的attrif(!isset($jsonRes->success)){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#如果 success 不等於 1if($jsonRes->success!==1){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function cancelCert end/*#函式說明:#透過zerossl api確保ssl沒有過期.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#必填參數:#$conf["cName"],陣列,每個ssl的common domain name.$conf["cName"]=array();#$conf["certInfo"],陣列,每個cName參數對應的憑證資訊,$conf["certInfo"][$i]["certPath"]為第$+1個cName的certifate.crt的檔案位置與名稱;$conf["certInfo"][$i]["pKey"]為第$i+1個cName的private key;$conf["certInfo"][$i]["caPath"]為第$i+1個cName的ca_bundle.crt的檔案位置與名稱;$conf["certInfo"][$i]["certWithCaPath"]為第$+1個cName的certifate.crt跟ca_bundle.crt內容合併後的檔案位置與名稱.$conf["certInfo"]=array();#$conf["rrFile"],陣列,每個cName參數對應的RR檔案路徑與名稱.$conf["rrFile"]=array();#$conf["dnsSerAddr"],陣列,每個cName參數對應的dns server位置,亦即ip或dns,用於透過root@dnsSerAddr將dns server重新啟動.$conf["dnsSerAddr"]=array();#$conf["actionAfterUpdateCert"],陣列,每個元素代表對應cName所屬的憑證更新後要執行的指令,例如重新啟動apache(array("systemctl","restart","httpd").若要執行多個指令,用陣列表示即可,例如重新啟動apache跟qbpwcf-wss(array(array("systemctl","restart","httpd"),array("podman","restart","qbpwcf-wss")).$conf["actionAfterUpdateCert"]=array();#可省略參數:#$conf["debug"],字串,"true"代表要啟用debug模式;反之預設為"false"不啟用.#$conf["debug"]="";#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].#$conf["apiDomain"]=self::getApiInfo()["doamin"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].#$conf["key"]=self::getApiInfo()["apiKey"];#$conf["debug"],字串,是否要開啟debug模式,"true"代表要;反之為預設"false"代表不要.#$conf["debug"]="";#$conf["addOnProcessFunc"],陣列,收到訊息後,要依順執行的函式,預設為array("\qbpwcf\zerosll::sslUpdater_cmd").#$conf["addOnProcessFunc"]=array();#$conf["funcToRunWhenIdle"],陣列,閒置時要依序執行的函式,預設為array("/qbpwcf/zerossl::sslUpdater_idle");#$conf["funcToRunWhenIdle"]=array();#參考資料:#無.#備註:#無.*/public static function sslUpdater(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("cName","certInfo","rrFile","dnsSerAddr","actionAfterUpdateCert");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","array","array","array","array");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("debug","apiDomain","key","debug");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("debug","apiDomain","key","debug","addOnProcessFunc","funcToRunWhenIdle");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","array","array");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false",self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"],"false",array("/qbpwcf/zerossl::sslUpdater_cmd"),array("/qbpwcf/zerossl::sslUpdater_idle"));#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("cName","certInfo","rrFile","dnsSerAddr","actionAfterUpdateCert");#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#取得key$share["key"]=$conf["key"];#取得apiDomain$share["apiDomain"]=$conf["apiDomain"];#設置debug flag$share["debug"]=$conf["debug"];#初始化給予 addOnProcessFunc 跟 funcToRunWhenIdle 函式的 info 參數.$share["certInfo"]=array();#針對每個 domainforeach($conf["cName"] as $index=>$cName ){#如果沒有對應的certInfoif(!isset($conf["certInfo"][$index])){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"][]="missing certInfo";#設置錯誤訊息$result["error"][]=$checkArguments;#回傳結果return $result;}#if end#檢查 certInfoforeach($certInfo[$index] as $cInfo){#如果沒有設定 certPathif(!isset($cInfo["certPath"])){#初始化為 ${cName}-cerfificate.crt$cInfo["certPath"]=$conf["cName"][$index]."-certificate.crt";}#if end#如果沒有設定 pKeyif(!isset($cInfo["pKey"])){#初始化為 ${cName}-private.key$cInfo["pKey"]=$conf["cName"][$index]."-private.key";}#if end#如果沒有設定 caPathif(!isset($cInfo["caPath"])){#初始化為 ${cName}-ca_bundle.crt"$cInfo["caPath"]=$conf["cName"][$index]."-ca_bundle.crt";}#if end#如果沒有設定 certWithCaPathif(!isset($cInfo["certWithCaPath"])){#初始化為 ${cName}-certWithCaPath.crt"$cInfo["certWithCaPath"]=$conf["cName"][$index]."-certWithCaPath.crt";}#if end#儲存 cName$cInfo["cName"]=$cName;#儲存 RR 檔案的路徑與名稱$cInfo["rrFile"]=$conf["rrFile"][$index];#儲存 cName 對應的 dns server addr$cInfo["dnsSerAddr"]=$conf["dnsSerAddr"][$index];#儲存 cName 的憑證更新後要做的事情.$cInfo["actionAfterUpdateCert"]=$conf["actionAfterUpdateCert"][$index];#儲存 certInfo$share["certInfo"][]=$cInfo;}#foreach end}#foreach end#如果為空if(empty($share["certInfo"])){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"][]="certInfo 參數有缺";#設置錯誤訊息$result["error"][]=$checkArguments;#回傳結果return $result;}#if end#函式說明:#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.#回傳結果:#$result["status"],"true"代表執行正常;"false"代表執行不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["serverCache"],函式結束前,儲存在serverCache的內容,若有元素"exit"存在則代表是正常結束.#$result["serverCache"]["serverSide"],server side 的 cache.#$result["serverCache"]["serverSide"]["procs"], server side 的 procs cache,儲存執行的子程序資訊.#$result["serverCache"]["clientSide"],client site 的 cache.#必填參數:#$conf["sock"],字串,socket檔案要放在哪邊,名稱為何.$conf["sock::unixDomainSockServer"]["sock"]=$unixSocket;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["sock::unixDomainSockServer"]["fileArgu"]=__FILE__;#可省略參數:#$conf["changeOwner"],字串,要將socket檔案的擁有着權限進行修改."user.group"代表擁有者帳號為user,群組為group.$conf["sock::unixDomainSockServer"]["changeOwner"]=webUser.".".webUser;#$conf["changePermission"],字串,要將socket檔案的權限設為多少.ex: "0666"(所有帳戶都有存取的權限) 或 "0660"(僅有擁有者與群組帳戶有存取的權限) 或 "0600"(只有擁有者有權限執行).$conf["sock::unixDomainSockServer"]["changePermission"]="0770";#$conf["sessionTimeout"],字串,當連線結束後於下一次連線間隔多久就算session timeout,server端會將記錄移除,client端需要重新拿取id,預設為300秒.#$conf["sessionTimeout"]="300";#$conf["addOnProcessFunc"],字串陣列,增加用於處理 json request 的函式名稱,給予的參數為array("request"=>收到的json訊息,"sock"=>用戶的socket,"clientCache"=>給予所有用戶的cache),若收到的不是json而是"quit"則代表用戶要結束連線;若收到的是$shutdownStr則代表要結束本函式.回傳的內容必須為陣列,例如 $res["continue"]="true"代表要繼續執行下一個addOnProcessFunc;"false"代表代表到此為止. $res["content"]="replaced content";代表要將收到的訊息取代成"replaced content". 最少要有回傳 $res["status"]數值"true"代表執行正常;"false"代表執行不正常.$conf["sock::unixDomainSockServer"]["addOnProcessFunc"]=array("/qbpwcf/zerossl::sslUpdater_cmd");#$conf["funcToRunWhenIdle"],字串陣列,當沒有事件產生時,要執行的函式名稱,給予參數為array("client"=>所有用戶,"clientCache"=>$result["serverCache"]["clientSide"]["addOnProcessFunc"][$funcToRunWhenIdle],"serverCache"=>$result["serverCache"]["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]).$conf["sock::unixDomainSockServer"]["funcToRunWhenIdle"]=array("/qbpwcf/zerossl::sslUpdater_idle");#$conf["paramsForFuncToRunWhenIdle"],2維陣列,每個元素代表指定給予funcToRunWhenIdle參數中的指定元素的參數.#$conf["paramsForFuncToRunWhenIdle"]=array();#$conf["infoToFunction"],陣列,需要增加給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.$conf["sock::unixDomainSockServer"]["infoToFunction"]=array("debug"=>$conf["debug"],"share"=>$share);#$conf["shutdownStrAddr"],字串,儲存收到用戶傳什麼樣的字串會結束本函式的檔案位置與名稱,預設為 $conf["sock"].".shutdown".#$conf["shutdownStrAddr"]="";#參考資料:#http://php.net/manual/en/function.stream-socket-server.php#備註:#無.$unixDomainSockServer=sock::unixDomainSockServer($conf["sock::unixDomainSockServer"]);unset($conf["sock::unixDomainSockServer"]);#執行異常if($unixDomainSockServer["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$unixDomainSockServer;#回傳結果return $result;}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function sslUpdater end/*#函式說明:#funcion sslUpdater 於收到訊息時要做的事情.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],字串,代表收到的訊息要變更成該變數內容.#$result["continue"],字串,代表是否要繼續執行addOnProcessFunc,"true"代表要;反之為"false"代表不要.#必填參數:#$conf["request"],字串,收到的json訊息.$conf["request"]="";#$conf["sock"],resource,用戶的socket.$conf["sock"]="";#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#$conf["info"],陣列,給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.$conf["info"]=array();#可省略參數:#無.#參考資料:#無.#備註:#建構中...*/public static function sslUpdater_cmd(&$conf){#debugvar_dump($conf);}#function sslUpdater_cmd end/*#函式說明:#funcion sslUpdater 於閒置時要做的事情#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],字串,代表收到的訊息要變更成該變數內容.#$result["continue"],字串,代表是否要繼續執行addOnProcessFunc,"true"代表要;反之為"false"代表不要.#$result["serverCache"]["clientSide"]["addOnProcessFunc"][$funcToRunWhenIdle],"clientCache".#$result["serverCache"]["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle],"serverCache".#必填參數:#$conf["client"],陣列,所有用戶的資訊.$conf["client"]=array();#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#$conf["serverCache"],陣列,server的cache,包含可以存取client的cache.$conf["serverCache"]=array();#$conf["info"],陣列,給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.$conf["info"]=array();#可省略參數:#無.#參考資料:#無.#備註:#建構中...*/public static function sslUpdater_idle(&$conf){#初始化要回傳的結果$result=array();#設置當其函數名稱$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("client","clientCache","serverCache","info");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object");$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","array","array","array");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("apiDomain","key","debug","addOnProcessFunc","funcToRunWhenIdle");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array","array");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(self::getApiInfo()["apiDomain"],self::getApiInfo()["apiKey"],"false",array("/qbpwcf/zerossl::sslUpdater_cmd"),array("/qbpwcf/zerossl::sslUpdater_idle"));#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkArguments["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#預設不開啟 debug flag$debug=false;#如果有設置 debug 為 "true"if($info["share"]["debug"]==="true"){#設置 debug flag$debug=true;}#if end#另存 server cache 的參考$serverCache=&$conf["serverCache"];#針對每個 domain nameforeach($info["share"]["certInfo"] as $cInfo){#取得domain name$cName=$cInfo["cName"];#如果尚無對應domain name的記錄if(!isset($serverCache[$cName])){#設置最新一次檢測的unixtime$serverCache[$cName]["lastCheckUnixTime"]=time();}#if end#反之距離上次檢查不滿一天else if(time()-$serverCache[$cName]["lastCheckUnixTime"]<86400){#跳過該 domain name 的檢查continue;}#if end#if enable debugif($debug){#debug msgecho "Checking domain name(".$cInfo["apiDomain"].") on zerossl...".PHP_EOL;}#if end#嘗試取得 domain name 對應的可用憑證#函式說明:#取得在zerossl上的CSR清單#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["tCount"],總共的資料筆數.#$result["count"],該頁的筆數.#$result["page"],當前的頁碼.#$result["certs"],陣列,certificates清單,key為certificate的id.#$result["certs"][$cerId]["cname"],該certificate主要包含的 domain name.#$result["certs"][$cerId]["anames"],該certificate額外包含的 domain name.#$result["certs"][$cerId]["expiresYMD"],該certificate最後有效年月日.#$result["certs"][$cerId]["status"],該certificate憑證的狀態,可能的數值有:"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.#必填參數:#無#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::getCertList"]["apiDomain"]=$cInfo["apiDomain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::getCertList"]["key"]=$cInfo["key"];#$conf["cerStatus"],字串,需要取得的certificate狀態,預設為全部,若要多個狀態,可用","區隔,可以用的狀態有"draft"代表尚未驗證;"pending_validation"代表zerossl尚在產生憑證;"issued"代表已經可以下載來使用;"revoked"代表已經廢除;"cancelled"代表已經取消且未驗證;"expired"代表已經過期.$conf["zerossl::getCertList"]["cerStatus"]="issued";#$conf["cerType"],字串,需要取得的certificate類型,預設為不篩選,可以用的類型有"single90Days"代表單一domain90天效期的;"wildcard90Days"代表所有子網域90效期的;”multiDomain90Days“多個domain90天效期的;"single1Year"單一domain一年效期的;"wildcard1Year"所有子網域一年效期的;"multiDomain1Year"多個網域一年效期的;"acme90Days"透過acme取得的90天效期.$conf["zerossl::getCertList"]["cerType"]="single90Days";#$conf["search"],字串,透過certificate包含的domain來搜尋.$conf["zerossl::getCertList"]["search"]=$cName;#$conf["limit"],字串,一頁要多少筆,預設為100筆.#$conf["limit"]="";#$conf["page"],字串,要第幾頁的資料,預設為第一頁.#$conf["page"]="";#參考資料:#https://zerossl.com/documentation/api/list-certificates/#備註:#無.$getCertList=zerossl::getCertList($conf["zerossl::getCertList"]);unset($conf["zerossl::getCertList"]);#符合條件的數量#$getCertList["tCount"];#符合條件的當頁數量#$getCertList["count"];#如果執行異常if($getCertList["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCertList;#回傳結果return $result;}#if end#如果沒有憑證if($getCertList["count"]==="0"){#if enable debugif($debug){#debug msgecho "There is not valid ssl for domain name(".$cInfo["apiDomain"].") on zerossl.".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "Checking ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#確認有無對應 cName 的 private key#函式說明:#檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$resutl["function"],當前執行的涵式名稱.#$result["argu"],使用的參數.#$result["allExist"],所有檔案皆存在的識別,"true"代表皆存在,"false"代表沒有全部都存在.#$result["varName"][$i],爲第$i個資料夾或檔案的路徑與名稱。#$result["varNameFullPath"][$i],爲第$i個資料夾或檔案的完整檔案系統路徑與名稱,如果不存在則代表路徑是網址.#$result["varNameWebPath"][$i],為第$i個資料夾或檔案的網址,若"web"參數為"true",才會有該內容.#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填參數:#$conf["fileArray"],陣列字串,要檢查是否存在的檔案有哪些,須爲一維陣列數值。$conf["fileAccess::checkMultiFileExist"]["fileArray"]=array($cInfo["pKey"]);#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::checkMultiFileExist"]["fileArgu"]=__FILE__;#可省略參數:#$conf["disableWebSearch"],"字串",是否取消「當檔案找不到時,改用catchWebContent類別的wget函數來檢查檔案是否存在於網路上」的功能,"false"不取消,若要取消該功能請設為"true",若抓到的內容為空字串則會視為檔案不存在,預設為"true".#$conf["disableWebSearch"]="false";#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,預設為"true".$conf["fileAccess::checkMultiFileExist"]["userDir"]="false";#$conf["web"],字串,檔案是放在web就是"true",反之為檔案系統"false",預設為"true".$conf["fileAccess::checkMultiFileExist"]["web"]="false";#參考資料:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php#備註:#函數file_exists檢查的路徑為檔案系統的路徑#$result["varName"][$i]結果未實作$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess::checkMultiFileExist"]);unset($conf["fileAccess::checkMultiFileExist"]);#如果運行異常if($checkMultiFileExist["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCertList;#回傳結果return $result;}#if end#如果沒有 private keyif($checkMultiFileExist["allExist"]==="false"){#if enable debugif($debug){#debug msgecho "there is no ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "creating ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#建立 private key#函式說明:#產生ssl private key.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],ssl用的private key.#必填參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["openssl::createPrivateKey"]["fileArgu"]=__FILE__;#可省略參數:#$conf["length"],整數,金鑰的長度,預設為 4096(bit).#$conf["length"]=4096';#參考資料:#無.#備註:#key generated by openssl with RSA.$createPrivateKey=openssl::createPrivateKey($conf["openssl::createPrivateKey"]);unset($conf["openssl::createPrivateKey"]);#如果運行異常if($createPrivateKey["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createPrivateKey;#回傳結果return $result;}#if end#另存private key的字串$pKeyStr=$createPrivateKey["content"];#建立private key檔案#函式說明:#將字串寫入到檔案#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["fileInfo"],實際上寫入的檔案資訊陣列.#$result["fileInfo"]["createdFileName"],建立好的檔案名稱.#$result["fileInfo"]["createdFilePath"],檔案建立的路徑.#$result["fileInfo"]["createdFilePathAndName"].建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeTextIntoFile"]["fileArgu"]=__FILE__;#可省略參數:#$conf["fileName"],字串,爲要編輯的檔案名稱,預設為隨機產生的檔案名稱.$conf["zerossl::writeTextIntoFile"]["fileName"]=$cInfo["pKey"];#$conf["inputString"],字串,爲要寫入到裏面的內容,若要每筆資料寫入後換行,則可以在字串內容後面加上 \r\n 即可,預設為"".$conf["zerossl::writeTextIntoFile"]["inputString"]=$pKeyStr;#$conf["writeMethod"],字串,爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入.#$conf["writeMethod"]="a";#$conf["checkRepeat"],字串,"true"代表建立檔案之前要先檢查檔案是否存在,若存在則在原名稱後面加上從(1)開始的編號.#$conf["checkRepeat"]="";#$conf["filenameExtensionStartPoint"],字串,檔案的副檔名是從倒數第幾個小數點(dot)開始,預設為"1",最後一個小數點,必須與$conf["checkRepeat"]搭配才會生效.#$conf["filenameExtensionStartPoint"]="";#$conf["repeatNameRule"],字串,遇到相同名稱的檔案要如何加上識別的編號,編號用「\$i」表示,預設為"(\$i)",必須與$conf["checkRepeat"]搭配才會生效.#$conf["repeatNameRule"]="";#$conf["web"],檔案是否位於網站上"true",若是在檔案系統則為"false",預設為"true".$conf["zerossl::writeTextIntoFile"]["web"]="false";#參考資料:#無.#備註:#無.$writeTextIntoFile=zerossl::writeTextIntoFile($conf["zerossl::writeTextIntoFile"]);unset($conf["zerossl::writeTextIntoFile"]);#如果運行異常if($writeTextIntoFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeTextIntoFile;#回傳結果return $result;}#if end}#if end#if enable debugif($debug){#debug msgecho "Creating domain name(".$cInfo["apiDomain"].") csr for zerossl...".PHP_EOL;}#if end#建立準備給zerossl的csr#函式說明:#產生certificate sign request(CSR).#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],csr內容.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["privateKey"], private key 的內容.#必填參數:#$conf["domain"],字串,csr內容的網域名稱.$conf["zerossl::createCSR"]["domain"]=$cName;#可省略參數:#$conf["pKey"],字串,若要使用既有的privateKey檔案,則需要提供檔案位置與名稱;反之預設為自動產生,記得要從回傳結果的"privateKey"取得其內容.#$conf["pKey"]="";#$conf["country"],字串,csr內容的國家名稱,預設為"TW".#$conf["country"]="";#$conf["state"],字串,csr內容的State名稱,預設為"Taiwan".#$conf["state"]="";#$conf["org"],字串,csr內容的組織名稱,預設為"QBPWCF".#$conf["org"]="";#$conf["unit"],字串,csr內容的組織所屬單位,預設為"RD".#$conf["unit"]="";#參考資料:#無.#備註:#無.$createCSR=zerossl::createCSR($conf["zerossl::createCSR"]);unset($conf["zerossl::createCSR"]);#如果運行異常if($createCSR["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createCSR;#回傳結果return $result;}#if end#取得本地端產生的csr內容$csrLocal=$createCSR["content"];#if enable debugif($debug){#debug msgecho "Creating certificate for domain name(".$cInfo["apiDomain"].") on zerossl...".PHP_EOL;}#if end#函式說明:#提供certificate sign request(CSR)透過zerossl產生certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["id"],用於zerossl api驗證domain的id.#$result["content"],字串,得到的json字串回應.#$result["cnameKey"],用於dns CNAME驗證鍵名.#$result["cnameVal"],用於dms CNAME驗證鍵值.#必填參數:#$conf["certificate_domains"],字串,要簽署的doamin名稱.$conf["zerossl::createCertificate"]["certificate_domains"]=$cName;#$conf["certificate_csr"],字串,簽署的資訊.$conf["zerossl::createCertificate"]["certificate_csr"]=$csrLocal;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["zerossl::createCertificate"]["fileArgu"]=__FILE__;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::createCertificate"]["apiDomain"]=$cInfo["domain"];#$conf["path"],字串,提供服務的path,預設為 self::getApiInfo()["csrPath"].#$conf["path"]=self::getApiInfo()["csrPath"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::createCertificate"]["key"]=$cInfo["key"];#參考資料:#無.#備註:#無.$createCertificate=zerossl::createCertificate($conf["zerossl::createCertificate"]);unset($conf["zerossl::createCertificate"]);#如果執行異常if($createCertificate["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createCertificate;#回傳結果return $result;}#if end#取得csr在zerossl上的id$csrId=$createCertificate["id"];#取得cname key$cNameKey=$createCertificate["cnameKey"];#取得cname val$cNameVal=$createCertificate["cnameVal"];#初始化要增加的RR記錄$rr2add=array();#設置CNAME的查詢$rr2add["query"]=$cNameKey;#設置CNAME的value$rr2add["value"]=$cNameVal;#設置類型為 CNAME$rr2add["type"]="CNAME";#設置註解$rr2add["comment"]="added by ".__NAMESPACE__."\\".__FUNCTION__;#if enable debugif($debug){#debug msgecho "Adding DNS record to validate certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#函式說明:#新增DNS記錄到檔案裡面.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],字串陣列,更新後的檔案RR(DNS記錄).#$result["domain"],字串,RR所屬domain.#$result["defaultTTL"],字串,預設的RR更新時間.#$result["comment"],字串陣列,逐行的註解.#必填參數:#$conf["add"],多維陣列,每個元素有為有三個元素的陣列,key有"query"跟"update"跟"type"跟"value"以及"comment",分別代表要查詢的數值、更新周期、類型、答案、註解.$conf["zerossl::updateDnsRecordFile"]["add"]=array($rr2ad);#$conf["dnsRecordFile"],字串,該ZONE檔案位置與名稱.$conf["zerossl::updateDnsRecordFile"]["dnsRecordFile"]=$cInfo["rrFile"];#可省略參數:#$conf["writeNow"],字串,是否要直接寫入既有ZONE檔案,預設為"false",不寫入;"true"為直接覆寫內容.$conf["zerossl::updateDnsRecordFile"]["writeNow"]="true";#$conf["debug"],字串,是否要開啟debug模式,預設為"false"不開啟;反之為"true"要開啟,會在/tmp/建立debug檔案zerossl\:\:updateDnsRecordFile.#$conf["debug"]="false";#參考資料:#無.#備註:#目前支援的DNS記錄檔案是給bind(Berkeley Internet Name Domain)套件使用的.#通常qbpwcf使用者沒有權限存取RR(dns記錄檔案),本套件是透過sshfs掛載來繞過該問題.#php-pear上的Net_DNS2也可以解析RR.$updateDnsRecordFile=zerossl::updateDnsRecordFile($conf["zerossl::updateDnsRecordFile"]);unset($conf["zerossl::updateDnsRecordFile"]);#如果執行異常if($updateDnsRecordFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$updateDnsRecordFile;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Restart DNS service to validate certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#重新啟動dns伺服器#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="systemd";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("restart","named");#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.#$conf["escapeshellarg"]="false";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.$conf["external::callShell"]["remoteIp"]=$cInfo["dnsSerAddr"];#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="root";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShell["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Request zerossl to validate certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#函式說明:#請求驗證已經透過zerossl::createCertificate要求的domain.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["zerossl::verifyDomain"]["id"]=$csrId;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::verifyDomain"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::verifyDomain"]["key"]=$cInfo["key"];#參考資料:#https://zerossl.com/documentation/api/verify-domains/#備註:#無.$verifyDomain=zerossl::verifyDomain($conf["zerossl::verifyDomain"]);unset($conf["zerossl::verifyDomain"]);#如果執行異常if($verifyDomain["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$verifyDomain;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Downloading certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#函式說明:#下載certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["certificate.crt"],字串,certificate.crt的內容.#$result["ca_bundle.crt"],字串,ca_bundle.crt的內容.#必填參數:#無.#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::getCert"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::getCert"]["key"]=$cInfo["key"];#$conf["id"],字串,zerossl::createCertificate回傳的id,透過id來下載單一憑證.$conf["zerossl::getCert"]["id"]=$csrId;#$conf["cname"],字串,主要的domain,透過common name來取得符合的憑證.#$conf["zerossl::getCert"]["cname"]="";#參考資料:#https://zerossl.com/documentation/api/download-certificate-inline/#備註:#無.$getCert=zerossl::getCert($conf["zerossl::getCert"]);unset($conf["zerossl::getCert"]);#如果執行異常if($getCert["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCert;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Creating certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#建立 certificate.crt 檔案#$cInfo["certPath"];#建立 ca_bundle.crt 檔案#$cInfo["caPath"];#建立 certAndCa.crt 檔案#$cInfo["certWithCaPath"];#建立 certificate.crt、ca_bundle.crt、certAndCa.crt 檔案#函式說明:#一次建立多個檔案,並寫入內容.#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"][i],實際上寫入的第$i+1個檔案資訊陣列.#$result["content"][i]["createdFileName"],第$i+1個建立好的檔案名稱.#$result["content"][i]["createdFilePath"],第$i+1個檔案建立的路徑.#$result["content"][i]["createdFilePathAndName"].第$i+1個建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeMultiFile"]["fileArgu"]=__FILE__;#$conf["fileName"],字串陣列,爲要寫入的多個檔案名稱$conf["zerossl::writeMultiFile"]["fileName"]=array($cInfo["certPath"],$cInfo["caPath"],$cInfo["certWithCaPath"]);#可省略參數:#$conf["inputString"],字串陣列,爲要寫入到各別檔案裏面的內容,預設每個元素為空字串.$conf["zerossl::writeMultiFile"]["inputString"]=array($getCert["certificate.crt"],$getCert["ca_bundle.crt"],$getCert["certificate.crt"].PHP_EOL.$getCert["ca_bundle.crt"]);#參考資料:#無.#備註:#無.$writeMultiFile=zerossl::writeMultiFile($conf["zerossl::writeMultiFile"]);unset($conf["zerossl::writeMultiFile"]);#如果執行異常if($writeMultiFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeMultiFile;#回傳結果return $result;}#if end#儲存 actionAfterUpdateCert$action=$cInfo["actionAfterUpdateCert"];#如果有多個指令要執行if(gettype($action[0])==="array"){#if enable debugif($debug){#debug msgecho "There are many cmds to run to apply certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "Running cmd to apply certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#針對每的指令foreach($action as $ac){#if enable debugif($debug){#debug msgecho ".".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$ac;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#foreach end}#if end#反之else{#if enable debugif($debug){#debug msgecho "There is only one cmd to run to apply certificate for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho ".".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$action;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#else end}#if end#反之else{#if enable debugif($debug){#debug msgecho "There is already valid ssl for domain name(".$cInfo["apiDomain"].") on zerossl".PHP_EOL;}#if end#有 issued 的憑證#取得 certificate id at zerossl#函式說明:#將陣列轉換成存有key與value的陣列#回傳的結果:#$result["status"],執行式否正常的識別,"true"代表執行正常,"false"代表執行不正常.#$result["function"],當前執行的函數#$result["error"],錯誤訊息.#$result[$i]["key"],原先$i+1個元素的key.#$result[$i]["value"],原先$i+1個元素的value.#必填參數:#$conf["rawInputArray"],陣列,要轉換的陣列變數.$conf["arrays::getKeyAndValue"]["rawInputArray"]=$getCertList["certs"];#可省略參數:#無.#參考資料:#無.#備註:#無.$getKeyAndValue=arrays::getKeyAndValue($conf["arrays::getKeyAndValue"]);unset($conf["arrays::getKeyAndValue"]);#如果執行異常if($getKeyAndValue["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getKeyAndValue;#回傳結果return $result;}#if end#儲存 certificate id at zerossl$csrId=$getKeyAndValue["key"][0];#檢查憑證是否已經快過期$expiresIn=$getCertList["certs"][$csrId]["expiresIn"];#如果距離當下不到2個星期就要過期if($expiresIn<=86400*14){#if enable debugif($debug){#debug msgecho "Valid ssl for domain name(".$cInfo["apiDomain"].") on zerossl will expired soon(in at least 14 days)".PHP_EOL;}#if end#另存舊的憑證id,最後要revoke之.$oldCsrId=$csrId;#if enable debugif($debug){#debug msgecho "Start requst new ssl process for domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "Finding ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#確認有無對應 cName 的 private key#函式說明:#檢查多個檔案與資料夾是否存在.#回傳的結果:#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$resutl["function"],當前執行的涵式名稱.#$result["argu"],使用的參數.#$result["allExist"],所有檔案皆存在的識別,"true"代表皆存在,"false"代表沒有全部都存在.#$result["varName"][$i],爲第$i個資料夾或檔案的路徑與名稱。#$result["varNameFullPath"][$i],爲第$i個資料夾或檔案的完整檔案系統路徑與名稱,如果不存在則代表路徑是網址.#$result["varNameWebPath"][$i],為第$i個資料夾或檔案的網址,若"web"參數為"true",才會有該內容.#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。#必填參數:#$conf["fileArray"],陣列字串,要檢查是否存在的檔案有哪些,須爲一維陣列數值。$conf["fileAccess::checkMultiFileExist"]["fileArray"]=array($cInfo["pKey"]);#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::checkMultiFileExist"]["fileArgu"]=__FILE__;#可省略參數:#$conf["disableWebSearch"],"字串",是否取消「當檔案找不到時,改用catchWebContent類別的wget函數來檢查檔案是否存在於網路上」的功能,"false"不取消,若要取消該功能請設為"true",若抓到的內容為空字串則會視為檔案不存在,預設為"true".#$conf["disableWebSearch"]="false";#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,預設為"true".$conf["fileAccess::checkMultiFileExist"]["userDir"]="false";#$conf["web"],字串,檔案是放在web就是"true",反之為檔案系統"false",預設為"true".$conf["fileAccess::checkMultiFileExist"]["web"]="false";#參考資料:#http://php.net/manual/en/function.file-exists.php#http://php.net/manual/en/control-structures.foreach.php#備註:#函數file_exists檢查的路徑為檔案系統的路徑#$result["varName"][$i]結果未實作$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess::checkMultiFileExist"]);unset($conf["fileAccess::checkMultiFileExist"]);#如果運行異常if($checkMultiFileExist["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCertList;#回傳結果return $result;}#if end#如果沒有 private keyif($checkMultiFileExist["allExist"]==="false"){#if enable debugif($debug){#debug msgecho "Thers is no ssl private key for domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "Creating ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#建立 private key#函式說明:#產生ssl private key.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],ssl用的private key.#必填參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["openssl::createPrivateKey"]["fileArgu"]=__FILE__;#可省略參數:#$conf["length"],整數,金鑰的長度,預設為 4096(bit).#$conf["length"]=4096';#參考資料:#無.#備註:#key generated by openssl with RSA.$createPrivateKey=openssl::createPrivateKey($conf["openssl::createPrivateKey"]);unset($conf["openssl::createPrivateKey"]);#如果運行異常if($createPrivateKey["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createPrivateKey;#回傳結果return $result;}#if end#另存private key的字串$pKeyStr=$createPrivateKey["content"];#if enable debugif($debug){#debug msgecho "Writing ssl private key for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#建立private key檔案#函式說明:#將字串寫入到檔案#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["fileInfo"],實際上寫入的檔案資訊陣列.#$result["fileInfo"]["createdFileName"],建立好的檔案名稱.#$result["fileInfo"]["createdFilePath"],檔案建立的路徑.#$result["fileInfo"]["createdFilePathAndName"].建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeTextIntoFile"]["fileArgu"]=__FILE__;#可省略參數:#$conf["fileName"],字串,爲要編輯的檔案名稱,預設為隨機產生的檔案名稱.$conf["zerossl::writeTextIntoFile"]["fileName"]=$cInfo["pKey"];#$conf["inputString"],字串,爲要寫入到裏面的內容,若要每筆資料寫入後換行,則可以在字串內容後面加上 \r\n 即可,預設為"".$conf["zerossl::writeTextIntoFile"]["inputString"]=$pKeyStr;#$conf["writeMethod"],字串,爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入.#$conf["writeMethod"]="a";#$conf["checkRepeat"],字串,"true"代表建立檔案之前要先檢查檔案是否存在,若存在則在原名稱後面加上從(1)開始的編號.#$conf["checkRepeat"]="";#$conf["filenameExtensionStartPoint"],字串,檔案的副檔名是從倒數第幾個小數點(dot)開始,預設為"1",最後一個小數點,必須與$conf["checkRepeat"]搭配才會生效.#$conf["filenameExtensionStartPoint"]="";#$conf["repeatNameRule"],字串,遇到相同名稱的檔案要如何加上識別的編號,編號用「\$i」表示,預設為"(\$i)",必須與$conf["checkRepeat"]搭配才會生效.#$conf["repeatNameRule"]="";#$conf["web"],檔案是否位於網站上"true",若是在檔案系統則為"false",預設為"true".$conf["zerossl::writeTextIntoFile"]["web"]="false";#參考資料:#無.#備註:#無.$writeTextIntoFile=zerossl::writeTextIntoFile($conf["zerossl::writeTextIntoFile"]);unset($conf["zerossl::writeTextIntoFile"]);#如果運行異常if($writeTextIntoFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeTextIntoFile;#回傳結果return $result;}#if end}#if end#if enable debugif($debug){#debug msgecho "Creating CSR for domain name(".$cInfo["apiDomain"].") to zerossl.".PHP_EOL;}#if end#建立準備給zerossl的csr#函式說明:#產生certificate sign request(CSR).#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],csr內容.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["privateKey"], private key 的內容.#必填參數:#$conf["domain"],字串,csr內容的網域名稱.$conf["zerossl::createCSR"]["domain"]=$cName;#可省略參數:#$conf["pKey"],字串,若要使用既有的privateKey檔案,則需要提供檔案位置與名稱;反之預設為自動產生,記得要從回傳結果的"privateKey"取得其內容.#$conf["pKey"]="";#$conf["country"],字串,csr內容的國家名稱,預設為"TW".#$conf["country"]="";#$conf["state"],字串,csr內容的State名稱,預設為"Taiwan".#$conf["state"]="";#$conf["org"],字串,csr內容的組織名稱,預設為"QBPWCF".#$conf["org"]="";#$conf["unit"],字串,csr內容的組織所屬單位,預設為"RD".#$conf["unit"]="";#參考資料:#無.#備註:#無.$createCSR=zerossl::createCSR($conf["zerossl::createCSR"]);unset($conf["zerossl::createCSR"]);#如果運行異常if($createCSR["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createCSR;#回傳結果return $result;}#if end#取得本地端產生的csr內容$csrLocal=$createCSR["content"];#if enable debugif($debug){#debug msgecho "Providing CSR for domain name(".$cInfo["apiDomain"].") to zerossl".PHP_EOL;}#if end#函式說明:#提供certificate sign request(CSR)透過zerossl產生certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["id"],用於zerossl api驗證domain的id.#$result["content"],字串,得到的json字串回應.#$result["cnameKey"],用於dns CNAME驗證鍵名.#$result["cnameVal"],用於dms CNAME驗證鍵值.#必填參數:#$conf["certificate_domains"],字串,要簽署的doamin名稱.$conf["zerossl::createCertificate"]["certificate_domains"]=$cName;#$conf["certificate_csr"],字串,簽署的資訊.$conf["zerossl::createCertificate"]["certificate_csr"]=$csrLocal;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["zerossl::createCertificate"]["fileArgu"]=__FILE__;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::createCertificate"]["apiDomain"]=$cInfo["domain"];#$conf["path"],字串,提供服務的path,預設為 self::getApiInfo()["csrPath"].#$conf["path"]=self::getApiInfo()["csrPath"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::createCertificate"]["key"]=$cInfo["key"];#參考資料:#無.#備註:#無.$createCertificate=zerossl::createCertificate($conf["zerossl::createCertificate"]);unset($conf["zerossl::createCertificate"]);#如果執行異常if($createCertificate["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$createCertificate;#回傳結果return $result;}#if end#取得csr在zerossl上的id$csrId=$createCertificate["id"];#取得cname key$cNameKey=$createCertificate["cnameKey"];#取得cname val$cNameVal=$createCertificate["cnameVal"];#初始化要增加的RR記錄$rr2add=array();#設置CNAME的查詢$rr2add["query"]=$cNameKey;#設置CNAME的value$rr2add["value"]=$cNameVal;#設置類型為 CNAME$rr2add["type"]="CNAME";#設置註解$rr2add["comment"]="added by ".__NAMESPACE__."\\".__FUNCTION__;#if enable debugif($debug){#debug msgecho "Adding DNS record to valid domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#函式說明:#新增DNS記錄到檔案裡面.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],字串陣列,更新後的檔案RR(DNS記錄).#$result["domain"],字串,RR所屬domain.#$result["defaultTTL"],字串,預設的RR更新時間.#$result["comment"],字串陣列,逐行的註解.#必填參數:#$conf["add"],多維陣列,每個元素有為有三個元素的陣列,key有"query"跟"update"跟"type"跟"value"以及"comment",分別代表要查詢的數值、更新周期、類型、答案、註解.$conf["zerossl::updateDnsRecordFile"]["add"]=array($rr2ad);#$conf["dnsRecordFile"],字串,該ZONE檔案位置與名稱.$conf["zerossl::updateDnsRecordFile"]["dnsRecordFile"]=$cInfo["rrFile"];#可省略參數:#$conf["writeNow"],字串,是否要直接寫入既有ZONE檔案,預設為"false",不寫入;"true"為直接覆寫內容.$conf["zerossl::updateDnsRecordFile"]["writeNow"]="true";#$conf["debug"],字串,是否要開啟debug模式,預設為"false"不開啟;反之為"true"要開啟,會在/tmp/建立debug檔案zerossl\:\:updateDnsRecordFile.#$conf["debug"]="false";#參考資料:#無.#備註:#目前支援的DNS記錄檔案是給bind(Berkeley Internet Name Domain)套件使用的.#通常qbpwcf使用者沒有權限存取RR(dns記錄檔案),本套件是透過sshfs掛載來繞過該問題.#php-pear上的Net_DNS2也可以解析RR.$updateDnsRecordFile=zerossl::updateDnsRecordFile($conf["zerossl::updateDnsRecordFile"]);unset($conf["zerossl::updateDnsRecordFile"]);#如果執行異常if($updateDnsRecordFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$updateDnsRecordFile;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Restarting DNS service to valid domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#重新啟動dns伺服器#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="systemd";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("restart","named");#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.#$conf["escapeshellarg"]="false";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.$conf["external::callShell"]["remoteIp"]=$cInfo["dnsSerAddr"];#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="root";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShell["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Request zerossl to valid domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#函式說明:#請求驗證已經透過zerossl::createCertificate要求的domain.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["zerossl::verifyDomain"]["id"]=$csrId;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::verifyDomain"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::verifyDomain"]["key"]=$cInfo["key"];#參考資料:#https://zerossl.com/documentation/api/verify-domains/#備註:#無.$verifyDomain=zerossl::verifyDomain($conf["zerossl::verifyDomain"]);unset($conf["zerossl::verifyDomain"]);#如果執行異常if($verifyDomain["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$verifyDomain;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Downling ssl for domain name(".$cInfo["apiDomain"].") on zerossl.".PHP_EOL;}#if end#函式說明:#下載certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["certificate.crt"],字串,certificate.crt的內容.#$result["ca_bundle.crt"],字串,ca_bundle.crt的內容.#必填參數:#無.#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::getCert"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::getCert"]["key"]=$cInfo["key"];#$conf["id"],字串,zerossl::createCertificate回傳的id,透過id來下載單一憑證.$conf["zerossl::getCert"]["id"]=$csrId;#$conf["cname"],字串,主要的domain,透過common name來取得符合的憑證.#$conf["zerossl::getCert"]["cname"]="";#參考資料:#https://zerossl.com/documentation/api/download-certificate-inline/#備註:#無.$getCert=zerossl::getCert($conf["zerossl::getCert"]);unset($conf["zerossl::getCert"]);#如果執行異常if($getCert["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCert;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Creating ssl for domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#建立 certificate.crt 檔案#$cInfo["certPath"];#建立 ca_bundle.crt 檔案#$cInfo["caPath"];#建立 certAndCa.crt 檔案#$cInfo["certWithCaPath"];#建立 certificate.crt、ca_bundle.crt、certAndCa.crt 檔案#函式說明:#一次建立多個檔案,並寫入內容.#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"][i],實際上寫入的第$i+1個檔案資訊陣列.#$result["content"][i]["createdFileName"],第$i+1個建立好的檔案名稱.#$result["content"][i]["createdFilePath"],第$i+1個檔案建立的路徑.#$result["content"][i]["createdFilePathAndName"].第$i+1個建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeMultiFile"]["fileArgu"]=__FILE__;#$conf["fileName"],字串陣列,爲要寫入的多個檔案名稱$conf["zerossl::writeMultiFile"]["fileName"]=array($cInfo["certPath"],$cInfo["caPath"],$cInfo["certWithCaPath"]);#可省略參數:#$conf["inputString"],字串陣列,爲要寫入到各別檔案裏面的內容,預設每個元素為空字串.$conf["zerossl::writeMultiFile"]["inputString"]=array($getCert["certificate.crt"],$getCert["ca_bundle.crt"],$getCert["certificate.crt"].PHP_EOL.$getCert["ca_bundle.crt"]);#參考資料:#無.#備註:#無.$writeMultiFile=zerossl::writeMultiFile($conf["zerossl::writeMultiFile"]);unset($conf["zerossl::writeMultiFile"]);#如果執行異常if($writeMultiFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeMultiFile;#回傳結果return $result;}#if end#儲存 actionAfterUpdateCert$action=$cInfo["actionAfterUpdateCert"];#如果有多個指令要執行if(gettype($action[0])==="array"){#if enable debugif($debug){#debug msgecho "There many cmd to run to valid domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#針對每的指令foreach($action as $ac){#if enable debugif($debug){#debug msgecho ".".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$ac;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#foreach end}#if end#反之else{#if enable debugif($debug){#debug msgecho "There is only one cmd to run to valid domain name(".$cInfo["apiDomain"].").".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho ".".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$action;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#else end#要移除舊的憑證#if enable debugif($debug){#debug msgecho "Removing old ssl file".PHP_EOL;}#if end#舊憑證於zerossl上的id#$oldCsrId#移除舊的憑證#函式說明:#請求廢除 issued zerossl certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#必填參數:#$conf["id"],字串,zerossl::createCertificate回傳的id.$conf["zerosssl::revokeCert"]["id"]=$oldCsrId;#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerosssl::revokeCert"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerosssl::revokeCert"]["key"]=$cInfo["key"];#$conf["reason"],字串,廢除該certificate的原因,可以設置的原因有"keyCompromise",ssl private key 泄漏了;"affiliationChanged",憑證的使用對象變更了;"Superseded",已經有可以替換的憑證了;"cessationOfOperation",domain name已經換擁有着.$conf["zerosssl::revokeCert"]["reason"]="Superseded";#參考資料:#https://zerossl.com/documentation/api/revoke-certificate/#備註:#無.$revokeCert=zerosssl::revokeCert($conf["zerosssl::revokeCert"]);unset($conf["zerosssl::revokeCert"]);#如果執行異常if($revokeCert["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$revokeCert;#回傳結果return $result;}#if end#反之,尚不需要提前申請新的憑證else{#if enable debugif($debug){#debug msgecho "ssl for domain name(".$cInfo["apiDomain"].") is valid ".PHP_EOL;}#if end#if enable debugif($debug){#debug msgecho "Downling ssl for domain name(".$cInfo["apiDomain"].") on zerossl...".PHP_EOL;}#if end#下載憑證#函式說明:#下載certificate.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["curl_verbose_info"],curl執行的詳細資訊.#$result["content"],結果json字串.#$result["certificate.crt"],字串,certificate.crt的內容.#$result["ca_bundle.crt"],字串,ca_bundle.crt的內容.#必填參數:#無.#可省略參數:#$conf["apiDomain"],字串,提供服務的domain,預設為 self::getApiInfo()["doamin"].$conf["zerossl::getCert"]["apiDomain"]=$cInfo["domain"];#$conf["key"],字串,api key,預設為 self::getApiInfo()["apiKey"].$conf["zerossl::getCert"]["key"]=$cInfo["key"];#$conf["id"],字串,zerossl::createCertificate回傳的id,透過id來下載單一憑證.$conf["zerossl::getCert"]["id"]=$csrId;#$conf["cname"],字串,主要的domain,透過common name來取得符合的憑證.#$conf["zerossl::getCert"]["cname"]="";#參考資料:#https://zerossl.com/documentation/api/download-certificate-inline/#備註:#無.$getCert=zerossl::getCert($conf["zerossl::getCert"]);unset($conf["zerossl::getCert"]);#如果執行異常if($getCert["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getCert;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Getting host ssl for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#zerossl上的certificate.crt內容#$getCert["certificate.crt"];#zerossl上的ca_bundle.crt內容#$getCert["ca_bundle.crt"];#certificate.crt and ca_bundle.crt 合併後的檔案內容#$getCert["certificate.crt"].PHP_EOL.$getCert["ca_bundle.crt"];#certificate.crt 檔案#$cInfo["certPath"];#ca_bundle.crt 檔案#$cInfo["caPath"];#certAndCa.crt 檔案#$cInfo["certWithCaPath"];#if enable debugif($debug){#debug msgecho "Getting host ssl(certificate.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#取得既有的 certificate.crt 檔案內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.#$result["error"],錯誤訊息提示.#$result["warning"],警告訊息.#$result["function"],當前執行的函數名稱.#$result["fileContent"],爲檔案的內容陣列.#$result["lineCount"],爲檔案內容總共的行數.#$result["fullContent"],為檔案的完整內容.#$result["base64dataOnly"],檔案的base64data.#$result["base64data"],為在網頁上給予src參數的數值.#$result["mimeType"],為檔案的mime type.#必填參數:#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.$conf["fileAccesss::getFileContent"]["filePositionAndName"]=$cInfo["certPath"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccesss::getFileContent"]["fileArgu"]=__FILE__;#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".#$conf["web"]="true";#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".#$conf["createIfnotExist"]="false";#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"#$conf["autoDeleteSpaceOnEachLineStart"]="false";#參考資料:#file(),取得檔案內容的行數.#file=>http:#php.net/manual/en/function.file.php#rtrim(),剔除透過file()取得每行內容結尾的換行符號.#filesize=>http://php.net/manual/en/function.filesize.php#參考資料:#無.#備註:#無.$getFileContent=fileAccesss::getFileContent($conf["fileAccesss::getFileContent"]);unset($conf["fileAccesss::getFileContent"]);#如果執行異常if($getFileContent["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getFileContent;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Checking host ssl(certificate.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#如果既有憑證跟剛下載的憑證不一樣if($getFileContent["fullContent"]!==$getCert["certificate.crt"]){#識別要改成下載好的憑證$certificate_need_update="true";#if enable debugif($debug){#debug msgecho "SSL(certificate.crt) for domain name(".$cInfo["apiDomain"].") differs between host and zerossl".PHP_EOL;}#if end}#if end#if enable debugif($debug){#debug msgecho "Getting host ssl(ca_bundle.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#取得既有的 ca_bundle.crt 檔案內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.#$result["error"],錯誤訊息提示.#$result["warning"],警告訊息.#$result["function"],當前執行的函數名稱.#$result["fileContent"],爲檔案的內容陣列.#$result["lineCount"],爲檔案內容總共的行數.#$result["fullContent"],為檔案的完整內容.#$result["base64dataOnly"],檔案的base64data.#$result["base64data"],為在網頁上給予src參數的數值.#$result["mimeType"],為檔案的mime type.#必填參數:#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.$conf["fileAccesss::getFileContent"]["filePositionAndName"]=$cInfo["caPath"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccesss::getFileContent"]["fileArgu"]=__FILE__;#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".#$conf["web"]="true";#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".#$conf["createIfnotExist"]="false";#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"#$conf["autoDeleteSpaceOnEachLineStart"]="false";#參考資料:#file(),取得檔案內容的行數.#file=>http:#php.net/manual/en/function.file.php#rtrim(),剔除透過file()取得每行內容結尾的換行符號.#filesize=>http://php.net/manual/en/function.filesize.php#參考資料:#無.#備註:#無.$getFileContent=fileAccesss::getFileContent($conf["fileAccesss::getFileContent"]);unset($conf["fileAccesss::getFileContent"]);#如果執行異常if($getFileContent["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getFileContent;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Checking host ssl(ca_bundle.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#如果既有憑證跟剛下載的憑證不一樣if($getFileContent["fullContent"]!==$getCert["ca_bundle.crt"]){#識別要改成下載好的憑證$ca_bundle_need_update="true";#if enable debugif($debug){#debug msgecho "SSL(ca_bundle.crt) for domain name(".$cInfo["apiDomain"].") differs between host and zerossl".PHP_EOL;}#if end}#if end#if enable debugif($debug){#debug msgecho "Getting host ssl(cert and ca_bundle) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#取得既有的 certWithCa 檔案內容#函式說明:#依據行號分隔抓取檔案的內容,結果會回傳一個陣列#回傳的變數說明:#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.#$result["error"],錯誤訊息提示.#$result["warning"],警告訊息.#$result["function"],當前執行的函數名稱.#$result["fileContent"],爲檔案的內容陣列.#$result["lineCount"],爲檔案內容總共的行數.#$result["fullContent"],為檔案的完整內容.#$result["base64dataOnly"],檔案的base64data.#$result["base64data"],為在網頁上給予src參數的數值.#$result["mimeType"],為檔案的mime type.#必填參數:#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.$conf["fileAccesss::getFileContent"]["filePositionAndName"]=$cInfo["certWithCaPath"];#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccesss::getFileContent"]["fileArgu"]=__FILE__;#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".#$conf["web"]="true";#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".#$conf["createIfnotExist"]="false";#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"#$conf["autoDeleteSpaceOnEachLineStart"]="false";#參考資料:#file(),取得檔案內容的行數.#file=>http:#php.net/manual/en/function.file.php#rtrim(),剔除透過file()取得每行內容結尾的換行符號.#filesize=>http://php.net/manual/en/function.filesize.php#參考資料:#無.#備註:#無.$getFileContent=fileAccesss::getFileContent($conf["fileAccesss::getFileContent"]);unset($conf["fileAccesss::getFileContent"]);#如果執行異常if($getFileContent["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$getFileContent;#回傳結果return $result;}#if end#if enable debugif($debug){#debug msgecho "Checking host ssl(cert and ca_bundle) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#如果既有憑證跟剛下載的憑證不一樣if($getFileContent["fullContent"]!==$getCert["certificate.crt"].PHP_EOL.$getCert["ca_bundle.crt"]){#識別要改成下載好的憑證$cert_and_ca_bundle_need_update="true";#if enable debugif($debug){#debug msgecho "SSL(cert and ca_bundle) for domain name(".$cInfo["apiDomain"].") differs between host and zerossl".PHP_EOL;}#if end}#if end#預設不需要執行更新憑證後的動作$requireActionAfterUpdateCert="false";#如果 certificate 需要更新if($certificate_need_update==="true"){#if enable debugif($debug){#debug msgecho "Updating host ssl(certificate.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#更新之#函式說明:#一次建立多個檔案,並寫入內容.#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"][i],實際上寫入的第$i+1個檔案資訊陣列.#$result["content"][i]["createdFileName"],第$i+1個建立好的檔案名稱.#$result["content"][i]["createdFilePath"],第$i+1個檔案建立的路徑.#$result["content"][i]["createdFilePathAndName"].第$i+1個建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeMultiFile"]["fileArgu"]=__FILE__;#$conf["fileName"],字串陣列,爲要寫入的多個檔案名稱$conf["zerossl::writeMultiFile"]["fileName"]=array($cInfo["certPath"]);#可省略參數:#$conf["inputString"],字串陣列,爲要寫入到各別檔案裏面的內容,預設每個元素為空字串.$conf["zerossl::writeMultiFile"]["inputString"]=array($getCert["certificate.crt"]);#參考資料:#無.#備註:#無.$writeMultiFile=zerossl::writeMultiFile($conf["zerossl::writeMultiFile"]);unset($conf["zerossl::writeMultiFile"]);#如果執行異常if($writeMultiFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeMultiFile;#回傳結果return $result;}#if end}#if end#如果 ca_bunle 需要更新if($ca_bundle_need_update==="true"){#if enable debugif($debug){#debug msgecho "Updating host ssl(ca_bundle.crt) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#更新之#函式說明:#一次建立多個檔案,並寫入內容.#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"][i],實際上寫入的第$i+1個檔案資訊陣列.#$result["content"][i]["createdFileName"],第$i+1個建立好的檔案名稱.#$result["content"][i]["createdFilePath"],第$i+1個檔案建立的路徑.#$result["content"][i]["createdFilePathAndName"].第$i+1個建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeMultiFile"]["fileArgu"]=__FILE__;#$conf["fileName"],字串陣列,爲要寫入的多個檔案名稱$conf["zerossl::writeMultiFile"]["fileName"]=array($cInfo["caPath"]);#可省略參數:#$conf["inputString"],字串陣列,爲要寫入到各別檔案裏面的內容,預設每個元素為空字串.$conf["zerossl::writeMultiFile"]["inputString"]=array($getCert["ca_bundle.crt"]);#參考資料:#無.#備註:#無.$writeMultiFile=zerossl::writeMultiFile($conf["zerossl::writeMultiFile"]);unset($conf["zerossl::writeMultiFile"]);#如果執行異常if($writeMultiFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeMultiFile;#回傳結果return $result;}#if end}#if end#如果 certificate and ca_bundle 需要更新if($cert_and_ca_bundle_need_update==="true"){#if enable debugif($debug){#debug msgecho "Updating host ssl(cert and ca_bundle) for domain name(".$cInfo["apiDomain"].")...".PHP_EOL;}#if end#更新之#函式說明:#一次建立多個檔案,並寫入內容.#回傳結果:#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["content"][i],實際上寫入的第$i+1個檔案資訊陣列.#$result["content"][i]["createdFileName"],第$i+1個建立好的檔案名稱.#$result["content"][i]["createdFilePath"],第$i+1個檔案建立的路徑.#$result["content"][i]["createdFilePathAndName"].第$i+1個建立好的檔案名稱與路徑.#$result["argu"],使用的參數.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["zerossl::writeMultiFile"]["fileArgu"]=__FILE__;#$conf["fileName"],字串陣列,爲要寫入的多個檔案名稱$conf["zerossl::writeMultiFile"]["fileName"]=array($cInfo["certWithCaPath"]);#可省略參數:#$conf["inputString"],字串陣列,爲要寫入到各別檔案裏面的內容,預設每個元素為空字串.$conf["zerossl::writeMultiFile"]["inputString"]=array($getCert["certificate.crt"].PHP_EOL.$getCert["ca_bundle.crt"]);#參考資料:#無.#備註:#無.$writeMultiFile=zerossl::writeMultiFile($conf["zerossl::writeMultiFile"]);unset($conf["zerossl::writeMultiFile"]);#如果執行異常if($writeMultiFile["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$writeMultiFile;#回傳結果return $result;}#if end}#if end#如果有需要執行指令來生效憑證if($requireActionAfterUpdateCert==="true"){#if enable debugif($debug){#debug msgecho "Action required to apply ssl for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#儲存 actionAfterUpdateCert$action=$cInfo["actionAfterUpdateCert"];#如果有多個指令要執行if(gettype($action[0])==="array"){#if enable debugif($debug){#debug msgecho "There are many cmds to run to apply ssl for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#針對每的指令foreach($action as $ac){#if enable debugif($debug){#debug msgecho ".".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$ac;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#foreach end}#if end#反之else{#if enable debugif($debug){#debug msgecho "There is only one cmd to run to apply ssl for domain name(".$cInfo["apiDomain"].")".PHP_EOL;}#if end#函式說明:#解析指令與參數,回傳指令與參數給 callShell 函式使用.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令名稱.#$result["params"],執行指令伴隨的參數.#必填參數:#$conf["cmdArray"],字串陣列,要執行的指令字串.$conf["external::callShellHelper"]["cmdArray"]=$action;#可省略參數:#無.#參考資料:#array_shift=>https://www.php.net/manual/en/function.array-shift.php#備註:#無.$callShellHelper=external::callShellHelper($conf["external::callShellHelper"]);unset($conf["external::callShellHelper"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShellHelper;#回傳結果return $result;}#if end#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["content"],為執行完後的輸出字串.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#$result["noEscaped"],陣列,儲存重新排序過未經過escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]=$callShellHelper["cmd"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=$callShellHelper["params"];#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#$conf["remoteIp"],字串,遠端ip或domainName,預設不使用,若存在則會透過ssh指令進行連線,然後執行指令.#$conf["remoteIp"]="";#$conf["remoteUser"],字串,遠端的使用者賬戶,預設不指定,亦即跟為運行該php程式的使用者.#$conf["remoteUser"]="";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行異常if($callShellHelper["status"]==="false"){#設置錯誤識別$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end}#else end}#if end}#if end}#else end}#else end}#foreach end}#function sslUpdater_idle end}#class zerossl end