LoginSignup
50
54

More than 5 years have passed since last update.

macアドレスとslackを活用した在室確認システム作ってみた

Last updated at Posted at 2016-07-01

システムというほどのものでもないですけど、誰でも出来ると思うのでぜひ。

macアドレスの取得

活動場所にあるネットワーク(Wi-Fi)を利用する端末のMACアドレスを取得するためにnmaparpを利用しました。
nmap -sP 192.168.1.0/24でローカルで利用されている最新のIPアドレスを取得し
直後にarp -aを実行する事で接続している端末の最新のmacアドレスを持ってくる事が出来ます。
更に正規表現を利用する事でarpの実行結果からmacアドレスだけ抜き出しました。

slack.rb
def network 
    %x[nmap -sP 192.168.1.0/24] 
    %x[arp -a].gsub(/\n/,'').scan(/[0-f]+:[0-f]+:[0-f]+:[0-f]+:[0-f]+:[0-f]+/)
end

取得したmacアドレスとユーザーの比較

予め、活動場所に在籍する人の名前とmacアドレスを紐付けたDBを作成しておいて(自分はsqlite3を使った)、ActiveRecordを利用して取得してきたmacアドレスと比較します。

slack.rb
class Mac < ActiveRecord::Base
end
users = Mac.where(address: network)

※このとき使うmacアドレスはスマートフォンなど、携帯するものが良いかと。活動場所にあるデスクトップPCのmacアドレスでは在室確認の意味を成さないです。
※自分はこのslack.rbを5分毎に実行させる様にしています。実行頻度についてはnmaparpコマンドを使うので鯖管と相談する必要があるかと。

取ってきた名前をスプレッドシートに記録

活動場所は外部に出ているサーバーが無いので、google-driveというgemを利用して比較した名前をGoogleスプレッドシート上に記録させる様にしました。サーバーがあればそこにデータを表示させるページでも作って公開すれば良いと思います。

slack.rb
session = GoogleDrive.saved_session("config.json")
ws = session.spreadsheet_by_key("GASのtoken").worksheets[0]
if users.count == 0 then
  ws[1,1] = ""
  ws.save
else
  users.each_with_index do |addr,idx|
    ws[idx+1,1] = addr.name
    if idx == users.count - 1
      ws[idx+2,1] = ""
    end
  end
  ws.save
end

Slackのチャットに合わせてスプレッドシート上の内容を投稿させる

GoogleAppScriptにそれ用の関数を書きました。(Qiitaに投稿されてたSlack用ライブラリを使いました)
この際、Slack側でtokenを取得しておく必要があり、その際にどのチャットでPostさせるか決める必要があります。
(自分はコマンドっぽくstay?にしてみました。)

function doPost(e) {
  var slackApp = SlackApp.create("token");
  var data = gss();
  var message = "活動場所に居るメンバー\n";
  data.some(function(val,index,ar){
    if (val == "") {
      message +="\n";
      return true;
    }
    message += val+"\n";
  });
  if(message.length <= 13){
    message = "活動場所には誰も居ません";
  }
  slackApp.chatPostMessage("流すチャンネル名",message, {
    username : "BOTのユーザー名",
    icon_emoji : ":house:"
  });
}
function gss(){
  var url = "スプレッドシートのURL(#gid=0まで)";
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheets = spreadsheet.getSheets();
  var sheet = sheets[0];
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = sheet.getLastColumn();
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);
  return sheetdata;  
}

稼働状況

機密文書みたいな形になってしまいましたが勘弁してください。
screenshot4.png

背景と課題

自分が組織に所属しはじめた時にはRaspiを利用した光センサーによる在室確認システムが動いていて、Web上で在室状況をチェックでき、グラフで判断出来て便利でした。一方で、電気をつけっぱなしにして消える人や、センサーの感度が悪くなる経年劣化から、誰も管理しなくなったので、タイトルのとおり作ってみたのですが、毎日コマンドが叩かれていて作ってよかったかな、と。問題は外部からアクセス出来るサーバーを用意出来ないのとmacアドレスを差し出してくれない先輩が居るという2点でしたが、前者はGASやGSSを利用する事で解決出来ました。後者に関してはSlackのrtm apiを利用する事で解決出来そうです…。

50
54
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
50
54