Fixed paths for pypo and the show recorder. Pypo and the show recorder now read their paths from the INI files. Note that liquidsoap and shell scripts do not yet read from the INI files, and so that paths are hard-coded in those places. On uninstall, no longer deleting INI files and the STOR directory. Included a note to remove those by hand if they want them gone. Fixed some bugs where not all directories were removed on uninstall. Fixed bugs in the Show Recorder install where it was adding directories that it didnt need.
322 lines
11 KiB
PHP
322 lines
11 KiB
PHP
<?php
|
|
//Pear classes.
|
|
set_include_path(__DIR__.'/../../airtime_mvc/library/pear' . PATH_SEPARATOR . get_include_path());
|
|
require_once('DB.php');
|
|
|
|
class AirtimeInstall
|
|
{
|
|
const CONF_DIR_BINARIES = "/usr/lib/airtime";
|
|
const CONF_DIR_STORAGE = "/srv/airtime";
|
|
const CONF_DIR_WWW = "/var/www/airtime";
|
|
|
|
public static function GetAirtimeSrcDir()
|
|
{
|
|
return __DIR__."/../../airtime_mvc";
|
|
}
|
|
|
|
public static function GetUtilsSrcDir()
|
|
{
|
|
return __DIR__."/../../utils";
|
|
}
|
|
|
|
/**
|
|
* Ensures that the user is running this PHP script with root
|
|
* permissions. If not running with root permissions, causes the
|
|
* script to exit.
|
|
*/
|
|
public static function ExitIfNotRoot()
|
|
{
|
|
// Need to check that we are superuser before running this.
|
|
if(exec("whoami") != "root"){
|
|
echo "Must be root user.\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
public static function DbTableExists($p_name)
|
|
{
|
|
global $CC_DBC;
|
|
$sql = "SELECT * FROM ".$p_name;
|
|
$result = $CC_DBC->GetOne($sql);
|
|
if (PEAR::isError($result)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static function InstallQuery($sql, $verbose = true)
|
|
{
|
|
global $CC_DBC;
|
|
$result = $CC_DBC->query($sql);
|
|
if (PEAR::isError($result)) {
|
|
echo "Error! ".$result->getMessage()."\n";
|
|
echo " SQL statement was:\n";
|
|
echo " ".$sql."\n\n";
|
|
} else {
|
|
if ($verbose) {
|
|
echo "done.\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function DbConnect($p_exitOnError = true)
|
|
{
|
|
global $CC_DBC, $CC_CONFIG;
|
|
$CC_DBC = DB::connect($CC_CONFIG['dsn'], FALSE);
|
|
if (PEAR::isError($CC_DBC)) {
|
|
echo $CC_DBC->getMessage().PHP_EOL;
|
|
echo $CC_DBC->getUserInfo().PHP_EOL;
|
|
echo "Database connection problem.".PHP_EOL;
|
|
echo "Check if database '{$CC_CONFIG['dsn']['database']}' exists".
|
|
" with corresponding permissions.".PHP_EOL;
|
|
if ($p_exitOnError) {
|
|
exit(1);
|
|
}
|
|
} else {
|
|
echo "* Connected to database".PHP_EOL;
|
|
$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
|
|
}
|
|
}
|
|
|
|
public static function ChangeDirOwnerToWebserver($filePath)
|
|
{
|
|
global $CC_CONFIG;
|
|
echo "* Giving Apache permission to access $filePath".PHP_EOL;
|
|
|
|
$success = chgrp($filePath, $CC_CONFIG["webServerUser"]);
|
|
$fileperms=@fileperms($filePath);
|
|
$fileperms = $fileperms | 0x0010; // group write bit
|
|
$fileperms = $fileperms | 0x0400; // group sticky bit
|
|
chmod($filePath, $fileperms);
|
|
}
|
|
|
|
public static function InstallStorageDirectory($CC_CONFIG)
|
|
{
|
|
global $CC_CONFIG, $CC_DBC;
|
|
echo "* Storage directory setup".PHP_EOL;
|
|
|
|
foreach (array('baseFilesDir', 'storageDir') as $d) {
|
|
if ( !file_exists($CC_CONFIG[$d]) ) {
|
|
@mkdir($CC_CONFIG[$d], 02775, true);
|
|
if (file_exists($CC_CONFIG[$d])) {
|
|
$rp = realpath($CC_CONFIG[$d]);
|
|
echo "* Directory $rp created".PHP_EOL;
|
|
} else {
|
|
echo "* Failed creating {$CC_CONFIG[$d]}".PHP_EOL;
|
|
exit(1);
|
|
}
|
|
} elseif (is_writable($CC_CONFIG[$d])) {
|
|
$rp = realpath($CC_CONFIG[$d]);
|
|
echo "* Skipping directory already exists: $rp".PHP_EOL;
|
|
} else {
|
|
$rp = realpath($CC_CONFIG[$d]);
|
|
echo "* WARNING: Directory already exists, but is not writable: $rp".PHP_EOL;
|
|
}
|
|
$CC_CONFIG[$d] = $rp;
|
|
}
|
|
}
|
|
|
|
public static function CreateDatabaseUser()
|
|
{
|
|
global $CC_CONFIG;
|
|
|
|
echo "* Creating Airtime database user".PHP_EOL;
|
|
|
|
// Create the database user
|
|
$command = "sudo -u postgres psql postgres --command \"CREATE USER {$CC_CONFIG['dsn']['username']} "
|
|
." ENCRYPTED PASSWORD '{$CC_CONFIG['dsn']['password']}' LOGIN CREATEDB NOCREATEUSER;\" 2>/dev/null";
|
|
|
|
@exec($command, $output, $results);
|
|
if ($results == 0) {
|
|
echo "* Database user '{$CC_CONFIG['dsn']['username']}' created.".PHP_EOL;
|
|
} else {
|
|
if (count($output) > 0) {
|
|
echo "* Could not create user '{$CC_CONFIG['dsn']['username']}': ".PHP_EOL;
|
|
echo implode(PHP_EOL, $output);
|
|
}
|
|
else {
|
|
echo "* Database user '{$CC_CONFIG['dsn']['username']}' already exists.".PHP_EOL;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function CreateDatabase()
|
|
{
|
|
global $CC_CONFIG;
|
|
|
|
echo "* Creating Airtime database".PHP_EOL;
|
|
|
|
$command = "sudo -u postgres createdb {$CC_CONFIG['dsn']['database']} --owner {$CC_CONFIG['dsn']['username']} 2> /dev/null";
|
|
@exec($command, $output, $results);
|
|
if ($results == 0) {
|
|
echo "* Database '{$CC_CONFIG['dsn']['database']}' created.".PHP_EOL;
|
|
} else {
|
|
if (count($output) > 0) {
|
|
echo "* Could not create database '{$CC_CONFIG['dsn']['database']}': ".PHP_EOL;
|
|
echo implode(PHP_EOL, $output);
|
|
}
|
|
else {
|
|
echo "* Database '{$CC_CONFIG['dsn']['database']}' already exists.".PHP_EOL;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function InstallPostgresScriptingLanguage()
|
|
{
|
|
global $CC_DBC;
|
|
|
|
echo "* Installing Postgresql scripting language".PHP_EOL;
|
|
|
|
// Install postgres scripting language
|
|
$langIsInstalled = $CC_DBC->GetOne('SELECT COUNT(*) FROM pg_language WHERE lanname = \'plpgsql\'');
|
|
if ($langIsInstalled == '0') {
|
|
echo "* Installing Postgres scripting language".PHP_EOL;
|
|
$sql = "CREATE LANGUAGE 'plpgsql'";
|
|
AirtimeInstall::InstallQuery($sql, false);
|
|
} else {
|
|
echo "* Postgres scripting language already installed".PHP_EOL;
|
|
}
|
|
}
|
|
|
|
public static function CreateDatabaseTables()
|
|
{
|
|
echo "* Creating database tables".PHP_EOL;
|
|
|
|
// Put Propel sql files in Database
|
|
$command = AirtimeInstall::CONF_DIR_WWW."/library/propel/generator/bin/propel-gen ".AirtimeInstall::CONF_DIR_WWW."/build/ insert-sql 2>propel-error.log";
|
|
@exec($command, $output, $results);
|
|
}
|
|
|
|
public static function BypassMigrations($dir, $version)
|
|
{
|
|
$appDir = AirtimeInstall::GetAirtimeSrcDir();
|
|
$command = "php $appDir/library/doctrine/migrations/doctrine-migrations.phar ".
|
|
"--configuration=$dir/../../DoctrineMigrations/migrations.xml ".
|
|
"--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ".
|
|
"--no-interaction --add migrations:version $version";
|
|
system($command);
|
|
}
|
|
|
|
public static function MigrateTablesToVersion($dir, $version)
|
|
{
|
|
$appDir = AirtimeInstall::GetAirtimeSrcDir();
|
|
$command = "php $appDir/library/doctrine/migrations/doctrine-migrations.phar ".
|
|
"--configuration=$dir/../../DoctrineMigrations/migrations.xml ".
|
|
"--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ".
|
|
"--no-interaction migrations:migrate $version";
|
|
system($command);
|
|
}
|
|
|
|
public static function SetAirtimeVersion($p_version)
|
|
{
|
|
global $CC_DBC;
|
|
$sql = "DELETE FROM cc_pref WHERE keystr = 'system_version'";
|
|
$CC_DBC->query($sql);
|
|
|
|
$sql = "INSERT INTO cc_pref (keystr, valstr) VALUES ('system_version', '$p_version')";
|
|
$result = $CC_DBC->query($sql);
|
|
if (PEAR::isError($result)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static function GetAirtimeVersion()
|
|
{
|
|
global $CC_DBC;
|
|
$sql = "SELECT valstr FROM cc_pref WHERE keystr = 'system_version'";
|
|
$version = $CC_DBC->GetOne($sql);
|
|
|
|
if (PEAR::isError($version)) {
|
|
return false;
|
|
}
|
|
return $version;
|
|
}
|
|
|
|
public static function DeleteFilesRecursive($p_path)
|
|
{
|
|
$command = "rm -rf $p_path";
|
|
exec($command);
|
|
}
|
|
|
|
public static function CreateSymlinksToUtils()
|
|
{
|
|
echo "* Creating /usr/bin symlinks".PHP_EOL;
|
|
AirtimeInstall::RemoveSymlinks();
|
|
|
|
echo "* Installing airtime-import".PHP_EOL;
|
|
$dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-import";
|
|
exec("ln -s $dir /usr/bin/airtime-import");
|
|
|
|
echo "* Installing airtime-clean-storage".PHP_EOL;
|
|
$dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-clean-storage";
|
|
exec("ln -s $dir /usr/bin/airtime-clean-storage");
|
|
|
|
echo "* Installing airtime-update-db-settings".PHP_EOL;
|
|
$dir = AirtimeInstall::CONF_DIR_BINARIES."/utils/airtime-update-db-settings";
|
|
exec("ln -s $dir /usr/bin/airtime-update-db-settings");
|
|
}
|
|
|
|
public static function RemoveSymlinks()
|
|
{
|
|
exec("rm -f /usr/bin/airtime-import");
|
|
exec("rm -f /usr/bin/airtime-clean-storage");
|
|
exec("rm -f /usr/bin/airtime-update-db-settings");
|
|
}
|
|
|
|
public static function InstallPhpCode()
|
|
{
|
|
global $CC_CONFIG;
|
|
echo "* Installing PHP code to ".AirtimeInstall::CONF_DIR_WWW.PHP_EOL;
|
|
exec("mkdir -p ".AirtimeInstall::CONF_DIR_WWW);
|
|
exec("cp -R ".AirtimeInstall::GetAirtimeSrcDir()."/* ".AirtimeInstall::CONF_DIR_WWW);
|
|
|
|
}
|
|
|
|
public static function UninstallPhpCode()
|
|
{
|
|
echo "* Removing PHP code from ".AirtimeInstall::CONF_DIR_WWW.PHP_EOL;
|
|
exec("rm -rf ".AirtimeInstall::CONF_DIR_WWW);
|
|
}
|
|
|
|
public static function InstallBinaries()
|
|
{
|
|
echo "* Installing binaries to ".AirtimeInstall::CONF_DIR_BINARIES.PHP_EOL;
|
|
exec("mkdir -p ".AirtimeInstall::CONF_DIR_BINARIES);
|
|
exec("cp -R ".AirtimeInstall::GetUtilsSrcDir()." ".AirtimeInstall::CONF_DIR_BINARIES);
|
|
}
|
|
|
|
public static function UninstallBinaries()
|
|
{
|
|
echo "* Removing Airtime binaries from ".AirtimeInstall::CONF_DIR_BINARIES.PHP_EOL;
|
|
exec("rm -rf ".AirtimeInstall::CONF_DIR_BINARIES);
|
|
}
|
|
|
|
public static function DirCheck()
|
|
{
|
|
echo "Legend: \"+\" means the dir/file exists, \"-\" means that it does not.".PHP_EOL;
|
|
$dirs = array(AirtimeInstall::CONF_DIR_BINARIES,
|
|
AirtimeInstall::CONF_DIR_STORAGE,
|
|
AirtimeInstall::CONF_DIR_WWW,
|
|
AirtimeIni::CONF_FILE_AIRTIME,
|
|
AirtimeIni::CONF_FILE_LIQUIDSOAP,
|
|
AirtimeIni::CONF_FILE_PYPO,
|
|
AirtimeIni::CONF_FILE_RECORDER,
|
|
"/usr/lib/airtime/pypo",
|
|
"/usr/lib/airtime/show-recorder",
|
|
"/var/log/airtime",
|
|
"/var/log/airtime/pypo",
|
|
"/var/log/airtime/show-recorder",
|
|
"/var/tmp/airtime/pypo",
|
|
"/var/tmp/airtime/show-recorder");
|
|
foreach ($dirs as $f) {
|
|
if (file_exists($f)) {
|
|
echo "+ $f".PHP_EOL;
|
|
} else {
|
|
echo "- $f".PHP_EOL;
|
|
}
|
|
}
|
|
}
|
|
}
|