Find file
Fetching contributors…
Cannot retrieve contributors at this time
680 lines (590 sloc) 21.8 KB
#!/usr/bin/php
<?php
////////////////////////////////////////////////////////////////////////////////
// __ _ _ //
// / _| | | | //
// | |_| |__ ___ _ __ ___ __| | //
// | _| '_ \ / __| '_ ` _ \ / _` | //
// | | | |_) | (__| | | | | | (_| | //
// |_| |_.__/ \___|_| |_| |_|\__,_| //
// //
// Facebook Command Line Interface Utility //
// http://facebook.com/fbcmd //
// http://fbcmd.dtompkins.com //
// Copyright (c) 2007,2010 Dave Tompkins //
// //
////////////////////////////////////////////////////////////////////////////////
// //
// see fbcmd.php for copyright information //
// //
////////////////////////////////////////////////////////////////////////////////
// This is a Utility to update your version of fbcmd
////////////////////////////////////////////////////////////////////////////////
$isTrace = 0;
if (isset($argv[3])) {
if ($argv[3]) {
$isTrace = 1;
}
}
////////////////////////////////////////////////////////////////////////////////
$isContinueOnError = 0;
if (isset($argv[4])) {
if ($argv[4]) {
$isContinueOnError = 1;
}
}
TraceVar('isContinueOnError');
////////////////////////////////////////////////////////////////////////////////
// Note: The Installer version is independent of the fbcmd version
$fbcmdUpdateVersion = '3.0';
TraceVar('fbcmdUpdateVersion');
////////////////////////////////////////////////////////////////////////////////
print "\n";
print "fbcmd update utility [version {$fbcmdUpdateVersion}]\n";
print "http://fbcmd.dtompkins.com/update\n\n";
////////////////////////////////////////////////////////////////////////////////
if (!extension_loaded('openssl')) {
print "Warning: openssl exenstion is not installed.\n";
exit;
}
////////////////////////////////////////////////////////////////////////////////
if (isset($argv[0])) {
$thisProgram = $argv[0];
} else {
$thisProgram = "./fbcmd_update.php";
}
$thisProgramFolder = realpath(dirname($thisProgram));
TraceVar('thisProgram');
TraceVar('thisProgramFolder');
////////////////////////////////////////////////////////////////////////////////
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$isWindows = true;
} else {
$isWindows = false;
}
TraceVar('isWindows');
////////////////////////////////////////////////////////////////////////////////
// Set the defaults for fbcmd... these can be overridden in prefs.php
$fbcmdPrefs['update_branch'] = 'master';
$fbcmdPrefs['install_script_name'] = 'fbcmd';
if ($isWindows) {
$fbcmdPrefs['install_lib_dir'] = CleanPath($thisProgramFolder);
$fbcmdPrefs['install_copy_to_bin'] = '0';
$fbcmdPrefs['install_bin_dir'] = 'c:\\windows';
} else {
$fbcmdPrefs['install_lib_dir'] = '/usr/local/lib/fbcmd/';
$fbcmdPrefs['install_copy_to_bin'] = '1';
$fbcmdPrefs['install_bin_dir'] = '/usr/local/bin/';
}
$fbcmdPrefs['install_lib_mkdir_mode'] = '0777';
$fbcmdPrefs['install_data_mkdir_mode'] = '0700';
$fbcmdPrefs['install_auto_restart'] = '1';
$defaultLibDir = $fbcmdPrefs['install_lib_dir'];
$fbcmdPrefs['mkdir_mode'] = '0777';
TraceVar('defaultLibDir');
////////////////////////////////////////////////////////////////////////////////
$isSudo = false;
$envFbcmd = getenv('FBCMD');
TraceVar('envFbcmd');
if ($envFbcmd) {
$fbcmdBaseDir = CleanPath($envFbcmd);
} else {
if ($isWindows) {
if (getenv('USERPROFILE')) {
$fbcmdBaseDir = CleanPath(getenv('USERPROFILE')) . 'fbcmd/';
} else {
$fbcmdBaseDir = 'c:/fbcmd/';
}
} else {
if (getenv('SUDO_USER')) {
$isSudo = true;
$sudoUser = getenv('SUDO_USER');
$fbcmdBaseDir = '~' . getenv('SUDO_USER') . '/.fbcmd/';
} else {
$fbcmdBaseDir = CleanPath(getenv('HOME')) . '.fbcmd/';
}
}
}
TraceVar('fbcmdBaseDir');
TraceVar('isSudo');
////////////////////////////////////////////////////////////////////////////////
$isSavePrefs = false;
$prefsFile = "{$fbcmdBaseDir}prefs.php";
if (file_exists($prefsFile)) {
include($prefsFile);
$isIncludeFile = true;
} else {
$isIncludeFile = false;
}
TraceVar('isIncludeFile');
////////////////////////////////////////////////////////////////////////////////
$specifiedBranch = '';
if (isset($argv[1])) {
$specifiedBranch = strtolower($argv[1]);
}
TraceVar('specifiedBranch');
////////////////////////////////////////////////////////////////////////////////
if (isset($argv[2])) {
if ($argv[2]) {
$fbcmdPrefs['install_lib_dir'] = $argv[2];
MakeLibDir();
$fbcmdPrefs['install_lib_dir'] = CleanPath(realpath($fbcmdPrefs['install_lib_dir']));
$isSavePrefs = true;
}
}
////////////////////////////////////////////////////////////////////////////////
$keywords = array('-h','help','--help','clear','install','remove','script','sudo');
$isHelp = false;
$isKeyword = false;
if (in_array($specifiedBranch,$keywords)) {
if (($specifiedBranch=='-h')||($specifiedBranch=='help')||($specifiedBranch=='--help')) {
$isHelp = true;
}
$isKeyword = true;
if ($specifiedBranch=='sudo') {
$isSudo = true;
}
}
TraceVar('isKeyword');
TraceVar('isHelp');
////////////////////////////////////////////////////////////////////////////////
if ((($specifiedBranch == '')||($isHelp))&&($isIncludeFile == false)) {
$isFirstInstall = true;
} else {
$isFirstInstall = false;
}
TraceVar('isFirstInstall');
////////////////////////////////////////////////////////////////////////////////
if ($isHelp) {
print "\nParameters: [branch|keyword] [folder] [trace] [ignore_err]\n\n";
print "branch: Software development branch\n";
print " master stable, not all features available\n";
print " beta reaonably stable, subject to minor changes\n";
print " dev latest features (experimental)\n\n";
print "keyword: Instead of a branch, you can specify one of:\n";
print " clear clear your personal user settings\n";
print " help display this message\n";
print " install install with default branch\n";
print " remove removes fbcmd from your system\n";
print " script generate the fbcmd script only\n";
print " sudo (Mac/Linux) create lib_dir & script only\n\n";
print "folder: Specify a destination installation directory (0 for default)\n\n";
print "trace: Defaults to 0. Set to 1 for verbose output\n\n";
print "ignore_err: Defaults to 0. Set to 1 to ignore fatal errors\n\n\n";
}
////////////////////////////////////////////////////////////////////////////////
if (($isIncludeFile == false)&&($specifiedBranch != 'remove')&&($specifiedBranch != 'clear')&&($isSudo == false)) {
if (!file_exists($fbcmdBaseDir)) {
if (mkdir($fbcmdBaseDir,octdec($fbcmdPrefs['install_data_mkdir_mode']),true)) {
Trace("creating directory [{$fbcmdBaseDir}]");
} else {
print "Error: cound not create directory: [{$fbcmdBaseDir}]\n";
FatalError();
}
if (!$isWindows) {
if (chmod($fbcmdBaseDir,octdec($fbcmdPrefs['install_data_mkdir_mode']))) {
Trace("chmod [{$fbcmdBaseDir}]");
} else {
Trace("Error: chmod [{$fbcmdBaseDir}] (non-fatal)");
}
}
}
$isSavePrefs = true;
}
////////////////////////////////////////////////////////////////////////////////
if (($isSavePrefs)&&($isSudo == false)) {
$fileContents = SavePrefsContents();
if (file_put_contents($prefsFile,$fileContents)) {
Trace("creating file [{$prefsFile}]");
} else {
print "Error: cound not create file: [{$prefsFile}] (non-fatal)\n";
}
}
////////////////////////////////////////////////////////////////////////////////
if (($isHelp)||($isFirstInstall)) {
print "Preference file: [{$prefsFile}]\n\n";
print "Software development branch: [{$fbcmdPrefs['update_branch']}]\n";
print "Software library destination: [{$fbcmdPrefs['install_lib_dir']}]\n";
print "Copy script to bin dir?: ";
if ($fbcmdPrefs['install_copy_to_bin']) {
print "[Yes]\n";
print "Bin dir location: [{$fbcmdPrefs['install_bin_dir']}]\n";
} else {
print "[No]\n";
}
print "Script name: [{$fbcmdPrefs['install_script_name']}]\n";
print "Auto-restart when necessary: ";
if ($fbcmdPrefs['install_auto_restart']) {
print "[Yes]\n\n";
} else {
print "[No]\n\n";
}
if ($isFirstInstall) {
print "\n\n";
print "Welcome! This appears to be the first time running fbcmd_update.\n";
print "\n";
print "To change any of the above settings, modify your preferences file\n";
print "To change your preferences file location, set an FBCMD environment var.\n\n";
print "Otherwise, The above default settings are fine for most users\n\n";
print "To finish the installation:\n\n";
if ($isWindows) {
print " php fbcmd_update.php\n\n";
} else {
print " $ sudo php fbcmd_update.php sudo\n";
print " $ php fbcmd_update.php\n\n";
}
}
exit;
}
////////////////////////////////////////////////////////////////////////////////
if (($specifiedBranch == 'clear')||($specifiedBranch == 'remove')) {
DeleteFileOrDirectory($fbcmdBaseDir);
if ($specifiedBranch == 'clear') {
exit;
}
}
if ($specifiedBranch == 'remove') {
if ($fbcmdPrefs['install_copy_to_bin']) {
if ($isWindows) {
$pathShell = CleanPath($fbcmdPrefs['install_bin_dir']) . $fbcmdPrefs['install_script_name'] . '.bat';
} else {
$pathShell = CleanPath($fbcmdPrefs['install_bin_dir']) . $fbcmdPrefs['install_script_name'];
}
DeleteFileOrDirectory($pathShell);
}
DeleteFileOrDirectory($fbcmdPrefs['install_lib_dir']);
exit;
}
////////////////////////////////////////////////////////////////////////////////
$installLibDir = $fbcmdPrefs['install_lib_dir'];
MakeLibDir();
$installLibDir = CleanPath(realpath($installLibDir));
$installLibDirOS = $installLibDir;
if ($isWindows) {
$installLibDirOS = str_replace('/', '\\', $installLibDirOS);
}
TraceVar('installLibDir');
TraceVar('installLibDirOS');
$mainFile = "{$installLibDir}fbcmd.php";
$updateFile = "{$installLibDir}fbcmd_update.php";
if ($isWindows) {
$scriptName = $fbcmdPrefs['install_script_name'] . '.bat';
} else {
$scriptName = $fbcmdPrefs['install_script_name'];
}
$fullScriptName = "{$installLibDir}$scriptName";
$fullBinScript = CleanPath($fbcmdPrefs['install_bin_dir']) . $scriptName;
TraceVar('fullScriptName');
TraceVar('fullBinScript');
////////////////////////////////////////////////////////////////////////////////
$comment = "This script file was auto-generated by [{$updateFile}]";
if ($isWindows) {
$contentsBatch = "@echo off\n";
$contentsBatch .= "REM *** {$comment}\n";
$contentsBatch .= "php \"$mainFile\" %*\n";
} else {
$contentsBatch = "#! /bin/bash\n";
$contentsBatch .= "# *** {$comment}\n";
$contentsBatch .= "php \"$mainFile\" \"$@\" -col=$(tput cols)\n";
}
$isMakeScript = false;
if (!file_exists($fullBinScript)) {
$isMakeScript = true;
}
if ($specifiedBranch == 'script') {
$isMakeScript = true;
}
if ($isSudo) {
$isMakeScript = false;
}
TraceVar('isMakeScript');
if ($isMakeScript) {
if (file_put_contents($fullScriptName,$contentsBatch)) {
Trace ("created script: [{$fullScriptName}]");
if (!$isWindows) {
if (chmod($fullScriptName,octdec($fbcmdPrefs['install_lib_mkdir_mode']))) {
Trace ("chmod script: [{$fullScriptName}]");
} else {
print "error chmod: [{$fullScriptName}] (non-fatal)\n";
}
}
} else {
print "Error: cound not create file: [{$fullScriptName}]\n";
FatalError();
}
}
////////////////////////////////////////////////////////////////////////////////
$isCopyToBin = false;
if ($fbcmdPrefs['install_copy_to_bin']) {
if (!file_exists($fullBinScript)) {
$isCopyToBin = true;
}
if (($specifiedBranch == 'script')||($isSudo == true)) {
$isCopyToBin = true;
}
}
TraceVar('isCopyToBin');
if ($isCopyToBin) {
CheckPath($fbcmdPrefs['install_bin_dir']);
if (file_put_contents($fullBinScript,$contentsBatch)) {
Trace ("created script: [{$fullBinScript}]");
if (!$isWindows) {
if (isset($sudoUser)) {
if (chown($fullBinScript,$sudoUser)) {
Trace ("chown script: [{$fullBinScript}] [{$sudoUser}]");
} else {
print "error chown: [{$fullBinScript}] [{$sudoUser}] (non-fatal)\n";
}
}
if (chmod($fullBinScript,octdec($fbcmdPrefs['install_lib_mkdir_mode']))) {
Trace ("chmod script: [{$fullBinScript}]");
} else {
print "error chmod: [{$fullBinScript}] (non-fatal)\n";
}
}
} else {
print "Error: cound not create file: [{$fullBinScript}]\n";
FatalError();
}
}
if (($specifiedBranch == 'script')||($specifiedBranch == 'sudo')) {
exit;
}
////////////////////////////////////////////////////////////////////////////////
$defaultBranch = strtolower($fbcmdPrefs['update_branch']);
$branch = $defaultBranch;
if (($specifiedBranch)&&($specifiedBranch != 'install')) {
$branch = $specifiedBranch;
Trace("overriding default branch: [{$defaultBranch}]");
}
TraceVar('defaultBranch');
TraceVar('branch');
////////////////////////////////////////////////////////////////////////////////
print "...";
$contentsRemoteUpdater = GetGithub("fbcmd_update.php",false);
preg_match ("/fbcmdUpdateVersion\s=\s'([^']+)'/",$contentsRemoteUpdater,$matches);
$newUpdateVersion = 0;
if (isset($matches[1])) {
$newUpdateVersion = $matches[1];
}
TraceVar('newUpdateVersion');
////////////////////////////////////////////////////////////////////////////////
if (($newUpdateVersion > $fbcmdUpdateVersion)||(!file_exists($updateFile))) {
if (file_put_contents($updateFile,$contentsRemoteUpdater)) {
Trace("creating [{$updateFile}]");
if ($newUpdateVersion > $fbcmdUpdateVersion) {
if ($fbcmdPrefs['install_auto_restart']) {
print "\nNewer update software downloaded [{$fbcmdUpdateVersion}] -> [{$newUpdateVersion}]\n";
print "\nattempting to restart...\n";
$execString = "php \"{$updateFile}\" \"{$specifiedBranch}\" \"{$installLibDir}\" $isTrace $isContinueOnError";
passthru($execString);
exit;
} else {
if (realpath($thisProgram) == realpath($updateFile)) {
print "\nUpdate INCOMPLETE: Restart this program (it has updated itself)\n\n";
} else {
print "\nUpdate INCOMPLETE: run the NEW updater: [$updateFile]\n";
print "(you might want to remove this old one to avoid confusion)\n\n";
}
FatalError();
}
}
} else {
print "Fatal error: could not save [$updateFile]\n\n";
FatalError();
}
}
////////////////////////////////////////////////////////////////////////////////
$oldMainVersion = 'none';
$newMainVersion = '';
if (file_exists($mainFile)) {
$oldFileContents = @file_get_contents($mainFile);
preg_match ("/fbcmdVersion\s=\s'([^']+)'/",$oldFileContents,$matches);
if (isset($matches[1])) {
$oldMainVersion = $matches[1];
} else {
$oldMainVersion = '???';
}
}
TraceVar('oldMainVersion');
////////////////////////////////////////////////////////////////////////////////
print ".";
$fileList = GetGithub("filelist.txt");
$files = explode("\n",$fileList);
foreach ($files as $f) {
$g = preg_replace('/\s*\#.*$/','',$f);
if ($g) {
print ".";
$contents = GetGithub($g);
if ($g == 'fbcmd.php') {
preg_match("/fbcmdVersion\s=\s'([^']+)'/",$contents,$matches);
if (isset($matches[1])) {
$newMainVersion = $matches[1];
} else {
print "Non-fatal error: could not determine new version\n";
$newMainVersion = '???';
}
}
}
}
print "\n";
////////////////////////////////////////////////////////////////////////////////
print "\nUpdate: COMPLETE!\n\n";
print "fbcmd version: [{$oldMainVersion}] --> [{$newMainVersion}]\n";
if ($specifiedBranch != 'install') {
if (!$fbcmdPrefs['install_copy_to_bin']) {
if (stripos(getenv('PATH'),substr($installLibDirOS,0,strlen($installLibDirOS)-1)) === false) {
print "\nNote: Your PATH does not appear to include {$installLibDirOS}\n";
if ($isWindows) {
print "(right click) My Computer -> Properties -> Advanced -> Environment Variables\n";
print "Edit the PATH entry and add: ;{$installLibDirOS}\n";
} else {
print "Add the following line to your ~/.bash_profile file:\n";
print " PATH=\$PATH:{$installLibDirOS}; export PATH\n";
}
}
}
}
if (realpath($thisProgram) != realpath($updateFile)) {
print "\nNote: fbcmd_update.php is now at [{$updateFile}]\n";
print "so you can remove the old one at [" . realpath($thisProgram) . "]\n\n";
}
if ($oldMainVersion == 'none') {
print "\ntype " . $fbcmdPrefs['install_script_name'] . " to begin\n\n";
}
print "\n";
exit;
function DeleteFileOrDirectory($dir) { # snagged from http://ca3.php.net/rmdir
Trace("deleting [{$dir}]");
if (!file_exists($dir)) return true;
if (!is_dir($dir)) {
if (unlink($dir)) {
return true;
} else {
print "Could Not Delete File: [{$dir}]\n";
FatalError();
}
}
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') continue;
if (!DeleteFileOrDirectory($dir.DIRECTORY_SEPARATOR.$item)) return false;
}
if (rmdir($dir)) {
return true;
} else {
print "Could Not Delete Directory: [{$dir}]\n";
FatalError();
}
}
function GetGithub($filename, $save = true) {
global $branch;
global $installLibDir;
$fileSrc = "https://raw.github.com/dtompkins/fbcmd/{$branch}/{$filename}";
$fileDest = "{$installLibDir}{$filename}";
$fileContents = @file_get_contents($fileSrc);
if ($fileContents) {
Trace("downloading: [$fileSrc}]");
} else {
print "Could not download: [{$fileSrc}]\n";
FatalError();
}
if ($save) {
CheckPath(dirname($fileDest));
if (@file_put_contents($fileDest,$fileContents)) {
Trace("saving: [{$fileDest}]");
} else {
print "Could not save: [{$fileDest}]\n";
FatalError();
}
}
return $fileContents;
}
function CleanPath($curPath) {
$path = $curPath;
if ($path == '') {
$path = './';
}
$path = str_replace('\\', '/', $path);
if ($path[strlen($path)-1] != '/') {
$path .= '/';
}
return $path;
}
function CheckPath($filePath) {
global $fbcmdPrefs;
if (!file_exists($filePath)) {
if (mkdir($filePath,octdec($fbcmdPrefs['mkdir_mode']),true)) {
Trace("creating [{$filePath}]");
} else {
print "Error creating [{$filePath}]\n";
FatalError();
}
}
}
function MakeLibDir() {
global $fbcmdPrefs;
global $isWindows;
global $isSudo;
global $sudoUser;
$dir = $fbcmdPrefs['install_lib_dir'];
if (!file_exists($dir)) {
if (mkdir($dir,octdec($fbcmdPrefs['install_lib_mkdir_mode']),true)) {
Trace("creating directory [{$dir}]");
} else {
print "Error: cound not create directory: [{$dir}]\n";
FatalError();
}
}
if (!$isWindows) {
if ($isSudo) {
if (isset($sudoUser)) {
if (chown($dir,$sudoUser)) {
Trace ("chown [{$dir}] [{$sudoUser}]");
} else {
print "error chown: [{$dir}] [{$sudoUser}] (non-fatal)\n";
}
}
if (chmod($dir,octdec($fbcmdPrefs['install_lib_mkdir_mode']))) {
Trace ("chmod [{$dir}]");
} else {
print "error chmod: [{$dir}] (non-fatal)\n";
}
}
}
}
function FatalError() {
global $isContinueOnError;
if ($isContinueOnError) {
print "Ignoring Error...\n";
return;
}
exit;
}
function PrintPref($key) {
global $fbcmdPrefs;
print str_pad($key,25,' ') . '[' . $fbcmdPrefs[$key] . "]\n";
}
function Trace($line) {
global $isTrace;
if ($isTrace) {
print "$line\n";
}
}
function TraceVar($varName) {
Trace("$varName = [" . $GLOBALS[$varName] . "]");
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Copied Directly from fbcmd.php
function SavePrefsContents() {
global $fbcmdPrefs;
$fileContents = "<?php\n";
foreach ($fbcmdPrefs as $switchKey => $switchValue) {
if ($switchKey != 'prefs') {
$fileContents .= " \$fbcmdPrefs['{$switchKey}'] = " . var_export($switchValue,true) . ";\n";
}
}
$fileContents .= "?>\n";
return $fileContents;
}
?>