@@ -75,7 +75,7 @@ function getConfig($str, $disktag = '')
if ( isset ( $env [ $str ])) {
if ( isBase64Env ( $str )) return base64y_decode ( $env [ $str ]);
else return $env [ $str ];
}
}
} else {
if ( isBase64Env ( $str )) return base64y_decode ( getenv ( $str ));
else return getenv ( $str );
@@ -112,7 +112,9 @@ function setConfig($arr, $disktag = '')
$operatedisk = 1 ;
} elseif ( $k == 'disktag_copy' ) {
$newtag = $v . '_' . date ( " Ymd_His " );
$tmp [ $newtag ] = getConfig ( $v );
$tagvalue = getConfig ( $v );
if ( is_array ( $tagvalue )) $tmp [ $newtag ] = json_encode ( $tagvalue );
else $tmp [ $newtag ] = $tagvalue ;
array_push ( $disktags , $newtag );
$operatedisk = 1 ;
} elseif ( $k == 'disktag_rename' || $k == 'disktag_newname' ) {
@@ -134,7 +136,9 @@ function setConfig($arr, $disktag = '')
else array_push ( $tags , $tag );
}
$tmp [ 'disktag' ] = implode ( '|' , $tags );
$tmp [ $arr [ 'disktag_newname' ]] = getConfig ( $arr [ 'disktag_rename' ]);
$tagvalue = getConfig ( $arr [ 'disktag_rename' ]);
if ( is_array ( $tagvalue )) $tmp [ $arr [ 'disktag_newname' ]] = json_encode ( $tagvalue );
else $tmp [ $arr [ 'disktag_newname' ]] = $tagvalue ;
$tmp [ $arr [ 'disktag_rename' ]] = null ;
} else {
$disktags = array_unique ( $disktags );
@@ -157,49 +161,39 @@ function install()
$tmp [ 'admin' ] = $_POST [ 'admin' ];
//$tmp['language'] = $_POST['language'];
$tmp [ 'timezone' ] = $_COOKIE [ 'timezone' ];
$APIKey = getConfig ( 'APIKey' ) ;
if ( $APIKey == '' ) {
$APIKey = $_POST [ 'APIKey' ];
$tmp [ 'APIKey' ] = $APIKey ;
}
$projectPath = splitlast ( __DIR__ , " / " )[ 0 ];
//$html .= file_get_contents($projectPath . "/.data/config.php") . "<br>";GET /v5/now/deployments /v8/projects/:id/env
$token = $tmp [ 'APIKey' ];
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$aliases = json_decode ( curl ( " GET " , " https://api.vercel.com/v3/now/aliases " , " " , $header )[ 'body' ], true );
$host = splitfirst ( $_SERVER [ " host " ], " // " )[ 1 ];
foreach ( $aliases [ " aliases " ] as $key => $aliase ) {
if ( $host == $aliase [ " alias " ]) $projectId = $aliase [ " projectId " ];
}
//$envs = json_decode(curl("GET", "https://api.vercel.com/v8/projects/" . $projectId . "/env", "", $header)['body'], true);
$APIKey = $_POST [ 'APIKey' ] ;
//if ($APIKey=='') {
// $APIKey = getConfig( 'APIKey');
//}
$tmp [ 'APIKey' ] = $APIKey ;
$token = $APIKey ;
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$aliases = json_decode ( curl ( " GET " , " https://api.vercel.com/v3/now/aliases " , " " , $header )[ 'body' ], true );
$host = splitfirst ( $_SERVER [ " host " ], " // " )[ 1 ];
foreach ( $aliases [ " aliases " ] as $key => $aliase ) {
if ( $host == $aliase [ " alias " ]) $projectId = $aliase [ " projectId " ];
}
$tmp [ 'HerokuappId' ] = $projectId ;
$response = json_decode ( setVercelConfig ( $tmp , $projectId , $APIKey )[ 'body' ], true );
$response = json_decode ( setVercelConfig ( $tmp , $projectId , $APIKey ), true );
if ( api_error ( $response )) {
$html = api_error_msg ( $response );
$title = 'Error' ;
return message ( $html , $title , 400 );
} else {
return output ( ' < span id = " displayBox " ></ span >
< script >
/* $html = ' < script >
var status = " ' . $response['status'] . ' " ;
var expd = new Date ();
expd . setTime ( expd . getTime () + 1000 );
var expires = " expires= " + expd . toGMTString ();
document . cookie = \ ' language = ; path =/ ; \ ' + expires ;
x = 30 ;
function countSecond ()
{
x -- ;
document . getElementById ( " displayBox " ) . innerHTML = x ;
if ( x > 0 ) setTimeout ( " countSecond() " , 1000 );
}
// 执行函数
countSecond ();
</ script >
< meta http - equiv = " refresh " content = " 30;URL=' . path_format( $_SERVER['base_path'] . '/') . ' " > ' , 302 );
</ script > ' ;
return message ( $html , $title , 201 , 1 ); */
$data [ " dplId " ] = $response [ 'status' ];
return output ( json_encode ( $data ), 201 ) ;
}
return message ( $html , $title , 201 );
}
}
if ( $_GET [ 'install0' ]) {
@@ -210,14 +204,16 @@ language:<br>';
$html .= '
< label >< input type = " radio " name = " language " value = " '. $key1 .' " '.($key1==$constStr[' language ']?' checked ':' ').' onclick = " changelanguage( \ ''. $key1 .' \ ') " > '.$value1.' </ label >< br > ' ;
}
if ( getConfig ( 'APIKey' ) == '' ) $html .= '
//if (getConfig('APIKey')=='')
$html .= ' < br >
< a href = " https://vercel.com/account/tokens " target = " _blank " > ' . getconstStr(' Create ') . ' token </ a >< br >
< label > Token :< input name = " APIKey " type = " text " placeholder = " " size = " " ></ label >< br > ' ;
< label > Token :< input name = " APIKey " type = " password " placeholder = " " value = " ' . getConfig('APIKey') . ' " ></ label >< br > ' ;
$html .= ' < br >
< label > Set admin password :< input name = " admin " type = " password " placeholder = " ' . getconstStr('EnvironmentsDescription')['admin'] . ' " size = " ' . strlen(getconstStr('EnvironmentsDescription')['admin']) . ' " ></ label >< br > ' ;
$html .= '
< input type = " submit " value = " '.getconstStr('Submit').' " >
</ form >
< div id = " showerror " ></ div >
< script >
var nowtime = new Date ();
var timezone = 0 - nowtime . getTimezoneOffset () / 60 ;
@@ -225,6 +221,7 @@ language:<br>';
expd . setTime ( expd . getTime () + ( 2 * 60 * 60 * 1000 ));
var expires = " expires= " + expd . toGMTString ();
document . cookie = " timezone= " + timezone + " ; path=/; " + expires ;
var errordiv = document . getElementById ( " showerror " );
function changelanguage ( str )
{
var expd = new Date ();
@@ -238,26 +235,69 @@ language:<br>';
if ( t . admin . value == \ ' \ ' ) {
alert ( \ ' input admin\ ' );
return false ;
} ' ;
if ( getConfig ( 'APIKey' ) == '' ) $html .= '
}
if ( t . APIKey . value == \ ' \ ' ) {
alert ( \ ' input API Key \' );
alert ( \ ' input Token \' );
return false ;
} ' ;
$html . = '
return true ;
}
t . style . display = " none " ;
errordiv . innerHTML = " ' . getconstStr('Wait') . ' " ;
var xhr = new XMLHttpRequest ();
xhr . open ( " POST " , t . action );
xhr . onload = function ( e ) {
if ( xhr . status == 201 ) {
var res = JSON . parse ( xhr . responseText );
getStatus ( res . dplId , t . APIKey . value );
} else {
t . style . display = " " ;
errordiv . innerHTML = xhr . status + " <br> " + xhr . responseText ;
}
}
xhr . send ( " admin= " + t . admin . value + " &APIKey= " + t . APIKey . value );
var x = " " ;
var min = 0 ;
function getStatus ( id , VercelToken ) {
x += " . " ;
min ++ ;
var xhr = new XMLHttpRequest ();
var url = " https://api.vercel.com/v11/now/deployments/ " + id ;
xhr . open ( " GET " , url );
xhr . setRequestHeader ( " Authorization " , " Bearer " + VercelToken );
xhr . onload = function ( e ) {
if ( xhr . status == 200 ) {
var deployStat = JSON . parse ( xhr . responseText ) . readyState ;
if ( deployStat == " READY " ) {
x = " " ;
min = 0 ;
errordiv . innerHTML = " Deploy done. " ;
location . href = " / " ;
} else {
errordiv . innerHTML = deployStat + " , " + min + " .<br>' . getconstStr('Wait') . ' " + x ;
if ( deployStat !== " ERROR " ) setTimeout ( function () { getStatus ( id , VercelToken ) }, 1000 );
}
} else {
t . style . display = " " ;
console . log ( xhr . status );
console . log ( xhr . responseText );
}
}
xhr . send ( null );
}
return false ;
}
</ script > ' ;
$title = getconstStr ( 'SelectLanguage' );
return message ( $html , $title , 201 );
}
if ( substr ( $_SERVER [ " host " ], - 10 ) == " vercel.app " ) {
$html .= '<a href="?install0">' . getconstStr ( 'ClickInstall' ) . '</a>, ' . getconstStr ( 'LogintoBind' );
$html .= " <br>Remember: you MUST wait 30-60s after each operate / do some change, that make sure Vercel has done the building<br> " ;
} else {
$html .= " Please visit form *.vercel.app " ;
}
if ( substr ( $_SERVER [ " host " ], - 10 ) == " vercel.app " ) {
$html .= '<a href="?install0">' . getconstStr ( 'ClickInstall' ) . '</a>, ' . getconstStr ( 'LogintoBind' );
$html .= " <br>Remember: you MUST wait 30-60s after each operate / do some change, that make sure Vercel has done the building<br> " ;
} else {
$html .= " Please visit form *.vercel.app " ;
}
$title = 'Install' ;
return message ( $html , $title , 201 );
}
@@ -265,52 +305,54 @@ language:<br>';
// POST /v8/projects/:id/env
function setVercelConfig ( $envs , $appId , $token )
{
$url = " https://api.vercel.com/v8/projects/ " . $appId . " /env " ;
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$response = curl ( " GET " , $url , " " , $header );
$result = json_decode ( $response [ 'body' ], true );
foreach ( $result [ " envs " ] as $key => $value ) {
$existEnvs [ $value [ " key " ]] = $value [ " id " ];
}
$response = null ;
foreach ( $envs as $key => $value ) {
$tmp = null ;
$tmp [ " type " ] = " encrypted " ;
$tmp [ " key " ] = $key ;
$tmp [ " value " ] = $value ;
$tmp [ " target " ] = [ " development " , " production " , " preview " ];
if ( isset ( $existEnvs [ $key ])) {
if ( $value ) $response = curl ( " PATCH " , $url . " / " . $existEnvs [ $key ], json_encode ( $tmp ), $header );
else $response = curl ( " DELETE " , $url . " / " . $existEnvs [ $key ], " " , $header );
} else {
if ( $value ) $response = curl ( " POST " , $url , json_encode ( $tmp ), $header );
}
//echo $key . ":" . $value . ", " . json_encode($response, JSON_PRETTY_PRINT) . "<br>";
}
return VercelUpdate ( $appId , $token );
//return $response;
$url = " https://api.vercel.com/v8/projects/ " . $appId . " /env " ;
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$response = curl ( " GET " , $url , " " , $header );
$result = json_decode ( $response [ 'body' ], true );
foreach ( $result [ " envs " ] as $key => $value ) {
$existEnvs [ $value [ " key " ]] = $value [ " id " ];
}
$response = null ;
foreach ( $envs as $key => $value ) {
$tmp = null ;
$tmp [ " type " ] = " encrypted " ;
$tmp [ " key " ] = $key ;
$tmp [ " value " ] = $value ;
$tmp [ " target " ] = [ " development " , " production " , " preview " ];
if ( isset ( $existEnvs [ $key ])) {
if ( $value ) $response = curl ( " PATCH " , $url . " / " . $existEnvs [ $key ], json_encode ( $tmp ), $header );
else $response = curl ( " DELETE " , $url . " / " . $existEnvs [ $key ], " " , $header );
} else {
if ( $value ) $response = curl ( " POST " , $url , json_encode ( $tmp ), $header );
}
//echo $key . ":" . $value . ", " . json_encode($response, JSON_PRETTY_PRINT) . "<br>";
}
return VercelUpdate ( $appId , $token );
//return $response;
}
function VercelUpdate ( $appId , $token , $sourcePath = " " )
{
$url = " https://api.vercel.com/v12/now/deployments " ;
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$data [ " name " ] = " OneManager " ;
$data [ " project " ] = $appId ;
$data [ " target " ] = " production " ;
$data [ " routes " ][ 0 ][ " src " ] = " /(.*) " ;
$data [ " routes " ][ 0 ][ " dest " ] = " /api/index.php " ;
$data [ " functions " ][ " api/index.php " ][ " runtime " ] = " vercel-php@0.4.0 " ;
if ( $sourcePath == " " ) $sourcePath = splitlast ( splitlast ( __DIR__ , " / " )[ 0 ], " / " )[ 0 ];
//echo $sourcePath . "<br>";
getEachFiles ( $file , $sourcePath );
$data [ " files " ] = $file ;
$url = " https://api.vercel.com/v12/now/deployments " ;
$header [ " Authorization " ] = " Bearer " . $token ;
$header [ " Content-Type " ] = " application/json " ;
$data [ " name " ] = " OneManager " ;
$data [ " project " ] = $appId ;
$data [ " target " ] = " production " ;
$data [ " routes " ][ 0 ][ " src " ] = " /(.*) " ;
$data [ " routes " ][ 0 ][ " dest " ] = " /api/index.php " ;
$data [ " functions " ][ " api/index.php " ][ " runtime " ] = " vercel-php@0.4.0 " ;
if ( $sourcePath == " " ) $sourcePath = splitlast ( splitlast ( __DIR__ , " / " )[ 0 ], " / " )[ 0 ];
//echo $sourcePath . "<br>";
getEachFiles ( $file , $sourcePath );
$data [ " files " ] = $file ;
//echo json_encode($data, JSON_PRETTY_PRINT) . " ,data<br>";
$response = curl ( " POST " , $url , json_encode ( $data ), $header );
return $response [ " body " ];
//echo json_encode($data, JSON_PRETTY_PRINT) . " ,data<br>";
$response = curl ( " POST " , $url , json_encode ( $data ), $header );
$result = json_decode ( $response [ " body " ], true ) ;
$result [ 'status' ] = $result [ 'id' ];
return json_encode ( $result );
}
function getEachFiles ( & $file , $base , $path = " " )
@@ -321,13 +363,13 @@ function getEachFiles(&$file, $base, $path = "")
while ( $filename = readdir ( $handler )) {
if ( $filename != '.' && $filename != '..' && $filename != '.git' ){
$fromfile = path_format ( $base . " / " . $path . " / " . $filename );
//echo $fromfile . "<br>";
//echo $fromfile . "<br>";
if ( is_dir ( $fromfile )){ // 如果读取的某个对象是文件夹,则递归
$response = getEachFiles ( $file , $base , path_format ( $path . " / " . $filename ));
if ( api_error ( setConfigResponse ( $response ))) return $response ;
} else {
$tmp [ 'file' ] = path_format ( $path . " / " . $filename );
$tmp [ 'data' ] = file_get_contents ( $fromfile );
$tmp [ 'file' ] = path_format ( $path . " / " . $filename );
$tmp [ 'data' ] = file_get_contents ( $fromfile );
$file [] = $tmp ;
}
}
@@ -379,9 +421,25 @@ function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch =
break ;
}
}
//echo $outPath . "<br>";
//echo $outPath . "<br>";
//error_log1($outPath);
if ( $outPath == '' ) return '{"error":{"message":"no outpath"}}' ;
return VercelUpdate ( getConfig ( 'HerokuappId' ), getConfig ( 'APIKey' ), $outPath );
}
function WaitFunction ( $deployid ) {
$header [ " Authorization " ] = " Bearer " . getConfig ( 'APIKey' );
$header [ " Content-Type " ] = " application/json " ;
$url = " https://api.vercel.com/v11/now/deployments/ " . $deployid ;
$response = curl ( " GET " , $url , " " , $header );
if ( $response [ 'stat' ] == 200 ) {
$result = json_decode ( $response [ 'body' ], true );
if ( $result [ 'readyState' ] == " READY " ) return true ;
if ( $result [ 'readyState' ] == " ERROR " ) return $response ;
return false ;
} else {
$response [ 'body' ] .= $url ;
return $response ;
}
}