17年前から塩漬けされているWebシステム修正についての役に立たない手記

以前、Xにて
> クソコードがどんなものか知らない人は、知ろうとしてはいけない。コードだけではなくミドルウェアの設定からクソは始まっているのだから…

と発言して、ふと思ったのですが、技術系ブログにて、クソコードについての投稿は多いようですがでミドルウェアの設定で苦労したという話があまりないので丁度最近行った闇の作業を感じたままに書く。

### それは、どこにある？から始まる

```shell
dig +short example.com | xargs -I % dig -x %
xxx.xxx.xxx.xxx.in-addr.arpa. 600 IN PTR On-prem.hogefuga.
```

とりあえず、ドキュメント漁ってsshする。
~~sshしたら負け？知るか~~

ログイン後のメッセージでOSがFreeBSDであることが分かった。

### Webサーバー何使ってるか見る
```bash
ps ax | grep -e nginx -e httpd
28836  -  Is         0:00.01 nginx: master process /usr/local/sbin/nginx
 2656  -  IJ         4:25.32 /usr/local/sbin/httpd
...
```
どっちも使ってる。

#### ポートを見てみる
```bash
sockstat | grep -E '(nginx|httpd)'
```
Nginx:  80, 443
Apache: 80

ポート80番が重複していて問題が発生していないことから、このサーバーはjail（FreeBSDなので）を持っていて、ホストのNginxで受けて各jailのApacheにリバースプロキシしてるっぽいと予想しつつNginxの設定を確認する。

#### example.comの設定を見る
```
...
location / {
    proxy_pass http://192.168.yyy.yyy;
}
...
```
#### jailも確認
```bash
jls -v
   JID  Hostname                      Path
        Name                          State
        CPUSetID
        IP Address(es)
     1  sv001                         /jails/sv001
        sv001                         ACTIVE
    ...
    35  sv_example                    /jails/sv_example
        sv_example                    ACTIVE
        36
        zzz.zzz.zzz.zzz
        192.168.yyy.yyy
    ...
```
あってた。
さっそく見にいく。

```bash
jexec 35 /bin/csh
jexec: execvp: /bin/csh: No such file or directory
```
<font color="Red">くっころ</font>

```bash
jexec 35
```
入れた。

#### Apacheが動いてるかを確認する
```bash
ps ax | grep httpd
 3316  ??  SJ     0:38.76 /usr/local/apache2/bin/httpd
```
I DO !
I DO !
I DO !

いる。`apache2`、いる。

#### 設定を見にいく
```bash
cd /usr/local/etc/ && ls
```

いない。

```bash
cd ../apache2/conf && ls
```
いた。
httpd.confを確認すると以下の記述が目に留まる。
```
<Directory /web/>
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>
```

/web以下にコンテンツ置いてそうだということが分かった。
ここには他にめぼしい設定がないので、httpd-vhosts.confを見に行く。

```bash
cat extra/httpd-vhosts.conf
include conf/vhosts/example/*.conf
#include conf/vhosts/example1/*.conf
include conf/vhosts/example2/*.conf
...
```

Shit !

```bash
ls -l ../vhosts/example/
-rw-r--r--  1 root  wheel  4096 May 23  2010 ._www.conf
-rw-r--r--  1 root  wheel  1044 May 28  2010 www.conf
```

いた。
Macユーザーの悪行を発見したが、華麗にスルー。
てか、このディレクトリはローカルから転送したのか...
`rm`せず、www.confを読み進める。

```bash
cat ../vhosts/example/www.conf
<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /web/example.com/www/public_html
    <Directory /web/example.com/www/public_html>
        php_value include_path ".:/web/example.com/www/etc:/web/example.com/etc:/web/example.com/www/lib/:/web/example.com/lib:/usr/local/hoge:/usr/local/lib/php"
        php_value auto_prepend_file prepend.php
		php_flag  mbstring.encoding_translation on
        php_value mbstring.language Japanese
        php_value mbstring.internal_encoding EUCJP-WIN
        php_value mbstring.script_encoding SJIS-WIN
        php_value mbstring.http_output SJIS-WIN
        php_value mbstring.http_input SJIS-WIN
        php_flag display_errors off
    </Directory>
</VirtualHost>
```

気になる`internal_encoding`。
でも、それで動いているのだから気にしない。

それよりも、`include_path`が魔境。
それでずっと動いてきたものは基本的に何もしてはいけないと思っている（敬意）

では、さっそく`/web/example.com/www/public_html`に移動して該当と思われるコードを確認する。
```php
<?php
if(!CHKRLS($SYEAR,$SMONTH,$SDATE,$SHOUR,$SMIN,$SSCND,$EYEAR,$EMONTH,$EDATE,$EHOUR,$EMIN,$ESCND) AND !eregi("test",$URLBASE)){
    print $_NAME_E;
}else{
    if($PC){
        $CONTENT=$CRNTDIR."/content.php";
    }else{
        $CONTENT=$CRNTDIR."/content_1.php";
    }
	include($BASE);
}
?>
```

<font color="Red">＼(^o^)／くっころ＼(^o^)／</font>

まだ、読むには早かったようだ。

しかし、やることは決まった。
`auto_prepend_file`を見ることだ。

#### 探す
```bash
cd /web/example.com/www
find . -name prepend.php
./etc/prepend.php
```
いた。
```php
if(isset($_REQUEST['c'])){$c=$_REQUEST['c'];}else{$c=NULL;}
require_once("config.php");
require_once("common_lib.php");
require_once("dbconnect.php");
require_once("util.php");
require_once("func.php");
```
そのうち分かってくるだろうから、今はcが何かを気にしてはいけないし、コードの記述について何も感じてはいけない。
**本来の目的を見失い、気になるところを直しているだけで日が暮れるからだ。**

#### 最初に確認しておきたいファイルNo.1であるconfig.phpを探す
まぁ、同階層に...
```bash
ls -l
-rw-r--r--  1 root  wheel  595 May 26  2010 prepend.php
```
ないよね。
```bash
ls -l ../lib
-rw-r--r--  1 root  wheel  870 May 30  2010 bn.php
```
ない。
bnって何だ（でも見ない）

ということは/usr/local以下の謎ディレクトリにあるということだな。
```bash
ls -l /usr/local/hoge
-rw-r--r--  1 root  wheel      7 Apr 21  2008 check.php
-rw-r--r--  1 root  wheel  11238 Jan 25  2008 common_lib.php
-rw-r--r--  1 root  wheel   8239 Jun 10  2007 dbconnect.php
-rw-r--r--  1 root  wheel   4824 Jan 22  2007 func.php
-rw-r--r--  1 root  wheel     24 Apr 11  2008 load.php
-rw-r--r--  1 root  wheel   1212 Apr 22  2008 util.php
```

＼prependファイルで読んでたfunc.phpなどは秘伝のタレであることがわかった／

てか、config.phpいないんですけど！！
<br>
<br>

（ここで、30分くらいハマる）

<br>
<br>

include_pathの中で見ていないディレクトリがあることに気が付き舌を頬に向かって出しながら中身を確認する。
```bash
ls -l /web/example.com/etc
-rw-r--r--  1 root  wheel  7504 Apr 16  2021 config.php
```
あった。
ちょっとだけ、テンション上がるも未だ何も作業は進んでいない。

```bash
cat /web/example.com/etc/config.php
<?php
$DIRBASE=$_SERVER["DOCUMENT_ROOT"]."";//?L???????g???[?g
...変数初期化が永遠と続く
```
<br>
<br>
俺たちの戦いはこれからだ . ""
<br>
<br>
<br>

多くの寄り道をすることになったが、様々なコードを開きながら、問題にたどり着き修正することが出来た。
コードだけ見ていたとすると`grep -r`を永遠にすることになり、
`/usr/local/hoge`にあるコードは/から`find`して見つけるしかなかっただろう…。

<br>

コードも設定も良い設計と可読性が本当に大切だなと思いながら今日も強く生きています。

お目汚し失礼しました。