0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Makefile】インターネット接続時のProxy対策

Posted at

はじめに

この記事の目的

ソースコードのビルドや引数を多用したスクリプトのランナーとして、Makefileは根強い人気を誇っています。
本記事では、インターネット接続を伴う処理を記載したMakefileを、Proxy環境下でも使えるようにする方法を検討します。

想定する環境

以下の環境を想定しています。
OS: Linux
Shell: bash
Macの場合は、bashではなくzshを設定すれば動くのではないかと思います。

対象とするプロキシ対策

プロキシ対策は、使用するツールの実装により様々ですが、以下が一般的です。

  • http_proxy, https_proxy, ftp_proxy, no_proxyなどの環境変数にhttp://<USER ID>:<USER PASS>@<SERVER>:<PORT>の書式でプロキシサーバの設定を記載する。
  • 所定のディレクトリにプロキシサーバの設定を記載したファイルを配置する

本記事では、前者の環境変数を設定するタイプのスクリプトをMakefileの中で実行する場合の対策を示します。

Makefileの使用方法と設定

Makefileの使用方法

まず、後述のMakefileを任意のディレクトリに配置し、そのディレクトリへ移動します。
そして、実行したいターゲットがtestの場合、ユーザは次のコマンドを実行します。

# 非プロキシ環境下
make test
# プロキシ環境下
make test USE_PROXY=true
  # Configure proxy setting:
  #  USER ID: > aaa
  #  USER PASS: >

上記のように、非プロキシ環境下では、単にtestを指定します。そして、プロキシ環境下では、引数USE_PROXY=trueを付けます。
そして、プロキシサーバへ接続するためのユーザ名とパスワードはmake実行時に、入力する方式とします。
なお、本記事は、プロキシサーバのホスト名とポート名は事前に分かっているものとして、Makefileの中に記載してしまいます。

なお、プロキシ環境下であっても、すでに環境変数が設定されている場合は、USE_PROXY=trueを省略できるようにします。

Makefileの設定

以下では、プロキシサーバのホスト名がproxy.server.com、ポート番号が8080とします。
なお、プロキシサーバのホスト名が不明で、代わりにIPが分かっている場合は、ホスト名の代わりにIPを記載します。

PROXY_SERVER:=proxy.server.com
PROXY_PORT:=8080
SHELL:=/bin/bash # readコマンドを使用するため、シェルをデフォルトのshからbashに変更します

# USE_PROXYの設定が無い場合は、環境変数が設定されているかを確認しますhttp_proxy
USE_PROXY?=$(shell if [ ! -z $$http_proxy ]; then echo "true"; else echo "false"; fi)

# USE_PROXYがtrueで、かつ、http_proxyが設定されていない場合は、ユーザにIDとパスワードを入力してもらい、http_prox等を設定します。
ifeq ($(USE_PROXY), true)
	ifeq ($(http_proxy),)
		USER_ID:=$(shell echo "Configure proxy setting:" 1>&2; read -p "  LDAP ID: > " tmp; echo $$tmp)
		USER_PASS:=$(shell read -s -p "  LDAP PASS: > " tmp; echo "" 1>&2; echo $$tmp)
		export http_proxy:=http://$(USER_ID):$(USER_PASS)@$(PROXY_SERVER):$(PROXY_PORT)
		export https_proxy:=$(http_proxy)
	endif
endif

# プロキシ設定を活用して、example.comのサイトをダウンロードできるか確認します。
# 接続できない場合は、5秒でタイムアウトします。
test: ## Test connection with internet (connect to http://example.com)
	@if timeout 5 curl -L http://example.com 1>/dev/null 2>&1; then\
		echo "Successfully connected with example.com";\
	else\
		echo "Failed to connect with example.com";\
	fi

なお、環境変数はMakefileの中だけで設定され、makeのスクリプトを抜けると上記環境変数は消えてしまいます。

Makefileで使っているテクニック

exportによる環境変数設定

Makefileで設定した変数は通常、環境変数とは区別されますが、exportを付けると、makeのサブプロセスで実行されるシェル内の環境変数に展開されます。
上記の例では、http_proxyとhttps_proxyをMakefileの記法である:=によって設定し、さらに、exportすることで、それ以降のコマンドを実行する際の環境変数に登録しています。

?=代入

?=は、変数が定義されていない場合のみ、変数を宣言して値を代入する代入演算子です。
上記の例では、USE_PROXYの設定を?=による代入とすることで、ユーザがUSE_PROXYを設定しなかった場合のみ、値を設定しています。
さらに、?=代入演算子の右辺で、$(shell ...)を使うことで、http_proxy環境変数が設定されているか確認し、すでに設定済みの場合はtrueとし、http_proxyが存在しないor空の場合はfalseとしています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?