カテゴリー: linux

  • メールを送れない環境で、受信するはずのメールを確認する

    メールを送れない環境で、受信するはずのメールを確認する

    はじめに

    redashやwordpressなどシステムが送信するメール場合があるが、外へのメール送信が制限されている環境だとメールを確認することができない。

    redashであればuser作成したあとのpassword設定であったり、
    wordpressであればメールアドレスの変更など。

    システムの投げるメールの本文を確認したい事は結構多い。

    対応

    メールキューの中身を確認する

    システムが何らかの理由でメールが送信できない場合、メールキューというところに蓄積される。(その後指定しか期間を過ぎたらexpireされ、破棄される)

    キューの確認

    # mailq
    -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
    BBC672189242     1762 Mon Oct 22 11:51:30  httpd@kusanagi-aaa.localdomain
                (connect to mail.xxx.co.jp[xxx.xxx.xxx.xxx]:25: No route to host)
                                             system@sumito.jp
    
    -- 10 Kbytes in 1 Requests.
    

    Queue IDを控え、postcat -qコマンドで中身を確認する

    # postcat -q  BBC672189242
    *** ENVELOPE RECORDS deferred/B/BC1DD21B7AD9 ***
    message_size:            1207             183               1               0            1207
    message_arrival_time: Thu Oct 25 14:28:08 2018
    create_time: Thu Oct 25 14:28:08 2018
    named_attribute: rewrite_context=local
    sender_fullname: 
    sender: httpd@kusanagi-uxd.localdomain
    *** MESSAGE CONTENTS deferred/B/BC1DD21B7AD9 ***
    Received: by kusanagi-uxd.localdomain (Postfix, from userid 1000)
        id BC1DD21B7AD9; Thu, 25 Oct 2018 14:28:08 +0900 (JST)
    To: system@sumito.jp
    Subject: =?UTF-8?B?W1ImRCBSbDmlrDopo/jg6H7zjg6vjgqLjg4njg6zjgrk=?=
    X-PHP-Originating-Script: 1001:class-phpmailer.php
    Date: Thu, 25 Oct 2018 05:28:08 +0000
    From: WordPress <wordpress@sumito.com>
    Message-ID: <1a0a2f7069595074466e7d9ef2744d49@r-and-d.rarejob.com>
    X-Mailer: PHPMailer 5.2.22 (https://github.com/PHPMailer/PHPMailer)
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    こんにちは wpadmin さん
    
    お持ちのアカウントのメールアドレスの変更がリクエストされました
    
    もしこれに間違いがなければ、以下のリンクをクリックして変更を行ってください。
    https://sample.sumito.jp/wp-admin/profile.php?newuseremail=1edbc57873c6f3cbae541a8f3ebe
    
    変更をしない場合は、このメールを無視し、削除してかまいません。

    この場合はメールアドレス変更のメール。

    キューの中に記載のあるURLをブラウザに入力すれば、wordpressのメールアドレスを変更することが可能になる。

     

  • Linuxでのswap解放

    Linuxでのswap解放

    はじめに

    気がついたらswapを喰っていることがある

    # top
    top - 10:39:58 up 26 days, 16:25,  1 user,  load average: 0.80, 0.31, 0.20
    Tasks: 132 total,   2 running, 130 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1883152 total,    83772 free,  1363060 used,   436320 buff/cache
    KiB Swap:  1048572 total,   957948 free,    90624 used.   315320 avail Mem 

    この場合は90624 used.

    memoryに抱えきれなかった領域がストレージにdumpされてしまったようだ。ストレージがSSDだったとしても遅いのだが、これがHDDだったりすると阿鼻叫喚だ。

    まず先にやること

    一時的にswapをオフにして、再度オンにする。

    swapoff -a && swapon -a

    ただし、swap outしている領域よりもmemoryが十分に空きがある必要がある。

    他にもアプローチはあることはあるが、

    これで解放できなかったらOS再起動を考えた方が手っ取り早い。

     

  • Failed to Connect to MySQL at localhost: 3306 through SSH tunnel

    Failed to Connect to MySQL at localhost: 3306 through SSH tunnel

    はじめに

    MySQL Workbenchに備わっている sshトンネリング機能を使い、手元のPC/MacからリモートのサーバのDBに繋ぐ方法を紹介。

    やりたいこと

    手元の環境から、MySQL Workbenchがserverにつなぎに行き、そのサーバ内のMySQLに接続させたい。

    workbenchの設定

    Connection Methodを “` Stadard TCP/IP over SSH “` を選択。諸々入力する。

    問題発生

    つながらない

    原因と対処

    mysql内に作成したユーザの接続元を
    127.0.0.1ではなく、localhostとして登録していた。 意味的には同じように思えるが、mysqlの場合はこの辺厳密に区別されるらしい。

    対処

    接続元を127.0.0.1にしてユーザを再作成

    GRANT USAGE ON *.* TO 'tsukada'@'127.0.0.1' IDENTIFIED BY 'password';
    GRANT select ON `database`.* TO 'tsukada'@'127.0.0.1' ;
    
    MariaDB [(none)]> select user,host from mysql.user;
    +----------------+-----------+
    | user           | host      |
    +----------------+-----------+
    | tsukada | 127.0.0.1 |
    +----------------+-----------+
    14 rows in set (0.00 sec)
    
    MariaDB [(none)]> 

    問題なく接続できるようになった

    備考

    リモート接続の際、この本の第三章が非常に良くできている。

    第3章 一歩進んだOpenSSHの使い方
     3-1 TCPポートフォワード
     3-2 プロキシと多段SSH
     3-3 SSHのセッションをコントロールする

    第三章だけでも読む価値はある。とてもおすすめ。

  • CentOS 7/Amazon Linux 2 でtimezoneを変更する

    CentOS 7/Amazon Linux 2 でtimezoneを変更する

    はじめに

    稀にサーバの現在時間を確認しようとした際、想定していた時間と大きくズレていて、見てみるとJST(日本時間)ではなく、UTC(協定世界時)になってある事がある。

    # date
    Wed Oct 17 02:03:17 UTC 2018

    一度設定したらほとんど変更しないタイムゾーン。
    デフォルトでUTCになっていることもあり、JSTに変更したい事が多々ある。

    しかし、変更したい時はだいたい手順を忘れているのでメモを記す。

    手順

    現在のタイムゾーンを確認

    # timedatectl
          Local time: Wed 2018-10-17 02:05:01 UTC
      Universal time: Wed 2018-10-17 02:05:01 UTC
            RTC time: Wed 2018-10-17 02:04:41
           Time zone: n/a (UTC, +0000)
         NTP enabled: yes
    NTP synchronized: no
     RTC in local TZ: no
          DST active: n/a

     

    日本時間に変更する

    # timedatectl set-timezone Asia/Tokyo

    再度タイムゾーンを確認

    # timedatectl
          Local time: Wed 2018-10-17 11:05:17 JST
      Universal time: Wed 2018-10-17 02:05:17 UTC
            RTC time: Wed 2018-10-17 02:04:57
           Time zone: Asia/Tokyo (JST, +0900)
         NTP enabled: yes
    NTP synchronized: no
     RTC in local TZ: no
          DST active: n/a

    Local timeのところがUTCからJSTに変わった。

    この状態でtimeコマンドで現在時間を確認すると,

    # date
    Wed Oct 17 11:05:31 JST 2018

    JSTになり期待通りの結果になる

    もちろん、ログインしなおしてもこの状態は引き継がれる。

    注意事項

    本作業を行うとcronが正常に稼働しない。cronを利用している場合は再起動する必要がある

    systemctl restart crond

     

     

  • GitLabでCLI経由でmerge requestを送る

    GitLabでCLI経由でmerge requestを送る

    はじめに

    GitLabでコマンドベースでmerge requestを作成する。
    postでAPIを叩いていろいろ設定すればそれでも可能だけど、python-gitlabというpython製のツールがとても便利だったので紹介。

    使い方

    pipでpython-gitlabをインストール

    pip install --upgrade python-gitlab

    vi ~/.python-gitlab.cfg

    [global]
    default = somewhere
    ssl_verify = true
    timeout = 5
    
    [somewhere]
    url = https://gitlab.com
    private_token = xXxxxxxxxxxxxxxxxxx
    api_version = 4

    ここで必要になるprivate_tokenはGitLabのユーザ画面から作成することが可能

     

    mergeするスクリプトを作成

    import os
    import gitlab
    
    hostname = '%s' % os.uname()[1]
    
    # gitlabへのURLを入れる
    gl = gitlab.Gitlab('https://gitlab.com/', private_token='xxxxxxxxxxx')
    gl.auth()
    
    # プロジェクト番号をgitlabを調べる
    project = gl.projects.get(123, lazy=True)
    
    mr = project.mergerequests.create({'source_branch': (hostname),
                                       'target_branch': 'master',
                                       'title': (hostname) + ' user list'
                                       })
    
    mrs = project.mergerequests.list(state='opened', order_by='updated_at')[0]
    
    print(mrs.attributes['web_url'])

    実行

    $python merge.py 
    https://gitlab.com/infra/redash-user/merge_requests/30

    作られたmerge requestのページへのリンクが表示される。

    チャットやメールでこのリンクをreviewerに知らせれば、フローも簡略化できる。

    詳しい使い方はこちら

    https://python-gitlab.readthedocs.io/en/stable/index.html

     

  • rbenvのインストール

    rbenvのインストール

    はじめに

    rubyを自由にversion切り替えられるrbenvはとても便利。

    しかし、インストールは少しめんどくさい。

    よく使う手順なのでとりあえず晒す

    手順

    以下、コピペでOK。

    インストールしたいversionは適宜変更すること

    yum -y install openssl-devel readline-devel zlib-devel libcurl-devel git
    cd /usr/local
    git clone https://github.com/sstephenson/rbenv.git rbenv
    mkdir rbenv/shims rbenv/versions rbenv/plugins
    groupadd rbenv
    chgrp -R rbenv rbenv
    chmod -R g+rwxXs rbenv
    cd /usr/local/rbenv/plugins
    git clone https://github.com/sstephenson/ruby-build.git ruby-build
    chgrp -R rbenv ruby-build
    chmod -R g+rwxs ruby-build
    git clone https://github.com/sstephenson/rbenv-default-gems.git rbenv-default-gems
    chgrp -R rbenv rbenv-default-gems
    chmod -R g+rwxs rbenv-default-gems
    
    cat << EOF > /etc/profile.d/rbenv.sh
    export RBENV_ROOT="/usr/local/rbenv" 
    export PATH="\$RBENV_ROOT/bin:\$PATH" 
    eval "\$(rbenv init -)" 
    EOF
    
    cat /etc/profile.d/rbenv.sh
    
    cat << EOF > /usr/local/rbenv/default-gems
    bundler
    rbenv-rehash
    EOF
    
    cat /usr/local/rbenv/default-gems
    source /etc/profile.d/rbenv.sh
    rbenv install -l
    
    yum install gcc bzip2
    rbenv install 2.2.5
    rbenv global 2.2.5
    ruby -v
    
    yum install rubygems -y

    Good ruby life!

  • ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2 “No such file or directory”)

    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2 “No such file or directory”)

    はじめに

    以下のようなエラーが発生する事がある

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")

     

    原因

    mysqlが立ち上がっていない事が多い。

    CentOS7の場合は起動する

    systemctl start mysql

     

  • mauticをDockerで試したが…

    mauticをDockerで試したが…

    はじめに

    OSS版のMarketoのようなマーケティングツールを使いたいとマーケティングチームから話が上がってきたが、Dockerでインストールを試みたが一筋縄に行かなかった。

    問題

    https://qiita.com/kooooooooooooooooohe/items/43f9452acc539dbd3083

    を参考にdocker-composeで立ち上げ、ブラウザでinstallしようとする。

     

    するとこの画面でSQL Syntaxエラーが発生。

    An error occurred while attempting to install the data: An exception occurred while executing 'CREATE TABLE reports (id INT AUTO_INCREMENT NOT NULL, is_published TINYINT(1) NOT NULL, date_added DATETIME DEFAULT NULL, created_by INT DEFAULT NULL, created_by_user VARCHAR(255) DEFAULT NULL, date_modified DATETIME DEFAULT NULL, modified_by INT DEFAULT NULL, modified_by_user VARCHAR(255) DEFAULT NULL, checked_out DATETIME DEFAULT NULL, checked_out_by INT DEFAULT NULL, checked_out_by_user VARCHAR(255) DEFAULT NULL, name VARCHAR(255) NOT NULL, description LONGTEXT DEFAULT NULL, system TINYINT(1) NOT NULL, source VARCHAR(255) NOT NULL, columns LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', filters LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', table_order LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', graphs LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', group_by LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', aggregators LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)', settings LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json_array)', is_scheduled TINYINT(1) NOT NULL, schedule_unit VARCHAR(255) DEFAULT NULL, to_address VARCHAR(255) DEFAULT NULL, schedule_day VARCHAR(255) DEFAULT NULL, schedule_month_frequency VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB': SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'system TINYINT(1) NOT NULL, source VARCHAR(255) NOT NULL, columns LONGTEXT DEFAU' at line 1

    ソースを読んで直そうと試みたが、実運用ではなくちょっと試したいという温度感のようだったので、Dockerを諦め、とりあえず最短で使える方法を選んだ。

    解決方法

    Dockerを諦めた。以下のQiitaの記事のコピペでinstallができる。

    https://qiita.com/bezeklik/items/3cd61156367909e31421

     

    https://jp.mautic.org/
  • mysqlのデータをembulkでBigQueryへ入れredashで確認する

    mysqlのデータをembulkでBigQueryへ入れredashで確認する

    はじめに

    データ解析するにあたり、BigQueryを使いたい事がある。mysqlからデータを取得するところをembulkを使う。embulkのインストール方法から簡単な使い方までまとめた。

    embulkのインストール

    embulkはJavaで作られており、一からinstallしようとすると、割と面倒。今回はDockerを使うこととする。

    BigQueryの設定

    APIs & Servicesでcredentialを作成する。

    jsonファイルダウンロードできるので、適宜保存する。

    Dockerfileを作成

    GCPにプロジェクトを作り、bigqueryに権限を付与。APIで操作できるようjsonファイルを取得する。

    FROM java:7
    MAINTAINER sumito.tsukada "tsukada@sumito.jp"
    
    ENV EMBULK_VERSION 0.8.39
    
    RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
    RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
    RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
    
    WORKDIR /work
    ENTRYPOINT ["java", "-jar", "/opt/embulk.jar"]
    CMD ["--help"]

    build

    # docker build -t tsukada/embulk .
    Sending build context to Docker daemon  2.048kB
    Step 1/9 : FROM java:7
     ---> 5dc48a6b75af
    Step 2/9 : MAINTAINER sumito.tsukada "tsukada@sumito.jp"
     ---> Using cache
     ---> bc78ed50d614
    Step 3/9 : ENV EMBULK_VERSION 0.8.39
     ---> Using cache
     ---> 266476a95a55
    Step 4/9 : RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
     ---> Using cache
     ---> b21e71d6ce44
    Step 5/9 : RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
     ---> Using cache
     ---> 2fb224b24c49
    Step 6/9 : RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
     ---> Running in b27f12583137
    2018-09-18 02:50:32.526 +0000: Embulk v0.8.39
    
    ********************************** INFORMATION **********************************
      Join us! Embulk-announce mailing list is up for IMPORTANT annoucement such as
        compatibility-breaking changes and key feature updates.
      https://groups.google.com/forum/#!forum/embulk-announce
    *********************************************************************************
    Gem plugin path is: /root/.embulk/jruby/2.3.0
    
    Successfully installed uber-0.1.0
    Successfully installed declarative-0.0.10
    Successfully installed declarative-option-0.1.0
    Successfully installed representable-3.0.4
    Successfully installed retriable-3.1.2
    Successfully installed public_suffix-3.0.3
    Successfully installed addressable-2.5.2
    Successfully installed mime-types-data-3.2018.0812
    Successfully installed mime-types-3.2.2
    Successfully installed multipart-post-2.0.0
    Successfully installed faraday-0.15.2
    Successfully installed multi_json-1.13.1
    Successfully installed jwt-2.1.0
    Successfully installed signet-0.9.2
    Successfully installed memoist-0.16.0
    Successfully installed os-1.0.0
    Successfully installed googleauth-0.6.6
    Successfully installed httpclient-2.8.3
    Successfully installed google-api-client-0.24.0
    Successfully installed thread_safe-0.3.6-java
    Successfully installed tzinfo-1.2.5
    Successfully installed time_with_zone-0.3.1
    Successfully installed embulk-output-bigquery-0.4.9
    23 gems installed
     ---> 74e55d0084d6
    Removing intermediate container b27f12583137
    Step 7/9 : WORKDIR /work
     ---> 19d9c56bf738
    Removing intermediate container c73ef21e7b6c
    Step 8/9 : ENTRYPOINT java -jar /opt/embulk.jar
     ---> Running in 4bca2f2ed68e
     ---> b4458584af6f
    Removing intermediate container 4bca2f2ed68e
    Step 9/9 : CMD --help
     ---> Running in 7fdbd68d5021
     ---> 0bfdab6b8d24
    Removing intermediate container 7fdbd68d5021
    Successfully built 0bfdab6b8d24
    Successfully tagged tsukada/embulk:latest

    embulkの設定

    今回はmysqlからデータを抜き、BigQueryに入れるとする。

    in:
      type: mysql
      user: redash
      password: passwd
      database: sample
      host: 127.0.0.1
      query: "select date, user from sampletable"
    out:
      type: bigquery
      auth_method: json_key
      json_keyfile: tsukada-bigquery.json
      path_prefix: /tmp/
      file_ext: .csv.gz
      source_format: CSV
      project: 12345679
      dataset: table123
      auto_create_table: true
      table: user_data
      formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
      encoders:
      - {type: gzip}

    実行

    docker run -t -v ${PWD}:/work tsukada/embulk run sample.yml

    以下のようい表示されればOK

    [INFO] (main): Committed.

    BigQueryで確認

    データが入ったという事がわかった。
    また、

    #standardSQL

    と書いてあるが、これはコメントではなく、BigQueryが判断する重要な宣言になるので削除するとうまく動かないので注意。

     

    redashでBigQueryに接続

    先ほど使ったjsonファイルと接続先のプロジェクトIDを入力すると、redashからbigqueryへ接続する事ができる。

     

     

  • Linux/Macで好きな容量のファイルを作成する

    Linux/Macで好きな容量のファイルを作成する

    はじめに

    一定の容量のあるただのファイルを作成したいことがたまにある。例えばwordpressのupload容量を変更した際の動作テストを行ったりとかが一例。linuxのみならずmacでもddコマンドで簡単に作成することができるのでその方法を紹介。

    ddコマンド

    linuxもmacも共通の手順はこちら(macで実施した際のログ)

    $ dd if=/dev/zero of=~/80M bs=1 count=83886080
    83886080+0 records in
    83886080+0 records out
    83886080 bytes transferred in 189.533890 secs (442591 bytes/sec)
    $

    80Mの空ファイルが作成される。中身は/dev/zeroなので、からっぽ。

    上記例ではcountはバイト単位になる。

     * 1024 * 1024 * 80 = 83886080
    で80MByteという計算。

    ただし、189.533890 secs とあるように、3分以上かかっている。

    これは1回に読み書きするブロックサイズ(bsオプション)が1になっているため。

    この値を1 -> 1024に変更すれば理論上は1024倍高速になる。

    bsを1 -> 1024に変えてみた

    $ dd if=/dev/zero of=~/80M_1024 bs=1024 count=81920
    81920+0 records in
    81920+0 records out
    83886080 bytes transferred in 0.375389 secs (223464489 bytes/sec)
    $ 

    作成されたファイルは同じく80Mだが、0.375389 secsで完了した。

    bsが1の時と、1024の結果を比較した結果、504倍高速になったが、理論上の1024倍には届かなかった(残念だがそうゆうもんだ。。)。

    意外と知られていないddの使い方

    実はddで送った結果を直接他のサーバに送りつけることもできる。

    dd if=/dev/sda | ssh root@転送先サーバ " dd of=/転送先ディレクトリ/server.sda.img"

    DISKの中身を強制的にddコマンドで吸い上げ、他のサーバにイメージとして保存することもできる。今はDocker含むコンテナ全盛期の時代だが、KVMなどを使えば、吸い上げたイメージを元に仮想サーバとして動かすこともできる。

    参考記事

    https://qiita.com/S-T/items/8de3c150c7097bd021fa