星期三, 11月 16, 2016

Building dynatrace easyTravel from Source

  1. 在 dynatrace 官網下載 easyTravel 的原始碼壓縮檔,假設解壓目錄名為 ~/Downloads/dynatrace-easytravel-src。
  2. 安裝 Java、Ant。
  3. 編輯 /etc/hosts,為本機增加一個名稱,例如 osboxes。
  4. 切換至 ~/Downloads/dynatrace-easytravel-src/Distribution 目錄,執行 ant 命令,將產生 dist 子目錄放置編譯結果。
  5. 編輯 dist/startDistribution.sh,找到一行「export WEBLAUNCHER=set-this-property」,改為「export WEBLAUNCHER=osboxes」,存檔並執行,即會出現 easyTravel 的網頁管理介面。
  6. 在管理介面關閉 Mobile 相關的前端,也不要自動產生模擬流量,以節省資源。
  7. 在管理介面啟動 Production -> Standard 模式,注意資料庫必須正常運作,否則請檢查紀錄並排除問題。
  8. Credit Card Auth. (C++) 啟動失敗可以忽略,另外兩項在啟動過程中逾時,事實上已在提供服務。若在意的話,停止再啟動應能成功,否則請檢查紀錄並排除問題。
  9. 透過瀏覽器登入,帳密可用 afrida / afrida,網頁應會回應「Hello Afrida Afwika!」。

星期三, 11月 02, 2016

SonarQube Time Zone

SonarQube 預設使用 UTC,對於不夠國際化的我們是有點不方便。要如何在地化?編輯 sonar.properties,應可找到以下不連續的三行:
  • #sonar.ce.javaAdditionalOpts=
  • #sonar.search.javaAdditionalOpts=
  • #sonar.web.javaAdditionalOpts=
修改如下即可:
  • sonar.ce.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
  • sonar.search.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
  • sonar.web.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
參考來源在此。

[2016/12/15]
其實這個問題應該回歸到作業系統的時區設定才對,當初先這麼做但失敗了,後來細究原因,才發現可能是因為沒有依照這篇舊聞。因為我的 SonarQube 是一個 Docker Container,而底下的作業系統是 Debian,無意間又找到另一種做法,指令如下:
  • dpkg-reconfigure tzdata

星期二, 11月 01, 2016

Docker container crash?

我負責的許多 Application Server 逐漸移到 Docker 上,最近常遇到休個週末回來就不行了?原來是這些在 VM 裡的 Docker 為了節能減碳,公司的政策是預設每週會自動停機,當底下的 VM 重啟之後,可以檢查到 Application Server 即使是開著的,埠口是外露的,也都只能在 container 本機存取服務,外界一概連不進去。
如此一定先懷疑防火牆吧?怪的是又沒去改,為何上週可以而本週不行?而且即使是整個防火牆都關了,也只修好一半,由完全失聯到「准進不准出」,像是 Jenkins 連不到外面的 Plugin Update Center,或是 SonarQube 連不到認證的 LDAP Server 等等。
最後找到真正的解法是 Docker Service 必須重啟。

星期三, 10月 26, 2016

Docker-based SonarQube

首先當然是要把 Docker 裝好,再來照這裡的說明只要一行指令:
  • docker run -d --name sonarqube1 -p 9000:9000 sonarqube
裝好了,要等個幾分鐘才開得起來。若是急性子可下指令觀察進度:
  • docker logs sonarqube1
用瀏覽器連要記得加上埠號 http://sonarqube1:9000。接著就再看看有什麼變化,例如希望使用者不需要加埠號即可訪問,改個設定就好(其實是另開新機):
  • docker stop sonarqube1
  • docker rm sonarqube1
  • docker run -d --name sonarqube2 -p 80:9000 sonarqube
SonarQube 是未登入即可看到內容,但管理者登入後才能設定,預設帳密都是 admin。在 SystemInfo 看到時區是錯的?可以參考這篇調整,但指令要在 container 裡面下:
  • docker exec -it sonarqube2 sh
另外,在首頁有提醒「Embedded database should be used for evaluation purpose only」,那來裝個 MySQL 好了(可參考這裡):
  • docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD=changeit mysql
不同於預設的 h2 database,在 MySQL 我們要自行準備一個空的資料庫與足夠權限的登入帳密給 SonarQube 用,而且現在是分別由兩個 container 負責,有點像是兩部主機,所以可像這樣設定:
  • docker exec -it mysql1 sh
  • mysql -u root -pchangeit
  • create database sonardb;
  • grant all on sonardb.* to sonaruser@'%' identified by 'sonarpass';
  • flush privileges;
  • exit
  • exit
為了模擬未來是跨 container 的通訊,可以另開一部 MySQL 並僅使用 client 端命令工具,來驗證準備給 SonarQube 用的資料庫。先查一下 mysql1 的位址:
  • docker inspect mysql1 | grep IPAddress
接著是第二部 MySQL:
  • docker run -d --name mysql2 --link mysql1 -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
  • docker exec -it mysql2 sh
  • mysql -h <mysql1_IPAddress> -u sonaruser -psonarpass
  • show databases;
  • exit
  • exit
注意 show databases; 的結果要看得到 sonardb 才對。接著還是依這篇最早提到的參考網址,重啟另一部連接 MySQL 的 SonarQube:
  • docker run -d --name sonarqube3 -p 9000:9000 --link mysql1 -e SONARQUBE_JDBC_USERNAME=sonaruser -e SONARQUBE_JDBC_PASSWORD=sonarpass -e "SONARQUBE_JDBC_URL=jdbc:mysql://mysql1/sonardb?useUnicode=true&characterEncoding=utf8" sonarqube
[2017/03/07]
搭配 PostgreSQL 似乎更容易些,且效率、評價都好,精簡至四道指令完成:

  • docker run -d --name postgres1 postgres
  • docker exec -it postgres1 createuser -U postgres -d -P -s sonar (input sonar / sonar)
  • docker exec -it postgres1 createdb -U sonar sonar
  • docker run -d --name sonarqube4 -p 9000:9000 --link postgres1 -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres1/sonar sonarqube

星期二, 10月 25, 2016

Red Hat Startup

CentOS 用這麼久了,原以為系出同門的 Red Hat 應該相去不遠才是,沒想到剛開始就踢到鐵板 - 沒有 yum?這樣是要叫人家怎麼裝東西?
好吧,先去 Red Hat 網站申請個帳號,再下指令:
  • subscription-manager register --username 帳號 --password 密碼 --auto-attach
然後呢?網路不通?連 ifconfig 都沒有?替代品:
  • ip a
沒有向 DHCP 取 IP,其實是網路介面在離線狀態,請看指令與前後查詢的結果(注意 enp0s8):

Linux access by non-root

用 root 帳號存取 Linux 是方便也是危險的。試想有人要攻一部主機時,沒有帳號是不能猜密碼的,他首先會猜這上面有什麼帳號?又哪個帳號具有最大的權限,讓攻下之後的效益最大?
通常建議平時的操作都用普通的使用者,只有在需要的時候取 root 權限做事,也就是 sudo。例如要新建一個 user1 帳號(此時還是 root 身分):
  • userdel -r user1
  • useradd user1
  • passwd user1
要如何設定 user1 在必要時能取得 root 權限?可以編輯 /etc/sudoers,通常會有這兩行:
  • ## Allow root to run any commands anywhere
  • root    ALL=(ALL)       ALL
仿上例,加以下一行即可:
  • user1   ALL=(ALL)       ALL
但這個檔案預設本身的權限是 440,只有 root 與其群組唯讀,所以要開放可寫才能修改。這樣有點麻煩?還可以參考同檔案通常還有這兩行:
  • ## Allows people in group wheel to run all commands
  • %wheel  ALL=(ALL)       ALL
也就是在不修改 /etc/sudoers 的情況下,將使用者加入 wheel 群組可達到同樣的效果,指令是:
  • usermod -aG wheel user1

星期二, 10月 11, 2016

Mac + VirtualBox + BlueStack => Crash

最近我 Mac 上的 Line 一直都不安份,常要求訊息加密(Letter Sealing)的身分驗證。由於沒有實體 Smartphone 的關係,一直要開 BlueStack 模擬很麻煩就算了,還會讓稍後再開 VirtualBox 的 Mac 當機!原來這兩個軟體是有些愛恨情仇的。而且 Bluestack 竟然也一年沒更新了,暫時就先關閉訊息加密吧,有空再找時間試試 Genymotion 能否取代掉 Bluestack。