function cmd::block::run() {
  local name="" identity="" type="" block_name=""
  local ips=() subnets=() ports=() services=()
  local quiet=false force=false
  local reason=""
 
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --name)       name="$2";           shift 2 ;;
      --identity)   identity="$2";       shift 2 ;;
      --type)       type="$2";           shift 2 ;;
      --ip)         ips+=("$2");         shift 2 ;;
      --block-name) block_name="$2";     shift 2 ;;
      --service)    services+=("$2");    shift 2 ;;
      --force)      force=true;          shift   ;;
      --quiet)      quiet=true;          shift   ;;
      --subnet)     subnets+=("$2");     shift 2 ;;
      --port)       ports+=("$2");       shift 2 ;;
      --reason)     reason="$2";         shift 2 ;;
      --help)       cmd::block::help;    return  ;;
      *)
        log::error "Unknown flag: $1"
        cmd::block::help
        return 1
        ;;
    esac
  done
 
  # --identity: block all peers for this identity
  if [[ -n "$identity" ]]; then
    cmd::block::_block_identity "$identity" "$quiet" \
      "${ips[@]+"${ips[@]}"}" || return 1
    return 0
  fi
 
  [[ -z "$name" ]] && {
    log::error "Missing required flag: --name or --identity"
    cmd::block::help
    return 1
  }
function cmd::unblock::run() {
  local name="" identity="" type=""
  local ips=() subnets=() ports=() services=()
  local all=false quiet=false force=false
  local reason=""

  while [[ $# -gt 0 ]]; do
    case "$1" in
      --name)     name="$2";           shift 2 ;;
      --identity) identity="$2";       shift 2 ;;
      --type)     type="$2";           shift 2 ;;
      --ip)       ips+=("$2");         shift 2 ;;
      --force)    force=true;          shift   ;;
      --quiet)    quiet=true;          shift   ;;
      --subnet)   subnets+=("$2");     shift 2 ;;
      --port)     ports+=("$2");       shift 2 ;;
      --service)  services+=("$2");    shift 2 ;;
      --reason)   reason="$2";         shift 2 ;;
      --all)      all=true;            shift   ;;
      --help)     cmd::unblock::help;  return  ;;
      *)
        log::error "Unknown flag: $1"
        cmd::unblock::help
        return 1
        ;;
    esac
  done

  # --identity: unblock all peers for this identity
  if [[ -n "$identity" ]]; then
    cmd::unblock::_unblock_identity "$identity" "$quiet" || return 1
    return 0
  fi

  if [[ -z "$name" ]]; then
    log::error "Missing required flag: --name or --identity"
    cmd::unblock::help