システムというほどのものでもないですけど、誰でも出来ると思うのでぜひ。
macアドレスの取得
活動場所にあるネットワーク(Wi-Fi)を利用する端末のMACアドレスを取得するためにnmap
とarp
を利用しました。
nmap -sP 192.168.1.0/24
でローカルで利用されている最新のIPアドレスを取得し
直後にarp -a
を実行する事で接続している端末の最新のmacアドレスを持ってくる事が出来ます。
更に正規表現を利用する事でarp
の実行結果からmacアドレスだけ抜き出しました。
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アドレスと比較します。
class Mac < ActiveRecord::Base
end
users = Mac.where(address: network)
※このとき使うmacアドレスはスマートフォンなど、携帯するものが良いかと。活動場所にあるデスクトップPCのmacアドレスでは在室確認の意味を成さないです。
※自分はこのslack.rb
を5分毎に実行させる様にしています。実行頻度についてはnmap
やarp
コマンドを使うので鯖管と相談する必要があるかと。
#取ってきた名前をスプレッドシートに記録
活動場所は外部に出ているサーバーが無いので、google-drive
というgemを利用して比較した名前をGoogleスプレッドシート上に記録させる様にしました。サーバーがあればそこにデータを表示させるページでも作って公開すれば良いと思います。
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;
}
#稼働状況
機密文書みたいな形になってしまいましたが勘弁してください。
背景と課題
自分が組織に所属しはじめた時にはRaspiを利用した光センサーによる在室確認システムが動いていて、Web上で在室状況をチェックでき、グラフで判断出来て便利でした。一方で、電気をつけっぱなしにして消える人や、センサーの感度が悪くなる経年劣化から、誰も管理しなくなったので、タイトルのとおり作ってみたのですが、毎日コマンドが叩かれていて作ってよかったかな、と。問題は外部からアクセス出来るサーバーを用意出来ないのとmacアドレスを差し出してくれない先輩が居るという2点でしたが、前者はGASやGSSを利用する事で解決出来ました。後者に関してはSlackのrtm apiを利用する事で解決出来そうです…。