Exemplo n.º 1
0
 /**
  * Delete a machine token from your account
  *
  * ## OPTIONS
  * [--machine-token-id=<id>]
  * : UUID or name of the site you want to delete
  *
  * [--force]
  * : to skip the confirmations
  */
 public function delete($args, $assoc_args)
 {
     $user = Session::getUser();
     $id = $assoc_args['machine-token-id'];
     if (empty($id)) {
         $this->failure('You must specify a machine token id to delete.');
     }
     // Find the token
     $machine_token = $user->machine_tokens->get($assoc_args['machine-token-id']);
     if (empty($machine_token)) {
         $this->failure('There are no machine tokens with the id {id}.', array('id' => $id));
     }
     $name = $machine_token->get('device_name');
     if (!isset($assoc_args['force']) && !Terminus::getConfig('yes')) {
         //If the force option isn't used, we'll ask you some annoying questions
         Input::confirm(array('message' => 'Are you sure you want to delete %s?', 'context' => $name));
     }
     $this->log()->info('Deleting {name} ...', array('name' => $name));
     $response = $machine_token->delete();
     if ($response['status_code'] == 200) {
         $this->log()->info('Deleted {name}!', array('name' => $name));
     } else {
         $this->failure('There was an problem deleting the machine token.');
     }
 }
Exemplo n.º 2
0
 /**
  * Complete wipe and reset a site
  *
  * ## OPTIONS
  *
  * [--site=<site>]
  * : Site to use
  *
  * [--env=<env>]
  * : Environment to be wiped
  */
 public function wipe($args, $assoc_args)
 {
     $site = $this->sites->get(Input::sitename($assoc_args));
     $env = $site->environments->get(Input::env(array('args' => $assoc_args, 'site' => $site)));
     Input::confirm(sprintf('Are you sure you want to wipe %s-%s?', $site->get('name'), $env->get('id')));
     $workflow = $env->wipe();
     $workflow->wait();
     $this->log()->info('Successfully wiped {site}-{env}', array('site' => $site->get('name'), 'env' => $env->get('id')));
 }
Exemplo n.º 3
0
/**
 * Ensures that the given destination is valid
 *
 * @param string $destination Location of directory to ensure viability of
 * @param bool   $make        True to create destination if it does not exist
 * @return string Same as the parameter
 * @throws TerminusException
 */
function destinationIsValid($destination, $make = true)
{
    if (file_exists($destination) and !is_dir($destination)) {
        throw new TerminusException('Destination given is a file. It must be a directory.');
    }
    if (!is_dir($destination)) {
        if (!$make) {
            $make = Input::confirm(array('message' => 'Directory does not exists. Create it now?'));
        }
        if ($make) {
            mkdir($destination, 0755);
        }
    }
    return $destination;
}
Exemplo n.º 4
0
 /**
  * List an organization's sites
  *
  * ## OPTIONS
  *
  * <add|remove|list>
  * : subfunction to run
  *
  * [--org=<id|name>]
  * : Organization UUID or name
  *
  * [--tag=<tag>]
  * : Tag name to filter sites list by
  *
  * [--site=<site>]
  * : Site to add to or remove from organization
  *
  * @subcommand sites
  */
 public function sites($args, $assoc_args)
 {
     $action = array_shift($args);
     $org_id = Input::orgId(array('args' => $assoc_args, 'allow_none' => false));
     // TODO: clarify that these are OrganizationMemberships, not Organization models
     $orgs = new UserOrganizationMemberships();
     $org = $orgs->get($org_id);
     $org_info = $org->get('organization');
     $org_model = new Organization($org_info);
     $memberships = $org->site_memberships->all();
     switch ($action) {
         case 'add':
             if (isset($assoc_args['site'])) {
                 if ($this->siteIsMember($memberships, $assoc_args['site'])) {
                     $this->failure('{site} is already a member of {org}', array('site' => $assoc_args['site'], 'org' => $org_info->profile->name));
                 } else {
                     $site = $this->sites->get($assoc_args['site']);
                 }
             } else {
                 $site = $this->sites->get(Input::menu(array('choices' => $this->getNonmemberSiteList($memberships), 'message' => 'Choose site')));
             }
             Input::confirm(array('message' => 'Are you sure you want to add %s to %s ?', 'context' => array($site->get('name'), $org_info->profile->name)));
             $workflow = $org_model->site_memberships->addMember($site);
             $workflow->wait();
             $this->workflowOutput($workflow);
             break;
         case 'remove':
             if (isset($assoc_args['site'])) {
                 if (!$this->siteIsMember($memberships, $assoc_args['site'])) {
                     $this->failure('{site} is not a member of {org}', array('site' => $assoc_args['site'], 'org' => $org_info->profile->name));
                 } else {
                     $site = $this->sites->get($assoc_args['site']);
                 }
             } else {
                 $site = $this->sites->get(Input::menu(array('choices' => $this->getMemberSiteList($memberships), 'message' => 'Choose site')));
             }
             $member = $org_model->site_memberships->get($site->get('id'));
             Input::confirm(array('message' => 'Are you sure you want to remove %s from %s ?', 'context' => array($site->get('name'), $org_info->profile->name)));
             $workflow = $member->removeMember();
             $workflow->wait();
             $this->workflowOutput($workflow);
             break;
         case 'list':
         default:
             foreach ($memberships as $membership) {
                 if (isset($assoc_args['tag']) && !in_array($assoc_args['tag'], $membership->get('tags'))) {
                     continue;
                 }
                 $site = $membership->get('site');
                 $data_array = array('name' => null, 'id' => null, 'service_level' => null, 'framework' => null, 'created' => null, 'tags' => $membership->get('tags'));
                 foreach ($data_array as $key => $value) {
                     if ($value == null && isset($site->{$key})) {
                         $data_array[$key] = $site->{$key};
                     }
                 }
                 $data_array['created'] = date('Y-m-dTH:i:s', strtotime($data_array['created']));
                 $data[] = $data_array;
             }
             $this->output()->outputRecordList($data);
             break;
     }
 }
Exemplo n.º 5
0
 /**
  * Update all dev sites with an available upstream update.
  *
  * ## OPTIONS
  *
  * [--report]
  * : If set output will contain list of sites and whether they are up-to-date
  *
  * [--upstream=<upstream>]
  * : Specify a specific upstream to check for updating.
  *
  * [--no-updatedb]
  * : Use flag to skip running update.php after the update has applied
  *
  * [--xoption=<theirs|ours>]
  * : Corresponds to git's -X option, set to 'theirs' by default
  *   -- https://www.kernel.org/pub/software/scm/git/docs/git-merge.html
  *
  * [--tag=<tag>]
  * : Tag to filter by
  *
  * [--org=<id>]
  * : Only necessary if using --tag. Organization which has tagged the site
  *
  * [--cached]
  * : Set to prevent rebuilding of sites cache
  *
  * @subcommand mass-update
  */
 public function massUpdate($args, $assoc_args)
 {
     // Ensure the sitesCache is up to date
     if (!isset($assoc_args['cached'])) {
         $this->sites->rebuildCache();
     }
     $upstream = Input::optional(array('key' => 'upstream', 'choices' => $assoc_args, 'default' => false));
     $data = array();
     $report = Input::optional(array('key' => 'report', 'choices' => $assoc_args, 'default' => false));
     $confirm = Input::optional(array('key' => 'confirm', 'choices' => $assoc_args, 'default' => false));
     $tag = Input::optional(array('key' => 'tag', 'choices' => $assoc_args, 'default' => false));
     $org = '';
     if ($tag) {
         $org = Input::orgId(array('args' => $assoc_args));
     }
     $sites = $this->sites->filterAllByTag($tag, $org);
     // Start status messages.
     if ($upstream) {
         $this->log()->info('Looking for sites using {upstream}.', compact('upstream'));
     }
     foreach ($sites as $site) {
         $context = array('site' => $site->get('name'));
         $site->fetch();
         $updates = $site->getUpstreamUpdates();
         if (!isset($updates->behind)) {
             // No updates, go back to start.
             continue;
         }
         // Check for upstream argument and site upstream URL match.
         $siteUpstream = $site->info('upstream');
         if ($upstream && isset($siteUpstream->url)) {
             if ($siteUpstream->url != $upstream) {
                 // Uptream doesn't match, go back to start.
                 continue;
             }
         }
         if ($updates->behind > 0) {
             $data[$site->get('name')] = array('site' => $site->get('name'), 'status' => 'Needs update');
             $env = $site->environments->get('dev');
             if ($env->getConnectionMode() == 'sftp') {
                 $message = '{site} has available updates, but is in SFTP mode.';
                 $message .= ' Switch to Git mode to apply updates.';
                 $this->log()->warning($message, $context);
                 $data[$site->get('name')] = array('site' => $site->get('name'), 'status' => 'Needs update - switch to Git mode');
                 continue;
             }
             $updatedb = !Input::optional(array('key' => 'updatedb', 'choices' => $assoc_args, 'default' => false));
             $xoption = !Input::optional(array('key' => 'xoption', 'choices' => $assoc_args, 'default' => 'theirs'));
             if (!$report) {
                 $message = 'Apply upstream updates to %s ';
                 $message .= '( run update.php:%s, xoption:%s ) ';
                 $confirmed = Input::confirm(array('message' => $message, 'context' => array($site->get('name'), var_export($updatedb, 1), var_export($xoption, 1)), 'exit' => false));
                 if (!$confirmed) {
                     continue;
                     // User says No, go back to start.
                 }
                 // Backup the DB so the client can restore if something goes wrong.
                 $this->log()->info('Backing up {site}.', $context);
                 $backup = $env->createBackup(array('element' => 'all'));
                 // Only continue if the backup was successful.
                 if ($backup) {
                     $this->log()->info('Backup of {site} created.', $context);
                     $this->log()->info('Updating {site}.', $context);
                     $response = $site->applyUpstreamUpdates($env->get('id'), $updatedb, $xoption);
                     $data[$site->get('name')]['status'] = 'Updated';
                     $this->log()->info('{site} is updated.', $context);
                 } else {
                     $data[$site->get('name')]['status'] = 'Backup failed';
                     $this->failure('There was a problem backing up {site}. Update aborted.', $context);
                 }
             }
         } else {
             if (isset($assoc_args['report'])) {
                 $data[$site->get('name')] = array('site' => $site->get('name'), 'status' => 'Up to date');
             }
         }
     }
     if (!empty($data)) {
         sort($data);
         $this->output()->outputRecordList($data);
     } else {
         $this->log()->info('No sites in need of updating.');
     }
 }