github enterpriseのstafftools/reportsをPHPで取得する

# はじめに

github enterpriseのadmin dashboardにあるreportの幾つかをcurlで取得できると分かったので、rubyで実装していたものをphpで実装しなおしてみた。stafftools/reports自体もapiではない？ような位置付けなのでライブラリは無いので、せっかくだし必要なレポート実装以外も対応してみた。

#　最低限必要なもの

環境変数として下記３つが必要。

- GITHUB_HOST
    - github enterpriseが置いてあるホスト名
- GITHUB_ADMIN_USER
    - site admin権限のあるユーザID名
- GITHUB_ADMIN_USER_PASSWORD
    - site admin権限のあるユーザが発行したsite_admin scopeを持つpersonal access token
    - 或いは、site admin権限のあるユーザの生パスワード


# usage

```php
use app\Libs\GheStafftools;

$tools = new GheStafftools();
$allusers_csv = $tools->reportsAllUsers(); // "\n"を含んだCSV形式の文字列が取得できる
```

## 注意

GheStafftools#reportsAllUsers()以外は動作確認していない。

# ソース

部分的にlaravel仕様だが、削れば問題ないレベル。これの為だけにgithub作るのも面倒なのでここにメモする意図。

```php
<?php
/**
 * Created by PhpStorm.
 * User: ito
 * Date: 2017/04/18
 * Time: 18:31
 */

namespace app\Libs;

use Illuminate\Support\Facades\Log;

class GheStafftools
{
  private $endpoint;
  private $user;
  private $pass;
  private $curlopts;

  public function __construct()
  {
    $this->endpoint = 'https://'.env('GITHUB_HOST').'/stafftools/reports';
    $this->user = env('GITHUB_ADMIN_USER');
    $this->pass = env('GITHUB_ADMIN_USER_PASSWORD');

    $this->curlopts = array(
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_SSL_VERIFYPEER => true,
      CURLINFO_HEADER_OUT => false,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_AUTOREFERER => true,
      CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
      CURLOPT_USERPWD => "$this->user:$this->pass"
    );
  }

  /**
   * @param report type
   * @return csv strings includes '\n'
   * @see https://help.github.com/enterprise/2.9/admin/articles/site-admin-dashboard/#reports
   */
  private function getReports($method)
  {
    $ch = curl_init();
    curl_setopt_array($ch, $this->curlopts);
    curl_setopt($ch, CURLOPT_URL, $this->endpoint.$method);

//    $verbose = fopen('php://temp', 'w+');
//    curl_setopt($ch, CURLOPT_VERBOSE, true);
//    curl_setopt($ch, CURLOPT_STDERR, $verbose);

    $response = curl_exec($ch);
    $status = curl_getinfo($ch);
    curl_close($ch);

    Log::debug("HTTP Status: ".$status['http_code']." ".$status['content_type']);

//    rewind($verbose);
//    $verboseLog = stream_get_contents($verbose);
//    echo "Verbose information:\n", $verboseLog, "\n";

    return $response;
  }

  /**
   * reports all(somebody) users info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsAllUsers()
  {
    $method = '/all_users.csv';
    return $this->getReports($method);
  }

  /**
   * reports active users info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsActiveUsers()
  {
    $method = '/active_users.csv';
    return $this->getReports($method);
  }

  /**
   * reports dormant(not login during some months) users info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsDormantUsers()
  {
    $method = '/dormant_users.csv';
    return $this->getReports($method);
  }

  /**
   * reports suspended users info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsSuspendedUsers()
  {
    $method = '/suspended_users.csv';
    return $this->getReports($method);
  }

  /**
   * reports all organizations info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsAllOrganizations()
  {
    $method = '/all_organizations.csv';
    return $this->getReports($method);
  }

  /**
   * reports all repositories info csv.
   *
   * @return csv strings includes '\n'
   */
  public function reportsAllRepositories()
  {
    $method = '/all_repositories.csv';
    return $this->getReports($method);
  }
}
```

# 検索キーワード

```
ghe github enterprise stafftools dashboard reports php library
```