WebベースのIPアドレス管理帳を作る

#  目的 

ファイル共有上のExcelシートで管理するの嫌だ。ブラウザでちょいちょいとやりたい。


# 環境

CentOS 7.1

# インストール

ApacheとMariaDB

```shell-session
 # yum install mariadb httpd php mariadb-server php-pdo 
```

# サービスを構成

```shell-session
 # systemctl start mariadb httpd
```

```shell-session
 # systemctl enable mariadb httpd 
```

httpサービスを許可するかfirewalldを終了する

```shell-session
 # systemctl stop firewalld 
``` 
あるいは

```shell-session
 # firewall-cmd --add-service=http 
```
 （最後に永続化する）

# MariaDBのセットアップ

```shell-session
 # mysql_secure_installation 

 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

 In order to log into MariaDB to secure it, we'll need the current
 password for the root user.  If you've just installed MariaDB, and
 you haven't set the root password yet, the password will be blank,
 so you should just press enter here.
 
 Enter current password for root (enter for none):
 OK, successfully used password, moving on...
 
 Setting the root password ensures that nobody can log into the MariaDB
 root user without the proper authorisation.
 
 You already have a root password set, so you can safely answer 'n'.
 
 Change the root password? [Y/n]
 New password:
 Re-enter new password:
 Password updated successfully!
 Reloading privilege tables..
  ... Success!
 
 
 By default, a MariaDB installation has an anonymous user, allowing anyone
 to log into MariaDB without having to have a user account created for
 them.  This is intended only for testing, and to make the installation
 go a bit smoother.  You should remove them before moving into a
 production environment.
 
 Remove anonymous users? [Y/n]
  ... Success!
 
 Normally, root should only be allowed to connect from 'localhost'.  This
 ensures that someone cannot guess at the root password from the network.
 
 Disallow root login remotely? [Y/n]
  ... Success!
 
 By default, MariaDB comes with a database named 'test' that anyone can
 access.  This is also intended only for testing, and should be removed
 before moving into a production environment.
 
 Remove test database and access to it? [Y/n]
  - Dropping test database...
  ... Success!
  - Removing privileges on test database...
  ... Success!
 
 Reloading the privilege tables will ensure that all changes made so far
 will take effect immediately.
 
 Reload privilege tables now? [Y/n]
  ... Success!
 
 Cleaning up...
 
 All done!  If you've completed all of the above steps, your MariaDB
 installation should now be secure.
 
 Thanks for using MariaDB!
```

↑ 基本的に rootパスワードを設定するところ以外はEnter叩いてそのまま進める。


## MariaDBに接続する

```shell-session
 # mysql -uroot -p 
```

## ユーザー情報を表示 

```shell-session

 MariaDB [(none)]> 
 MariaDB [(none)]> select user,host from mysql.user;
 +------+-----------+
 | user | host      |
 +------+-----------+
 | root | 127.0.0.1 |
 | root | ::1       |
 | root | localhost |
 +------+-----------+
 3 rows in set (0.00 sec)
```

## データベース名を表示

```shell-session

MariaDB [(none)]> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | performance_schema |
 +--------------------+
 3 rows in set (0.00 sec)
```

## 自分用のデータベースを作成する

```shell-session
MariaDB [(none)]> create database mgmtsheet;
> Query OK, 1 row affected (0.00 sec)
```

## データベース名を表示（作成後）

```shell-session
 MariaDB [(none)]> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mgmtsheet          |
 | mysql              |
 | performance_schema |
 +--------------------+
 4 rows in set (0.00 sec)
```
## 自分用のデータベースを作成

```shell-session
 MariaDB [mgmtsheet]> show tables;
Empty set (0.00 sec)
```
## 作成したデータベースを選択

```shell-session

 MariaDB [(none)]> use mgmtsheet
 Reading table information for completion of table and column names
 You can turn off this feature to get a quicker startup with -A
 
 Database changed

```

## テーブルを作成する

```sql 
CREATE TABLE `IPADDRESS` (
	`ADDRESS` VARCHAR(16) NOT NULL,
	`DECIMAL_ADDRESS` INT(10) UNSIGNED NOT NULL DEFAULT '0',
	`DESCRIPTION` VARCHAR(50) NOT NULL DEFAULT 'not assigned',
	PRIMARY KEY (`DECIMAL_ADDRESS`)
)
ENGINE=InnoDB
;
```

```shell-session
MariaDB [mgmtsheet]> show tables;
 +---------------------+
 | Tables_in_mgmtsheet |
 +---------------------+
 | IPADDRESS           |
 +---------------------+
 1 row in set (0.00 sec)
```

```shell-session

MariaDB [mgmtsheet]> desc IPADDRESS;
+-----------------+------------------+------+-----+--------------+-------+
| Field           | Type             | Null | Key | Default      | Extra |
+-----------------+------------------+------+-----+--------------+-------+
| ADDRESS         | varchar(16)      | NO   |     | NULL         |       |
| DECIMAL_ADDRESS | int(10) unsigned | NO   | PRI | 0            |       |
| DESCRIPTION     | varchar(50)      | NO   |     | not assigned |       |
+-----------------+------------------+------+-----+--------------+-------+
3 rows in set (0.01 sec)
```

## 専用ユーザーの作成と権限付与

```shell-session
MariaDB [(none)]> create user 'lab' identified by 'labpass' ;
MariaDB [(none)]> grant SELECT,UPDATE ON mgmtsheet.* TO 'lab' ;
Query OK, 0 rows affected (0.00 sec)
```

## ユーザー確認

```shell-session
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| lab  | %         |
| root | 127.0.0.1 |
| root | ::1       |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
```

## 使用する範囲のIPアドレスを登録する

### スクリプトを用意


```awk:dotdecip.awk
BEGIN {
gensql(10,10,3);
gensql(10,10,140);
}
function gensql(oct1,oct2,oct3){
        for (i=1;i<=254;i++) {
         printf("insert into IPADDRESS (ADDRESS,DECIMAL_ADDRESS) values ('%s.%s.%s.%i',%i);\n",oct1,oct2,oct3,i,decip(oct1,oct2,oct3,i));
        }
}

function decip(o1,o2,o3,o4){
return 254*254*254*o1+254*254*o2+254*o3+o4;
}
```
### SQL文を生成

```shell-session
# gawk -f dotdecip.awk  > alladdr.sql
```


### 流し込む

```shell-session
 # mysql -uroot -p mgmtsheet < alladdr.sql 
```

### 確認

```shell-session
MariaDB [mgmtsheet]> select * from mgmtsheet.IPADDRESS;
+---------------+-----------------+--------------+
| ADDRESS       | DECIMAL_ADDRESS | DESCRIPTION  |
+---------------+-----------------+-------------+
| 10.10.3.1     |       164516563 | not assigned |
| 10.10.3.2     |       164516564 | not assigned |
| 10.10.3.3     |       164516565 | not assigned |
| 10.10.3.4     |       164516566 | not assigned |
| 10.10.3.5     |       164516567 | not assigned |
... 
| 10.10.140.249 |       164551609 | not assigned |
| 10.10.140.250 |       164551610 | not assigned |
| 10.10.140.251 |       164551611 | not assigned |
| 10.10.140.252 |       164551612 | not assigned |
| 10.10.140.253 |       164551613 | not assigned |
| 10.10.140.254 |       164551614 | not assigned |
+---------------+-----------------+--------------+
508 rows in set (0.00 sec)
```

## 編集用ページの作成　

作らずに、編集用ページにはAdminer Editor （ https://www.adminer.org/editor/ ）を利用する。

### ディレクトリ移動

```shell-session
# cd /var/www/html/ 
```

### ダウンロードして配置する

```shell-session
 # wget https://github.com/vrana/adminer/releases/download/v4.2.5/editor-4.2.5-mysql-en.php
```

### 適当な名前にリネーム

```shell-session
 # mv editor-4.2.5-mysql-en.php editor.php
```

### ブラウザでページを表示する
  `http://serveraddr/editor.php  `

ブラウザ経由では `http://serveraddr/editor.php` を表示できない(Forbidden)エラーが発生する場合,
以下2つが揃っているならば、SELINUXが原因と思われる。
- http://serveraddr/ はapacheのテストページを正しく返す
- ターミナル上で # php editor.php は正しそうな結果を返す

http://qiita.com/yunano/items/857ab36faa0d695573dd
  /var/log/httpd/error_log,  /var/log/audit/audit.log を調べてSE Linuxが原因でないかとか調べる。
SELINUXを無効にするか ` restorecon -RFv /var/www/html `で解消できると思われる。

つづき

## 誘導用のページを作る

Editorにログインしてテーブルのレコードの１つの[Edit]のハイパーリンクを調べると、
/スクリプト名?username=ユーザー名&edit=テーブル名&where%5BDECIMAL_ADDRESS列%5D=DECIMAL_ADDRESSの値
となっていることがわかる。

ので、
/editor.php?username=lab&edit=IPADDRESS&where%5BDECIMAL_ADDRESS%5D=DECIMAL_ADDRESS

となっているこのリンク（ユーザー名、テーブル名、カラム名はべた書きする）へ飛ばすリンクを表示するページを作る。

```php:index.php

<table border="1">
<tr> <th>IPADDRESS</th> <th>DESCRIPTION</th>
<?php
$dsn = 'mysql:dbname=mgmtsheet;host=localhost';
$user = 'lab';
$password = 'labpass';

try{
    $dbh = new PDO($dsn, $user, $password);
    $sql = 'select ADDRESS,DECIMAL_ADDRESS,DESCRIPTION from IPADDRESS ORDER BY DECIMAL_ADDRESS';
    foreach ($dbh->query($sql) as $row) {
        print('<tr>');
        print('<td>');
        print('<a href="/editor.php?username=lab&edit=IPADDRESS&where[DECIMAL_ADDRESS]='.$row['DECIMAL_ADDRESS'].'">');
        print($row['ADDRESS'].'</a></td>');
        print('<td>'.$row['DESCRIPTION'].'</td>');
        print('</tr>');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

$dbh = null;

?>
</table>
```

テーブルが表示されてリンクからeditorのページに行ければ成功

## FirewallDの設定を永続化する

OS再起動時にMariaDBとApacheは起動してもhttpの許可がされてないと外からブロックされるので。

```shell-session
 # firewall-cmd --add-service=http --permanent
```


# おわり

使うのは社内のユーザーのみで使用状況見られてもかまわないし、編集用パスワードが知られてもそこまで困らない割り切りが前提にあります。

必要ならカラム足してもよし、index.phpの代わりに
$sql = 'select ADDRESS,DECIMAL_ADDRESS,DESCRIPTION from IPADDRESS ORDER BY DECIMAL_ADDRESS' WHERE で条件追加してinuse.phpやfree.phpみたいなページを作ってもよいと思います。