tabimoba.net

とあるエンジニアの雑記帳

ApacheでFilesやFilesMatchが反映されない問題とその原因

※Qiitaからの移行記事となります

Apacheのconfにはデフォルトで次のような記述があり、通常は.htaccessなどが見えてしまうことはありませんが、設定によっては.htaccessファイルが丸見えになってしまう(FilesやFilesMatchの設定が無視される)場合があります。

<Files ".ht*">
    Require all denied
</Files>

例えば、次のような設定が行われていると、FilesやFilesMatchの設定が評価されず、.htaccessが見えてしまう原因となります。

<Location "/">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<DirectoryMatch>

原因

ディレクティブには優先順があります。

<Directory>  <   <Files>   <   <Location>

上記のように種類の異なるセクションが混在し、かつセクション同士で一部あるいは全部の条件が重複する場合は、優先度の高いセクションの内容が評価されます。つまり、<Files>よりも<Location "/"> の優先度が高いため、<Files>が評価されない問題が発生します。

そして、設定は記述順(上から順)に評価されるとは限らず、<Files><Location>の前に持ってこようが、後ろに持ってこようが結果は変わりません。

対応

Locationを使わず、DirectoryやDirectoryMatchを使います。 Locationはトラブルになりやすいため、なるべくLocationを使用しない運用とすることが望ましいといえます。

<Directory "/var/www/html">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<Directory>

参考

RHEL7でyum update 時にPHP5.4がアップデート出来ない場合の対応

RedHat Enterprise Linux 7(RHEL7)で、yum updateしようとした際に次のようなメッセージが表示され、php5.4のアップデートに失敗する場合があります。

# yum update
読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-cli.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-cli(x86-64) = 5.4.16-46.el7 のパッケージ: php-devel-5.4.16-46.el7.x86_64
---> パッケージ php-cli.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-common.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-common(x86-64) = 5.4.16-46.el7 のパッケージ: php-mbstring-5.4.16-46.el7.x86_64
---> パッケージ php-common.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-gd.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-gd.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-mysql.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-mysql.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-pdo.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-pdo.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-process.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-process.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-xml.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-xml.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-xmlrpc.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-xmlrpc.x86_64 0:5.4.16-46.1.el7_7 を アップデート
--> 依存性解決を終了しました。
エラー: パッケージ: php-devel-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-cli(x86-64) = 5.4.16-46.el7
            削除中: php-cli-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-cli-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-cli-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-21.el7
            利用可能: php-cli-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0
            利用可能: php-cli-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-cli-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-cli-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.el7_1
            利用可能: php-cli-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-cli-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-cli-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-42.el7
            利用可能: php-cli-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4
            利用可能: php-cli-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-cli-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-45.el7
エラー: パッケージ: php-mbstring-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-common(x86-64) = 5.4.16-46.el7
            削除中: php-common-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-common-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-common-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-21.el7
            利用可能: php-common-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0
            利用可能: php-common-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-common-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-common-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.el7_1
            利用可能: php-common-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-common-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-common-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-42.el7
            利用可能: php-common-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4
            利用可能: php-common-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-common-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-45.el7
**********************************************************************
yum can be configured to try to resolve such errors by temporarily enabling
disabled repos and searching for missing dependencies.
To enable this functionality please set 'notify_only=0' in /etc/yum/pluginconf.d/search-disabled-repos.conf
**********************************************************************

--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:3.10.0-693.5.2.el7 を 削除
---> パッケージ kernel-devel.x86_64 0:3.10.0-693.5.2.el7 を 削除
---> パッケージ php-cli.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-cli(x86-64) = 5.4.16-46.el7 のパッケージ: php-devel-5.4.16-46.el7.x86_64
---> パッケージ php-common.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-common(x86-64) = 5.4.16-46.el7 のパッケージ: php-mbstring-5.4.16-46.el7.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: php-devel-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-cli(x86-64) = 5.4.16-46.el7
            削除中: php-cli-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-cli-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-cli-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-21.el7
            利用可能: php-cli-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0
            利用可能: php-cli-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-cli-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-cli-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.el7_1
            利用可能: php-cli-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-cli-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-cli-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-42.el7
            利用可能: php-cli-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4
            利用可能: php-cli-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-cli-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-45.el7
エラー: パッケージ: php-mbstring-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-common(x86-64) = 5.4.16-46.el7
            削除中: php-common-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-common-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-common-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-21.el7
            利用可能: php-common-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0
            利用可能: php-common-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-common-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-common-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.el7_1
            利用可能: php-common-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-common-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-common-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-42.el7
            利用可能: php-common-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4
            利用可能: php-common-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-common-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-45.el7
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

原因

rhel-7-server-optional-rpms リポジトリ(チャンネル)がenableでないと、当該事象が発生します。 上記リポジトリがenableであるかどうかは、yum repolistコマンドで確認することができます。

以下のような状態である(rhel-7-server-optional-rpmsがenableである)場合は、当該事象は発生しません。 rhel-7-server-optional-rpmsが結果に表示されない場合は、当該事象が発生する可能性があります。

# yum repolist
読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager
リポジトリー ID                                                   リポジトリー名                                                              状態
rhel-7-server-optional-rpms/7Server/x86_64                        Red Hat Enterprise Linux 7 Server - Optional (RPMs)                         19,656
rhel-7-server-rpms/7Server/x86_64                                 Red Hat Enterprise Linux 7 Server (RPMs)                                    27,011

対応

以下のコマンドを実行し、rhel-7-server-optional-rpmsリポジトリを追加します。

subscription-manager repos --enable rhel-7-server-optional-rpms

注意点

optionalリポジトリは、RHELのサポート対象ではない(RedHatのグローバルサポートサービスを受けられない)ため、導入に際しては注意が必要です。 https://access.redhat.com/ja/solutions/4387631

Red Hat では、Red Hat/Red Hat JBoss 製品の機能に加えて、お客様の利便性を向上させるソフトウェアパッケージ (RPM) を追加で提供しています。これらのソフトウェアパッケージには、オープンソースライセンスのソフトウェア (「Optional」Red Hat Network チャンネル) および商用ライセンスのソフトウェア (「Supplementary」Red Hat Network チャンネル) があります。Optional および Supplementary チャンネルのソフトウェアパッケージはサポート対象ではなく、ABI の保証も適用されません。

RHELでoptionalリポジトリに属するPHPパッケージは次のとおりです。

  • php-bcmath
  • php-devel
  • php-embedded
  • php-enchant
  • php-dba
  • php-fpm
  • php-intl
  • php-mbstring
  • php-mysqlnd
  • php-pspell
  • php-snmp

参考

MODx Evolutionのエレメントをファイル出力する

MODx Evolutionは、CMSとしても、ライトなWebアプリケーションフレームワークとしても使い勝手が良いのですが、エレメントの管理に常に悩まされます。エレメント(テンプレート、テンプレート変数、チャンク、スニペット、プラグイン)は管理画面上から手軽に追加・編集可能な利点がある反面、DB上でコードが管理されているのでバージョン管理やコードの比較、バックアップがしづらい等、そのような問題がメンテ時の欠点として出てきます。(手軽さとメンテのしやすさはトレードオフの関係です)

そこで、コードを出力してファイルとして管理できるようにしました。ざっくりと書いた感じなので、調整が必要な場合もあるかも知れませんが、これによってメンテが少しでも楽になれば。。

コード

<?php

$dbname = 'DB名';
$dbhost = 'DBホスト(FQDN or IP)';
$dsn = 'mysql:dbname=' . $dbname . ';host=' . $dbhost;
$user = 'ユーザー名';
$password = 'パスワード';

$dbo = new PDO($dsn, $user, $password);
$dbo->query('set names UTF8');

$base_dir = dirname(__FILE__);

$prefix = 'modx_'; // MODxテーブルプレフィックス
$tables = [
        'site_snippets',
        'site_templates',
        'site_tmplvars',
        'site_modules',
        'site_plugins',
        'site_htmlsnippets',
];

foreach ($tables as $table) {
        $sql = 'select * from ' . $prefix . $table . ';';
        $my_dir = $base_dir . '/' . $table;
        mkdir ($my_dir, 0755);

        foreach ($dbo->query($sql)->fetchAll(PDO::FETCH_ASSOC) as $row) {
                $tmp = $row;
                unset($tmp['id']);
                switch ($table) {
                        case 'site_snippets':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['snippet']);
                                break;
                        case 'site_templates':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['templatename']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['content']);
                                break;
                        case 'site_tmplvars':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['elements']);
                                break;
                        case 'site_modules':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['modulecode']);
                                break;
                        case 'site_plugins':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['plugincode']);
                                break;
                        case 'site_htmlsnippets':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['snippet']);
                                break;
                }
        }
}

Python3とSeleniumとGoogle ChromeでWebページのスクリーンショットはSelenium-Screenshotが便利です

Python 3とSeleniumとGoogle ChromeでWebページのスクリーンショットを取得する方法の1つとして、Selenium標準の save_screenshot メソッドを使う方法がありますが、この方法の場合、指定されたサイズ(ウインドウサイズ)のスクリーンショットを取得することはできますが、Webページ全体のスクリーンショットを取得することはできません。

Googleで検索してみると、色々な方法がヒットしますが、最も簡単で、かつ再利用性の高い方法は、Selenium-Screenshotパッケージを使う方法です。Selenium-Screenshotパッケージを使用すると、簡単にWebページ全体のスクリーンショットや、HTML要素を指定したスクリーンショットを取得することができます。

インストール

1.Python3のダウンロードとインストール

Windowsの場合は、下記URLよりインストーラーをダウンロードしてインストールする方法が簡単です。 https://www.python.jp/

LinuxやMac, FreeBSDなどでは、パッケージマネージャからインストールします。 例えば、Ubuntu 18.04LTSの場合はちょっと古いですが(実行時にDeprecatedが出るかも知れませんが)以下が参考になるでしょう。 Ubuntu 18.04LTSとchromium-browser(Headless)とpython3でSeleniumする

Pythonのバージョン複数分けて使いたい場合は、pythonbrewのようなvirtualenvっぽい何かを利用したり、Dockerで環境を分けるのが良いでしょう。

2.パッケージのインストール

seleniumと、Selenium-Screenshotパッケージをインストールします。

pip install selenium
pip install Selenium-Screenshot

3.ChromeDriverのダウンロード

下記URLより、自分の環境(Chromeのバージョン)に合ったChromeDriverをダウンロードします。 https://chromedriver.chromium.org/downloads

なお、Windows以外でパッケージマネージャよりSeleniumをインストールした場合は、パッケージマネージャよりChromeDriverをインストール出来る場合があります。その場合は、特別な事情(パッケージマネージャよりインストールされるものが満足に動作しない、機能が足りない等)を除き、可能な限りパッケージマネージャよりインストールされるものを使用するのが良いでしょう。

コード例

以下はWindowsで、https://www.asahi.com/ のスクリーンショットを取得する例です。 なお、ChromeDriver(chromedriver.exe)はPythonスクリプトと同じフォルダ(ディレクトリ)にあることを、ここでは想定しています。 環境に合わせて、executable_path(ChromeDriverのパス)を変更することで、Windowsに限らず他のOSでも動作します。

from Screenshot import Screenshot_Clipping
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

ob=Screenshot_Clipping.Screenshot()
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe", options=options)
driver.set_window_size(1280, 720)

driver.get("https://www.asahi.com/")
ob.full_Screenshot(driver, save_path=r'.', image_name='Myimage.png')

driver.close()
driver.quit()

上記Pythonスクリプトを実行すると、Myimage.pngというファイル名でスクリーンショット画像が出力されます。 その画像を開くと、以下のようにWebページ全体のスクリーンショットを確認することができます。 f:id:tabimoba:20200402021843p:plain

参考

2019/12/30にGeoIP(GeoLite2)の変更が発生したので、その影響と対応方法

MaxMind社が無料で提供しているGeoIPデータベース(GeoLite2)について、2019/12/30より変更が行われました。

https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases/

理由

[CCPA(カリフォルニア州 消費者プライバシー法)] (https://www.ppc.go.jp/enforcement/infoprovision/laws/CCPA/) への準拠が必要となったため(EULAの変更や提供方法の変更が必要となった)。

「Do Not Sell」リクエストをMaxMind社が受け取った際に、GeoIPデータベース利用者に対して通知可能な状態である必要があります(GeoLite2を含めた、GeoIPのユーザーを特定できるようにする必要があります)。しかし、これまでのGeoLite2のような認証無しのダウンロードではそれに対応することができない(ユーザーが特定できない)ため、ユーザー登録と認証が必要となりました。

The California Consumer Privacy Act (CCPA) mandates that businesses honor valid “Do Not Sell” requests from California residents. In this context, complying with a valid request involves MaxMind removing IP addresses from the GeoLite2 data and communicating to GeoLite2 users that the IP addresses in question should (immediately) not be utilized for uses covered under the CCPA. We have been advised that any download, including one without charge, constitutes a sale. Serving GeoLite2 database downloads on a public page simply does not allow us to communicate and honor valid “Do Not Sell” requests we receive from individuals.

The solution we have chosen is to introduce a new end-user license agreement containing the relevant data processing provisions that both we, as the business providing data, and you, as the third party user of the data, need to comply with applicable data privacy regulations. Additionally, by requiring a MaxMind account and contact information from you, we will be able to communicate all valid “Do Not Sell” requests to you as we receive them.

With this approach, we can continue to offer GeoLite2 databases, without charge, while remaining responsible stewards of data that improves the experience of countless users across the internet.

影響

これまでは、wgetやcurlなどで直接(認証無しで)ダウンロードが可能でしたが、今後はライセンスキー(トークン)が必要となります。

cron等でMaxMind社からGeoLite2データベースを自動でダウンロードして、WebサーバのやWebシステムのアクセス制限や、アクセス解析等に利用している場合は、GeoLite2のダウンロードに失敗して適用できていないという問題が発生している可能性がありますので、注意が必要です。

対応方法

1.MaxMindの手順に従い対応する

手順は以下のURLに記載されています。 認証は必要ですが、GeoLite2は引き続き無料で利用することができます。

https://dev.maxmind.com/geoip/geoipupdate/

2.dbipを利用する

類似の(GeoIPデータベースと互換性のある)ジオロケーションデータベースとして、dbipがあります。 こちらは、認証無しでダウンロードが可能です。

https://db-ip.com/db/lite.php

また、GeoIPデータベースを利用していたソフトウェアによっては、dbipの利用を推奨しているものもあります。 例えば、Matomo(アクセス解析ソフトウェア 旧名称:Piwik)は、dbipの利用を推奨しています。

https://matomo.org/docs/geo-locate/

特定のS3バケットのみ一覧表示と読み書きを許可するIAMポリシーの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        }
    ]
}

cURLを利用して、MovableTypeのアクセストークンを取得する

MovableTypeのData APIを利用する際に必要となるアクセストークンは以下の方法で取得することが出来ます。

パスワードは、「Webサービスパスワード」を指定します。(管理画面ログイン時のパスワードではないので注意) クライアントIDは、決まったものは無く、任意のIDを指定可能です。

curl -X POST https://<サイトURL>/mt/mt-data-api.cgi/v4/authentication \
-F username=<ユーザー名> \
-F password=<パスワード> \
-F clientId=<クライアントID> \
-F remember=1 \
| jq -r .accessToken

便利な使い方として、結果(アクセストークンを)ファイルへ出力することで(例えば、cronで一定時間ごとに実行して、結果をファイルへ出力することで)、curlやスクリプト等からData APIを、認証や有効期限を意識することなく手軽に利用することが出来ます。(もちろんセキュリティが確保された環境で行うことが前提です)

Guzzleでリクエスト先から返されたエラーメッセージをtruncateさせずに取得する

Guzzleでリクエスト先からエラーが返された際、そのメッセージがtruncateされてしまい、不都合な場合があります。今回は、このメッセージをtruncateされない状態で取得してみます。

PHP Fatal error:  Uncaught GuzzleHttp\Exception\ServerException: Server error: `POST https://hoge.local/upload` resulted in a `500 Internal Server Error` response:
{"error":{"code":500,"message":"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u62 (truncated...)
 in /hoge/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:113

対応方法

次のコードのように、catch側に $e->getResponse()->getBody()->getContents() を書くことで取得することが可能です。

コード

try {
        $res = $client->request('POST', $url, [
            ・・・
        ]);
} catch (Exception $e) {
        var_dump(json_decode($e->getResponse()->getBody()->getContents()));
}

結果

object(stdClass)#10 (1) {
  ["error"]=>
  object(stdClass)#34 (2) {
    ["code"]=>
    int(500)
    ["message"]=>
    string(67) "アップロードするファイルを選択してください。"
  }
}

cURLを利用して、Movable TypeのData API経由でファイルをアップロードする

以下の方法で、cURLを利用してMovableTypeへファイルをアップロードすることができます。

curl -X POST \
https://<サイトのURL>/mt/mt-data-api.cgi/v4/assets/upload \
-H "X-MT-Authorization:MTAuth accessToken=<アクセストークン>" \
-F site_id=<サイトID> \
-F path=<アップロード先のパス> \
-F "file=@<アップロードするファイルのパス>"