Yado_tech

旅館+ITとはなんぞ

odoo12をUbuntuにインストールするwith docker

新しくPOSを選定するにあたってodooを導入することにした。
以前はWindows上に作っていたのだが今回はUbuntuにインストールすることにした。

そしていつもアンインストールなんかがめんどくさそうなので今回はdockerに載せることにした。

てことでここを参考にDockerをインストールした。

docs.docker.com

つぎはここを参考にDockerにOdoo12をインストールした。

hub.docker.com

以前はコマンドを一個一個打っていっていたのだが、こちらのほうが全然早いと思う。

毎週Beds24のAPIから稼働室数をメールするスクリプトを書いた。

前回と前々回の記事から作った。

//メインの関数
function mailOccupancyData(){
  getDataFromBeds24()
  mailToMyself('yourmailaddress')

}

//Beds24からいろいろ情報を取ってくる。
function getDataFromBeds24() {

  //初期設定などはここから
  
  //username はBeds24で登録しているメアド
  var username = "your@mailaddress"
  
  //passwordはBeds24のAPI KEY
  var password = "yourAPIKEY"
  
  //このスクリプトを配置しているSpreadsheetのID
  var shid = "yourspreadsheetid"
  
  //いつから(datefrom)いつまで(dateto)
  var datefrom = "2019-10-01"
  var dateto = "2020-01-31"

  //roomid(Beds24の部屋ID)
  var roomid = ["roomid","roomid"]
  
  //ここまでは各自書き換えてください。
  var url = "https://www.beds24.com/api/csv/getroomdailycsv"
  var sp = SpreadsheetApp.openById(shid)
  var sheets = sp.getSheets() 
  
  if(roomid.length>sp.getNumSheets()){
  for (var i=1 ; i <= roomid.length; i++){
    sp.insertSheet()    
  }
}

  
  for (var i=0 ; i < roomid.length ; i++){
  var options = {
    method:"post",
    followRedirects:false,
    payload:{
      username:username,
      password:password,
      propid:"yourpropid",
      roomid:roomid[i],
      datefrom:datefrom,
      dateto:dateto
    }
  }
  
  var res = UrlFetchApp.fetch(url,options)
  var csvfile = Utilities.parseCsv(res)
  Logger.log(i)
  var firstsh = sheets[i]
  firstsh.clear()
  firstsh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile)
  Utilities.sleep(5000)
}

  
  //最後のシートにクエリ関数を作成する
  var sh = sheets[sheets.length-1].activate()
  var formula = "=QUERY({"
  
  for (i in roomid){
    formula += sheets[i].getName() + '!A2:L;'
  }
  formula = formula.slice(0,-1)
  formula += '\},\"select Col1 ,Col2 ,sum(Col5) where Col2 is not null group by Col1 , Col2 label sum(Col5) \'\'\")'
  
  //Logger.log(formula)
  
  sh.getRange('A1').setFormula(formula)
  
  //Logger.log(sh.getRange('B4').getValue())

}

//稼働率を計算してメールするスクリプト

function mailToMyself(mail){
  var sh = SpreadsheetApp.getActive().getSheets()
  var data = sh[sh.length-1].getDataRange().getValues()
  var message = ""
  for (i in data){
  Logger.log(i)
  message += data[i][0] + '年' + data[i][1] + '月の稼働部屋数は' + data[i][2] + 'です\n'
  }
  MailApp.sendEmail(mail,'稼働率報告',message)
}

これをトリガー登録できるようにしておしまい。

gasでBeds24のAPIにアクセスする②

今度はCSVファイルをSpreadsheetに書き込んでみた。

パスワードがAPI KEYであることに気づかずに結構グダったが、まぁできた。

function myFunction() {

  var username = "yourusername"
  var password = "youAPIKEY!!!"
  var url = "https://www.beds24.com/api/csv/getbookingscsv"
  var options = {
    method:"post",
    followRedirects:false,
    payload:{
      username:username,
      password:password,
      datefrom:"2019-12-31",
      dateto:"2020-01-01"
    }
  }
  
  var res = UrlFetchApp.fetch(url,options)
  var csvfile = Utilities.parseCsv(res)
  var sp = SpreadsheetApp.create("テストです")
  sh = sp.getSheets()[0]
  sh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile)

}

gasでBeds24のAPIにアクセスする

備忘録的な話

beds24というPMSを使うことにした。なぜならAPIによるアクセスが出来るから。
手始めにGASでAPIにアクセスしてみた。なぜGASなのかというと・・

  • 最終的にはLINE BOTを作りたい
  • pythonだとflaskを使わないといけない=サーバーの設定が必要

ということでその辺をよしなにやってくれるGASで試してみた。

必要なもの

beds24の設定>アカウント>アカウントアクセス>API KEY で確認できる

f:id:devilmakelie:20190623002118p:plain

  • 施設キー

beds24の設定>プロパティ>概要>リンク で確認できる

f:id:devilmakelie:20190623002223p:plain

  • 部屋ID

beds24の設定>プロパティ>部屋 で確認できる

f:id:devilmakelie:20190623002539p:plain

以下コード今回は単純にLogger.logで出力しているが、JSON.parse()とかを使えばあとは好きな風にできると思う。
APIエンドポイントは今回はRoomDatesを使ったが、ほかのURLでも同じようにJSONをPOSTすれば望んだJSONを得ることができると思う。

それではよいAPIライフを!

function beds24apitest(){
  var FACILITY_AT = "youraccesstoken"
  var PROPERTY_AT = "yourpropkey"
  var url = "https://api.beds24.com/json/getRoomDates"
  var payload = {
    "authentication": {
        "apiKey":FACILITY_AT,
        "propKey": PROPERTY_AT
    },
    "roomId": yourroomid,
    "from": "20191231",
    "to": "20200101",
    "incMaxStay": 0,
    "incMultiplier": 0,
    "incOverride": 0,
    "allowInventoryNegative": 0
}
  var options = {
  method : "POST",
  contentType:"application/json",
  muteHttpExceptions:true,
  payload : JSON.stringify(payload)
}
  
  var res = UrlFetchApp.fetch(url,options)
  Logger.log(res)
}

Powershellを始めてみる

f:id:devilmakelie:20190131133254p:plain


だって面白そうだったから・・

 

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~
 

 これを少しずつ写経していくことにする

 

まずインストール。え、powershellって最初から入ってるんじゃないの??

→どうやら最初から入ってるのはWindows Powershell こっちで使うのはPowershell Coreでどちらもほぼ同じだが機能が一部違うらしい。

 

文章作り、item1.txtからitem10.txtを作ってみる。

\PowerShellPractice> 1..10 | ForEach-Object{"" > item$_.txt}

1行だ、簡単。 なんでも1..10で連番が使えるらしい。ということは・・・

>$exmpl = 1..10
>ForEach-Object{"" > item$exmpl.txt}

としてみた。

f:id:devilmakelie:20190131134106p:plain

なぜか思ったようには動かなかった。

今日はそんくらい。じっくり覚えようか迷う。正直Pythonでもいいんだけど新しい言語覚えるのは楽しい。

windowsにprophetをインストールする。

f:id:devilmakelie:20181020212344p:plain

普通にpip install fbprophetだと入らなかったので。

バックエンドでpystanを使用しているのだが、それがwindowsだとpipで入らないのでいくつかの準備が必要だった。

ここをみながらインストールした。

前提としてAnacondaを利用してインストールする。
Anacondaのインストールはこちら

weblabo.oscasierra.net

まずはupdate

conda update conda

次にc++コンパイラのインストール

conda install libpython m2w64-toolchain -c msys2

依存関係のインストール

conda install numpy cython -c conda-forge
conda install matplotlib scipy pandas -c conda-forge

pystanのインストール

conda install pystan -c conda-forge

最後にfbprophetのインストール

pip instal fbprophet

最後だけpipなのはconda install fbprophet -c conda-forgeで入らなかったため。

本当は混ぜたらいけないのだけれど、なぜかpipだと入った。

さくらのVPSにAsteriskを設定し、内線通話するまで

f:id:devilmakelie:20180109191549p:plain

自分用に

まずはOSを選択

自分はUbuntu 16.04 LTSを選びました。Asteriskが簡単にインストールできるため。
ただしスタートアップスクリプトufwは使わないほうがいいと思います。fail2banとコンフリクトしそうな気がします。

アップデートとaptitudeのインストール

sudo apt update
sudo apt upgrade
sudo apt-get install aptitude

fail2banのインストール

sudo aptitude install fail2ban

設定ファイルを書く

最初にfail2banはjail.confファイルを直接編集することは推奨されていないため、jail.localファイルを編集するようにする。

cd /etc/fail2ban
sudo cp jail.conf jail.local
sudo nano jail.local

jail.localに以下の文を追記する

[asterisk-iptables]と[blacklist]を設定してやる

[asterisk-iptables]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@example.org]
logpath  = /var/log/asterisk/security
maxretry = 5
bantime = 259200

[blacklist]
enabled = true
logpath  = /var/log/fail2ban.*
filter = blacklist
banaction = blacklist
bantime  = 31536000   ; 1 year
findtime = 31536000   ; 1 year
maxretry = 10

blacklistの作成

// /etc/fail2ban/filter.d/blacklist.conf の作成
$ cd /etc/fail2ban/filter.d
$ sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/filter.d/blacklist.conf -O blacklist.conf

// /etc/fail2ban/action.d/blacklist.conf の作成
$ cd /etc/fail2ban/action.d
$ sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/action.d/blacklist.conf -O blacklist.conf

/etc/fail2ban/filter.dasterisk.confファイルを編集する
まずはファイルのバックアップ

cd /etc/fail2ban/filter.d
mv asterisk.conf asterisk.conf.old

nano asterisk.confで以下の内容のファイルを作る

# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf


[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#

failregex = SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?/<HOST>/.+?".*
            SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?/<HOST>/.+?".*
            SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?/<HOST>/.+?".*
            SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?/<HOST>/.+?".*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

fail2banの再起動 sudo service fail2ban restart起動する場合はsudo service fail2ban start

iptablesの設定

/etc/iptables/iptables.rulesを設定する

まずはバックアップ

cd /etc/iptables
sudo mv iptables.rules iptables.rules.old

んでsudo nano iptables.rulesで以下を記述する port:5060 UDP:10000~20000だと乗っ取りが怖いので多少変更してやる

具体的にはport:15060 UDP:20000~30000

設定がうまくいかなかったため、そのままでいくことにした。

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT
-A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

sudo iptables-restore > /etc/iptables/iptables.rulesiptablesを再起動する。

sudoが絶対必要なので忘れない!!

asteriskのインストール

sudo aptitude install asterisk

sip.conf, extensions.confのバックアップを取った後、適当に書き換える

cd /etc/asterisk
sudo mv sip.conf sip.conf.old
sudo mv extensions.conf extensions.conf.old

sip.conf

[general]
context=default
port=5060
bindaddr=0.0.0.0
language=ja
allow = ulaw
allow = alaw
allow = gsm
allow = ilbc
dtmfmode = inband

[201]
type=friend
defaultuser=201
secret=pass
host=dynamic
canreinvite=no
nat = force_rport,comedia

[202]
type=friend
defaultuser=202
secret=pass
host=dynamic
canreinvite=no
nat = force_rport,comedia

extensions.conf

[default]
;
; By default we include the demo.  In a production system, you
; probably don't want to have the demo there.
;
;include => demo
exten => 201,1,Dial(SIP/201,30,r)
exten => 201,2,Hangup()

exten => 202,1,Dial(SIP/202,30,r)
exten => 202,2,Hangup()

exten => 203,1,Answer()
exten => 203,2,Playback(hello-world)
exten => 203,3,Hangup()

以上でつながるはず。

出典

Fail2Banでアクセス制限

Fail2Ban (with iptables) And Asterisk - VoIP-Info