on('exit', function($exitCode, $termSignal) use ($ResponseArray) { global $clients; if($exitCode == 0) { $ResponseArray['response_type'] = "success"; $ResponseArray['response_code'] = "LCM_200E"; } else { $ResponseArray['response_type'] = "failed"; $ResponseArray['response_code'] = "LCM_500E"; } $ResponseArray['response_exit_code'] = $exitCode; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stdout->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDO"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stderr->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDE"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); } function Libertine_RemovePackage($sql) { if(!file_exists("/userdata")) { // As Libertine is ONLY to be used on Ubuntu for Mobile devices, this command will error if it is used without a utouch device. $ResponseArray['response_type'] = "error"; $ResponseArray['response_msg'] = "This machine is not an Ubuntu Touch workstation, Libertine commands are only available on Ubuntu Touch."; $ResponseArray['response_code'] = 500; return json_encode($ResponseArray); } $process = new React\ChildProcess\Process('exec libertine-container-manager remove-package -p "'.$sql['PACKAGE']); $programRequestCode = sha1("REMOVE_LIBERTINE_".$sql['PACKAGE']); $ResponseArray = array(); $ResponseArray['response_process_marker'] = $programRequestCode; $process->on('exit', function($exitCode, $termSignal) use ($ResponseArray) { global $clients; if($exitCode == 0) { $ResponseArray['response_type'] = "success"; $ResponseArray['response_code'] = "LCM_200E"; } else { $ResponseArray['response_type'] = "failed"; $ResponseArray['response_code'] = "LCM_500E"; } $ResponseArray['response_exit_code'] = $exitCode; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stdout->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDO"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stderr->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDE"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); } function Libertine_CreateContainer($sql) { if(!file_exists("/userdata")) { // As Libertine is ONLY to be used on Ubuntu for Mobile devices, this command will error if it is used without a utouch device. $ResponseArray['response_type'] = "error"; $ResponseArray['response_msg'] = "This machine is not an Ubuntu Touch workstation, Libertine commands are only available on Ubuntu Touch."; $ResponseArray['response_code'] = 500; return json_encode($ResponseArray); } if(isset($sql['CONTAINER']['container-settings']['id'])) $ContainerID = 'applications'; if(isset($sql['CONTAINER']['container-settings']['name'])) $ContainerName = 'Applications'; } function Libertine_ConfAptRepository($sql) { if(!file_exists("/userdata")) { // As Libertine is ONLY to be used on Ubuntu for Mobile devices, this command will error if it is used without a utouch device. $ResponseArray['response_type'] = "error"; $ResponseArray['response_msg'] = "This machine is not an Ubuntu Touch workstation, Libertine commands are only available on Ubuntu Touch."; $ResponseArray['response_code'] = 500; return json_encode($ResponseArray); } if($sql['REPOSITORY']['operation'] == "add") $process = new React\ChildProcess\Process('exec sudo -u phablet libertine-container-manager configure -a '.$sql['REPOSITORY']['repository']); if($sql['REPOSITORY']['operation'] == "del" OR $sql['REPOSITORY']['operation'] == "delete") $process = new React\ChildProcess\Process('exec sudo -u phablet libertine-container-manager configure -d '.$sql['REPOSITORY']['repository']); if(!$process) { $ResponseArray = array("response_type"=>"error", "response_msg"=>"Incorrect operation specified. Accepted options: add, del, delete", "response_code"=>"LCM_500"); return json_encode($ResponseArray); } else { $process->on('exit', function($exitCode, $termSignal) { global $clients; if($exitCode > 0) { $ResponseArray = array("response_type"=>"error", "response_msg"=>"Repository management request failed.", "lcm_exit_code"=>$exitCode, "response_code"=>"LCM_500"); } else { $ResponseArray = array("response_type"=>"success", "response_msg"=>"Repository management request succeeded.", "lcm_exit_code"=>$exitCode, "response_code"=>"LCM_200"); } foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $ResponseArray = array("response_type"=>"success", "response_msg"=>"LCM spawned to process management request.", "response_code"=>"LCM_200"); return json_encode($ResponseArray); } } function Libertine_GetContainers($sql) { if(!file_exists("/userdata")) { // As Libertine is ONLY to be used on Ubuntu for Mobile devices, this command will error if it is used without a utouch device. $ResponseArray['response_type'] = "error"; $ResponseArray['response_msg'] = "This machine is not an Ubuntu Touch workstation, Libertine commands are only available on Ubuntu Touch."; $ResponseArray['response_code'] = 500; return json_encode($ResponseArray); } if(file_exists("/home/phablet/.local/share/libertine/ContainersConfig.json")) { $ContainersConfig = file_get_contents("/home/phablet/.local/share/libertine/ContainersConfig.json"); $Containers = json_decode($ContainerConfig); } else { $ResponseArray = array("response_type"=>"error", "response_msg"=>"Container Configuration wsa not foudn.", "error_code"=>"LCM_500NC"); return json_encode($ResponseArray); } if(isset($sql['STATUS']['container-id'])) { foreach ($Containers->containerList as $Container) { if($Container->id == $sql['STATUS']['container-id']) { $ContainerArray = array('id'=>$Container->id, 'name'=>$Contianer->name, 'distribution'=>$Container->distro, 'status'=>$Container->installStatus, 'applications'=>$Container->installedApps); } else { continue; } } $ResponseArray = array("response_type"=>"success", "response_data"=>$ContainerArray, "response_code"=>"LCM_200S"); } else { foreach ($Containers->containerLsit as $Container) { if($Container->id == $Containers->defaultContainer) { $ContainerArray = array('id'=>$Container->id, 'name'=>$Contianer->name, 'distribution'=>$Container->distro, 'status'=>$Container->installStatus, 'applications'=>$Container->installedApps); } else { continue; } } $ResponseArray = array("resposne_type"=>"success", "response_data"=>$ContainerArray, "response_code"=>"LCM_200S"); } return json_encode($ResponseArray); } function Libertine_ExecContainer($sql) { global $loop; if(!file_exists("/userdata")) { // As Libertine is ONLY to be used on Ubuntu for Mobile devices, this command will error if it is used without a utouch device. $ResponseArray['response_type'] = "error"; $ResponseArray['response_msg'] = "This machine is not an Ubuntu Touch workstation, Libertine commands are only available on Ubuntu Touch."; $ResponseArray['response_code'] = 500; return json_encode($ResponseArray); } $process = new React\ChildProcess\Process('exec libertine-container-manager exec -c "'.$sql['CONTAINER']['command']); $programRequestCode = sha1($sql['CONTAINER']['command']); $ResponseArray = array(); $ResponseArray['response_process_marker'] = $programRequestCode; $process->on('exit', function($exitCode, $termSignal) use ($ResponseArray) { global $clients; if($exitCode == 0) { $ResponseArray['response_type'] = "success"; $ResponseArray['response_code'] = "LCM_200E"; } else { $ResponseArray['response_type'] = "failed"; $ResponseArray['response_code'] = "LCM_500E"; } $ResponseArray['response_exit_code'] = $exitCode; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stdout->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDO"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); $process->stderr->on('data', function($output) use ($ResponseArray) { global $clients; $ResponseArray['response_type'] = "status"; $ResponseArray['response_msg'] = $output; $ResponseArray['response_code'] = "LCM_STDE"; foreach ($clients as $client) { $client->write(json_encode($ResponseArray)); } }); } /** * * @param unknown $sql */ function SetWallpaper($sql) { } /** * * @param unknown $sql * @return unknown */ function SetLauncherIcon($sql) { $DesktopArray = $sql['ICON']; if(!file_exists("/etc")) { // We're not running a unix-based OS, error out. $ResponseArray = array("response_type"=>"error", "response_msg"=>"Members of the Windows family are not yet supported by this module.", "response_code"=>500); return $ResponseArray; } /** As we're going to be expanding Overwatch's reach to all systems, the below code will eventually need to be optimized." * if (!file_exists("/home/phablet")) { * $ErrorArray = array("response_type"=>"error", "error_msg"=>"This device is not an Ubuntu Touch workstation.", "error_code"=>505); * return json_encode($ErrorArray); * } **/ if (!file_exists("/home/phablet/.local/share/applications/".$DesktopArray['name'].".desktop")) { $ErrorArray = array("response_type"=>"error", "error_msg"=>"Desktop File does not Exist.", "error_code"=>404); return json_encode($ErrorArray); } $desktop = IniFile::LoadFromFile("/home/phablet/.local/share/applications/".$DesktopArray['name'].".desktop"); $desktop->SetKey("Desktop Entry", "Icon",$DesktopArray['icon']); $desktop->Save(); } function UploadResource($sql) { $FileArray = $sql['RESOURCE']; $fileMD5 = $FileArray['MD5']; $fileContents = base64_decode($FileArray['contents']); $destination = $FileArray['dest']; // This code is ready for use, but inactive as ReactPHP does not have Filesystem I/O yet. //$filesystem = \React\Filesystem\Filesystem::create($loop); //$filesystem->file($destination)->open('cwt')->then(function ($stream) { // $stream->end($fileContents); //}); file_put_contents($destination, $fileContents); $MD5 = md5_file($destination); \Overwatch\SDK\v1\Utility::Log("Uploaded MD5: ".$fileMD5.", Local MD5:".$MD5, "WorkstationServices"); if ($MD5 != $fileMD5) { $ErrorArray = array("response_type"=>"error", "error_msg"=>"MD5 Checksums do not match. File may be corrupt.", "error_code"=>500); return json_encode($ErrorArray); } else { $ResponseArray = array("response_type"=>"success", "response_msg"=>"File uploaded successfully to ".$destination, "response_code"=>200); return json_encode($ResponseArray); } } function module_loaded() { self::API_Register(); return true; } function GetFreeSpace($sql) { if($sql['SPACE']['volume'] == null) { $responseArray = array ("response_type"=>"error", "response_msg"=>"You need to supply a volume.", "response_code"=>500); return json_encode($responseArray); } $resultArray = array("response_type"=>"success", "response_msg"=>disk_free_space($sql['SPACE']['volume']), "response_code"=>200); return json_encode($resultArray); } function GetStorageCapacity($sql) { if($sql['SPACE']['volume'] == null) { $responseArray = array ("response_type"=>"error", "response_msg"=>"You need to supply a volume.", "response_code"=>500); return json_encode($responseArray); } $resultArray = array("response_type"=>"success", "response_msg"=>disk_total_space($sql['SPACE']['volume']), "response_code"=>200); return json_encode($resultArray); } function CreateDesktopFile($sql) { // Check for the existance of the requested .desktop file. if(!file_exists("/etc")) { // We're not running a unix-based OS, error out. $ResponseArray = array("response_type"=>"error", "response_msg"=>"Members of the Windows family are not yet supported by this module.", "response_code"=>500); return $ResponseArray; } $DesktopArray = $sql['SHORTCUT']; if (!file_exists("/usr/share/applications/".$DesktopArray['name'].".desktop")) { $ErrorArray = array("response_type"=>"error","error_msg"=>"Desktop File does not Exist.", "error_code"=>404); return json_encode($ErrorArray); } if (!file_exists("/home/phablet")) { $ErrorArray = array("response_type"=>"error", "error_msg"=>"This device is not an Ubuntu Touch workstation.", "error_code"=>505); return json_encode($ErrorArray); } copy("/usr/share/applications/".$DesktopArray['name'].".desktop", "/home/phablet/.local/share/applications/".$DesktopArray['name'].".desktop"); $desktop = IniFile::LoadFromFile("/home/phablet/.local/share/applications/".$DesktopArray['name'].".desktop"); $ExecLine = $desktop->GetKey("Desktop Entry","Exec"); $ExecLine = "/home/phablet/bin/wm-wrapper " . $ExecLine; $desktop->SetKey("Desktop Entry", "Exec", $ExecLine); $desktop->SetKey("Desktop Entry", "X-Ubuntu-Touch", "true"); $desktop->SetKey("Desktop Entry", "X-Ubuntu-XMir-Enable", "true"); $desktop->Save(); $ResultArray = array("response_type"=>"success", "response_msg"=>"Desktop file created successfully.", "response_code"=>200); } function RemoveDesktopFile($sql) { if(!file_exists("/etc")) { // We're not running a unix-based OS, error out. $ResponseArray = array("response_type"=>"error", "response_msg"=>"Members of the Windows family are not yet supported by this module.", "response_code"=>500); return $ResponseArray; } $DesktopArray = $sql['SHORTCUT']; unlink("/home/phablet/.local/share/applications/".$DesktopArray['name'].".desktop"); } } ?>