You are here

httpbl.drush.inc in http:BL 8

Drush integration for the httpbl module.

File

drush/httpbl.drush.inc
View source
<?php

/**
 * @file
 * Drush integration for the httpbl module.
 */
use Drupal\Component\Uuid\Php;
use Drupal\httpbl\Entity\Host;
use Drupal\httpbl\HostQuery;

/**
 * Implements hook_drush_command().
 */
function httpbl_drush_command() {
  $items['httpbl-sos'] = array(
    'description' => 'Unbans and white-lists an IP address, with an option to stop http:BL checking/blocking of all page requests. Use in emergencies if an admin locks out localhost while testing httpbl module. Easily used with only the options to control httpbl checking.',
    'arguments' => array(
      'ip' => 'IP address to unban (e.g. "127.0.0.1" for localhost).  Localhost is the default.',
    ),
    'options' => array(
      'stop' => 'Stops http:BL checking/blocking of all page requests.',
      'start' => 'Start http:BL checking/blocking of all page requests (no harm done if it\'s already running).',
      'comment' => 'Start http:BL checking/blocking on comment submissions only.',
    ),
    'examples' => array(
      'httpbl-sos (or drush sos)' => 'Unban and white-list localhost by default.',
      'httpbl-sos --stop' => 'Unban and white-list localhost by default, and stop checking/blocking of all page requests.',
      'httpbl-sos 127.0.0.1' => 'Unban and white-list (any) specified ip address.',
      'httpbl-sos 127.0.0.1 --stop' => 'Same as above and stop checking/blocking of all page requests.',
      'httpbl-sos 127.0.0.1 --start' => 'Unban and white-list (any) specified ip address and start checking/blocking of all page requests.',
      'drush sos --comment' => 'Start checking on comment submissions only, and unban/white-list localhost if needed.',
    ),
    'required-arguments' => 0,
    'aliases' => [
      'sos',
    ],
  );
  $items['httpbl-mho'] = array(
    'description' => 'Quickly make up to 255 evaluated hosts of a certain status and expire time. (Hint: use this to test httpbl cron)',
    'arguments' => array(
      'max' => 'The number of hosts to be generated. Default is 255.',
      'status' => 'The status (0=safe, 1=blackisted, 2=grey-listed). Default is 0.',
      'offset' => 'The time from now the host should expire. Default is 300.',
      'pattern' => 'The pattern used for IP addresses.  Default is "127.0.1.".',
    ),
    'examples' => array(
      'httpbl-mho (or drush mho)' => 'Use defaults and create 255 safe hosts that expire in 5 minutes.',
      'drush mho 50 2 60' => 'Make 50 grey-listed hosts that expire in 1 minute.',
      'drush mho 25 1 60 129.0.1.' => 'Make 25 blacklisted hosts that expire in 1 minute, starting with 129.0.1.1.',
    ),
    'required-arguments' => 0,
    'aliases' => [
      'mho',
    ],
  );
  $items['httpbl-mbb'] = array(
    'description' => 'Quickly make up to 255 blacklisted and banned hosts of a certain expire time (Hint: use this to test httpbl cron)',
    'arguments' => array(
      'max' => 'The number of hosts to be generated. Default is 255.',
      'offset' => 'The time from now the host should expire. Default is 300.',
      'pattern' => 'The pattern used for IP addresses.  Default is "127.1.8.".',
    ),
    'examples' => array(
      'httpbl-mbb (or drush mbb)' => 'Use defaults and create 255 blacklisted and banned hosts that expire in 5 minutes.',
      'drush mbb 50 60' => 'Make 50 blacklisted and banned hosts that expire in 1 minute.',
      'drush mbb 25 60 129.0.1.' => 'Make 25 blacklisted and banned hosts that expire in 1 minute, starting with 129.0.1.1.',
    ),
    'required-arguments' => 0,
    'aliases' => [
      'mbb',
    ],
  );
  $items['httpbl-sol'] = array(
    'description' => 'Remove localhost or another testing ip from hosts.',
    'arguments' => array(
      'ip' => 'IP address to remove (e.g. "127.0.0.1" for localhost).  Localhost is the default.',
    ),
    'examples' => array(
      'httpbl-sol (or drush sol)' => 'Remove localhost from host.',
      'drush sol 127.0.0.1' => 'Remove specific ip from host.',
    ),
    'required-arguments' => 0,
    'aliases' => [
      'sol',
    ],
  );
  return $items;
}

/**
 * Command handler. Unban IP address and stop/stop checking/blocking of all page
 * requests or on comment submissions only.
 */
function drush_httpbl_sos($ip = '127.0.0.1') {

  // Get Ban manager service and unBan if banned.
  $banManager = \Drupal::service('ban.ip_manager');
  if ($banManager
    ->isBanned($ip)) {
    $banManager
      ->unbanIp($ip);
    $logMessage = t('Drush SOS unbanned @ip.', [
      '@ip' => $ip,
    ]);
    drush_log(dt($logMessage), 'ok');
    \Drupal::logger('httpbl')
      ->notice($logMessage);
  }
  else {
    drush_log(dt('@ip was not banned.', [
      '@ip' => $ip,
    ]), 'ok');
  }

  // Get Evaluator service and whitelist this IP.
  $httpblEvaluator = \Drupal::service('httpbl.evaluator');
  $status = $httpblEvaluator
    ->getIpLocalStatus($ip);
  if ($status != 0) {
    $httpblEvaluator
      ->drushWhitelist($ip);
    $logMessage = t('Drush SOS whitelisted @ip.', [
      '@ip' => $ip,
    ]);
    drush_log(dt($logMessage), 'ok');
    \Drupal::logger('httpbl')
      ->notice($logMessage);
  }
  else {
    drush_log(dt('@ip was already white-listed or was not found.', [
      '@ip' => $ip,
    ]), 'ok');
  }

  // Stop option:
  if (drush_get_option('stop', FALSE)) {
    $command = drush_state_set($key = 'httpbl.check', $value = 0);
    $logMessage = t('Drush SOS stopped Httpbl page checking/blocking.');
    \Drupal::logger('httpbl')
      ->warning($logMessage);
    return $command;
  }
  elseif (drush_get_option('start', FALSE)) {
    $command = drush_state_set($key = 'httpbl.check', $value = 2);
    $logMessage = t('Drush SOS started or restarted Httpbl page checking/blocking.');
    drush_log(dt($logMessage), 'ok');
    \Drupal::logger('httpbl')
      ->notice($logMessage);
    return $command;
  }
  elseif (drush_get_option('comment', FALSE)) {
    $command = drush_state_set($key = 'httpbl.check', $value = 1);
    $logMessage = t('Drush SOS started checking/blocking on comment submissions only.');

    // Drush log only needed for feedback when the drupal logger is below warning level.

    //drush_log(dt($logMessage), 'ok');
    \Drupal::logger('httpbl')
      ->warning($logMessage);
    return $command;
  }
  else {
    return;
  }
}

/**
 * Command handler. Make dummy evalutated hosts (for testing).
 *
 */
function drush_httpbl_mho($max = 255, $status = 0, $offset = 300, $pattern = '127.0.1.') {
  $limit = 255;
  $max <= $limit ?: ($max = $limit);
  $logMessage = t('Making @max hosts of status @stat to expire in @time seconds, with pattern @pat.', [
    '@max' => $max,
    '@stat' => $status,
    '@time' => $offset,
    '@pat' => $pattern,
  ]);

  // Get Evaluator service and whitelist this IP.
  $httpblEvaluator = \Drupal::service('httpbl.evaluator');
  $command = $httpblEvaluator
    ->makeHosts($max, $status, $offset, $pattern);
  drush_log(dt($logMessage), 'ok');
  return $command;
}

/**
 * Command handler. Make dummy blacklisted and banned hosts (for testing).
 *
 */
function drush_httpbl_mbb($max = 255, $offset = 300, $pattern = '127.1.8.') {
  $limit = 255;
  $max <= $limit ?: ($max = $limit);
  $logMessage = t('Making @max blacklisted AND banned hosts to expire in @time seconds, with pattern @pat.', [
    '@max' => $max,
    '@time' => $offset,
    '@pat' => $pattern,
  ]);

  // Get Evaluator service and whitelist this IP.
  $httpblEvaluator = \Drupal::service('httpbl.evaluator');
  $command = $httpblEvaluator
    ->makeBannedHosts($max, $offset, $pattern);
  drush_log(dt($logMessage), 'ok');
  return $command;
}

/**
 * Command handler. Quickly remove localhost (or any given IP) from ban & httpbl
 * tabled.  Useful for testing.
 */
function drush_httpbl_sol($ip = '127.0.0.1') {

  // Get Ban manager service and unBan if banned.
  $banManager = \Drupal::service('ban.ip_manager');
  if ($banManager
    ->isBanned($ip)) {
    $banManager
      ->unbanIp($ip);
    $logMessage = t('Drush SOL unbanned @ip.', [
      '@ip' => $ip,
    ]);
    drush_log(dt($logMessage), 'ok');
    \Drupal::logger('httpbl')
      ->notice($logMessage);
  }
  else {
    drush_log(dt('@ip was not banned.', [
      '@ip' => $ip,
    ]), 'ok');
  }

  // Get Evaluator service and delete this IP.
  $httpblEvaluator = \Drupal::service('httpbl.evaluator');
  $status = $httpblEvaluator
    ->getIpLocalStatus($ip);
  if ($status != NULL) {

    // Gather all hosts with this IP.
    $hosts = HostQuery::loadHostsByIp($ip);

    // If we have some, count them.
    if (isset($hosts) && !empty($hosts)) {
      $count = count($hosts);

      // As long as there's more than one...
      while ($count > 0) {

        // Sort them in order by index.
        ksort($hosts);

        // Get that host and delete it.
        $id = key($hosts);
        $host = Host::load($id);
        $host
          ->delete();

        // Reverse sort the array and remove the last one.
        arsort($hosts);
        array_pop($hosts);

        // Rinse and repeat.
        $count--;
      }
      drush_log(dt('@ip was removed from evaluated hosts.', [
        '@ip' => $ip,
      ]), 'ok');
    }
    else {
      drush_log(dt('@ip was not an evaluated host.', [
        '@ip' => $ip,
      ]), 'ok');
    }
  }
  else {
    drush_log(dt('@ip was not an evaluated host.', [
      '@ip' => $ip,
    ]), 'ok');
  }
  return;
}

Functions

Namesort descending Description
drush_httpbl_mbb Command handler. Make dummy blacklisted and banned hosts (for testing).
drush_httpbl_mho Command handler. Make dummy evalutated hosts (for testing).
drush_httpbl_sol Command handler. Quickly remove localhost (or any given IP) from ban & httpbl tabled. Useful for testing.
drush_httpbl_sos Command handler. Unban IP address and stop/stop checking/blocking of all page requests or on comment submissions only.
httpbl_drush_command Implements hook_drush_command().