技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

SNMPv1トラップからSNMPv2トラップへの変換

SNMPv1トラップをSNMPv2トラップに変換する方法については、RFC2576に記載がある。

https://www.ietf.org/rfc/rfc2576.txt

の「3.1. Translating SNMPv1 Notification Parameters to SNMPv2 Notification Parameters」

上記の中でも snmpTrapOID の扱いはちょっと分かりにくいので、ここで簡単に纏めておく。まずは、該当箇所を抜粋。

(2) If the SNMPv1 generic-trap parameter is 'enterpriseSpecific(6)',
the SNMPv2 snmpTrapOID parameter SHALL be the concatentation of
the SNMPv1 enterprise parameter and two additional sub-
identifiers, '0', and the SNMPv1 specific-trap parameter.

(3) If the SNMPv1 generic-trap parameter is not '
enterpriseSpecific(6)', the SNMPv2 snmpTrapOID parameter SHALL
be the corresponding trap as defined in section 2 of RFC1907
[12]:

generic-trap parameter           snmpTrapOID.0
====================== =============
  0                                           1.3.6.1.6.3.1.1.5.1 (coldStart)
  1                                           1.3.6.1.6.3.1.1.5.2 (warmStart)
  2                                           1.3.6.1.6.3.1.1.5.3 (linkDown)
  3                                           1.3.6.1.6.3.1.1.5.4 (linkUp)
  4                                           1.3.6.1.6.3.1.1.5.5 (authenticationFailure)
  5                                           1.3.6.1.6.3.1.1.5.6 (egpNeighborLoss) 

 

上記によると、SNMPv1トラップのgeneric-trapがenterpriseSpecific(6)だったら、snmpTrapOIDは、<enterprise parameter>.0.<specific-trap parameter> となり、generic-trapがenterpriseSpecific(6)以外だったら、snmpTrapOIDは上記の表のようになる。

つまり、企業固有トラップだったら、snmpTrapOIDは「エンタープライズID.0.トラップ固有番号」となり、標準トラップだったら、上記の表のようになる。

Javaのプロセスに対して外部からGCを実行させる。

Javaのプロセスに対して外部からGC(ガベージ・コレクション)を実行させる方法についてちょっと調べた。幾つか方法があるようだが、自分でやってみてうまくいったのは以下の方法。

  • jconsole コマンドを実行して立ち上がるGUI上で、対象のJavaプロセスを選択し接続。表示画面の「メモリ」タブから「GCの実行」を押下。
  • jmap -histo:live <Javaプロセスのpid> を実行。

 

jconsole コマンドも jmap コマンドも、どちらもJavaが標準で持っているコマンドなので、簡単に実行できる。(Java 1.8にはどちらも入っていた。)

 

注意点としては、どちらのコマンドも、対象のJavaプロセスのユーザーと同じユーザーで実行する必要があるということ。「root ユーザだったら、それ以外のユーザーで実行されているJavaプロセスに対してもGCできるだろう」と思って、root ユーザで他のユーザで実行されているJavaプロセスに対して上述の方法でGCを試みたが、Javaプロセスに接続できなかった。

シェル上でコマンドを繰り返し実行する。

Linux のシェル上でコマンドを繰り返し実行したい時は、

  while true; do <実施したいコマンド>; sleep <実行間隔>; done

と実行する。これにより、<実施したいコマンド> が <実行間隔> で繰り返し実行される。終了させるには、このシェル上で ctrl + c を実行する。

 

例えば、vmstat -s コマンドを10秒間隔で繰り返し実行するには、

  while true; do vmstat -s; sleep 10s; done

とする。

 

こういうのを知っておくと、何かを繰り返し実行したい時、スクリプトなどを書かなくて済むので効率が上がる。

ネットワーク機器のループバックアドレス

ループバックアドレス」というと、自分自身を指す 127.0.0.1 (localhost) を思い浮かべる人が多いと思う。

ループバックアドレス(127.0.0.1)とは - IT用語辞典 e-Words

 

しかし、ルータ等のネットワーク機器が持つ「ループバックアドレス」はこれとは異なり、ネットワーク機器を管理するために使用される仮想インタフェースに割り当てられるアドレスのことを指すらしい。

 

以下を参考にさせて頂きました。

ループバック - Wikipedia

Cisco機器のインタフェース | ネットワークのおべんきょしませんか?

ループバックインターフェイスを設定する

LDAP の bindDN, BaseDN について

LDAPサーバを扱う時、分からない用語がちょくちょく出てくるので、、、ちょっとずつ纏めていきたいと思う。まずは、bindDN と baseDN について。

 

  • bindDN:LDAPサーバにログインする時に使用するユーザ。つまり、LDAPサーバへの問い合わせ自体に必要となるユーザのこと。
  • baseDN:LDAPサーバの持つオブジェクト・ツリー上で、どの配下からユーザ検索を行うのかを示す。

 

 以下を参考にさせて頂きましたm(_ _)m

https://yoshinorin.net/2018/10/31/ldap-auth-from-other-services/

https://milestone-of-se.nesuke.com/l7protocol/ldap/binddn-basedn/

httpリクエストのHostヘッダ

ApacheやNginxなどのwebサーバには、クライアント(ブラウザ)からのIP直アクセスを検知してアクセス拒否する設定がある、という話を聞いて、

 「ブラウザでホスト名を打ち込んでアクセスしたとしても、(DNSで名前解決されて)最終的にIPアドレスによる通信になるのに、webサーバ側ではどうやってIP直アクセスかどうか判断しているんだろうか?」

という疑問が浮かんだ。そこで、ちょっと調べてみたところ、おそらく webサーバは、httpリクエストのHostヘッダを見て判断しているのだと考えている。

https://jyn.jp/webserver-security_redirect/

IP直アクセスした場合、httpリクエストのHostヘッダにもIPアドレスが入るので、webサーバ側ではそこを見てIP直アクセスだと判断することができるはず。

 

これまで、Hostヘッダについてはあまり意識したことがなかったが、上記以外にも、webサーバでHostヘッダを見てwebサーバ上の適切なサイトへ振り分けするなど、いろいろ使い道があるようだ

http://gihyo.jp/admin/serial/01/eng_knowhow/0018

ファイルを指定したサイズで分割するスクリプト

ファイルを指定したサイズで分割するperlスクリプト (splitFile.pl) を作成した。例えば、巨大なログファイルをエディタで開こうとすると、メモリ不足でまともに見れなくなってしまうので、そんな場合はこのスクリプトで分割してから見ようと思っている。


使い方は以下。
perl splitFile.pl -{size|s} "ファイルを分割するバイト数" "分割対象ファイル"

使用例は以下。
perl splitFile.pl -s 1048576 bigsize.log
(bigsize.log を 1MBごとに分割する)


分割した結果は、ファイルがあるのと同じディレクトリ配下に、1_ファイル、2_ファイル、3_ファイル ・・・ といった感じで出力される。なお、行単位で処理するので、指定したサイズでぴったりで分割されるわけではない。


splitFile.pl

use strict;
use warnings;
use Getopt::Long 'GetOptions';
use File::Basename;

my $maxSize;
GetOptions(
    'size=s' => \$maxSize,
);

if (!$maxSize) {
    die "Need to specify the max size(byte)...";
}

my $maxSizeNum = convertToNum($maxSize);

my $inFile = $ARGV[0];
if (! -f $inFile) {
    die "There is not $inFile file...";
}

my $fileCnt = 1;
my $outFile = createOutputFilePath($inFile, $fileCnt."_");
open(my $outFh, "> $outFile") or die("Error :$!");
open(my $inFh,  "< $inFile")  or die("Error :$!");

my $sizeSum = 0;
my $count = 0;
foreach my $line (<$inFh>) {
    $sizeSum += length($line);
    if($maxSizeNum < $sizeSum) {
        if ($count > 0) {
            # Clear the current output file.
            close($outFh);
            $sizeSum = 0;
            
            # Go to next output file.
            $sizeSum += length($line);
            $fileCnt++;
            $outFile = createOutputFilePath($inFile, $fileCnt."_");
            open($outFh, "> $outFile") or die("Error :$!");
            print($outFh $line);
            $count++;
            next;
        }
    }
    print($outFh $line);
    $count++;
}

print "$count lines are split by $fileCnt files.\n";

close($inFh);
close($outFh);

sub createOutputFilePath {
    my ($inputFilePath, $suffix) = @_;
    my ($name, $dir) = fileparse($inputFilePath);
    my $outputFilePath = $dir . $suffix . $name;
}

sub convertToNum {
    my $maxSize = shift;
    if ($maxSize =~ m/^\d+$/) {
        return $maxSize;
    }
    elsif ($maxSize =~ m/^(\d+)(K|k)$/){
        return $1 * 1024;
    }
    elsif ($maxSize =~ m/^(\d+)(m|M)$/){
        return $1 * 1024 * 1024;
    }
    else {
        die("Invalid input...");
    }
}


ちなみに、例えば Windowsには、ファイルを指定したバイト数で分割する Makecab というコマンドがある。当初はそれを使ってファイル(UTF-8)を分割しようと思っていたのだが、何故だか分割されたファイルの内容がところどころ文字化けするので、上記の perl スクリプトを作成した。Makecab コマンドで文字化けする現象については、幾つか情報が見つかったが、結局、原因は分からなかった。
Makecabコマンドによるファイル分割の問題について | Ask CORE
https://qiita.com/tmd45/items/df6f84d61911f1e814d8