顯示具有 linux 標籤的文章。 顯示所有文章
顯示具有 linux 標籤的文章。 顯示所有文章

2022/02/11

VMWARE VM linux 擴充硬碟空間

可以參考 AWS 上面的文章

 https://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html 

但 EC2 流程更簡單, 你在EC2調整後他自動幫你最佳化到好. Linux 內部他幫你處理了.

VMWARE ESXi 就自己動手流程是

  1. 先調整 VMWARE 的VM硬碟空間
  2. 再去 LINUX 擴大硬碟分割區
  3. 然後把
  4.  FileSystem 放大

就好了...XD

but 很重要的是, 因為這些有風險建議先備份免得出意外!!! 


VMWARE ESXi Ubuntu Linux 放大VM硬碟

ESXi 把要放大硬碟的VM主機關機, 調整外部的硬碟容量設定大小(增大)

重開機, 從 ESXi console 登入 root 調整

可以先檢查目前的 disk 容量

# fdisk /dev/sda -l

重新掃描磁碟, ex: /dev/sda

# echo 1 | sudo tee -a /sys/block/sda/device/rescan

延伸VM磁碟配置表 , 延伸後可以再檢查看看VM硬碟容量是否已經改變

#  growpart /dev/sda 3

重新讀取磁碟配置表

#  partprobe -s /dev/sda

延伸 LVM 的 Physical Extent (PE) , pvdisplay 可以檢查pv容量是否變化

#  pvresize -v /dev/sda3

延伸 LVM 的 Logical Volume (LV)

* 完全延展

# lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

* 指定容量延展

# lvextend -L +100G /dev/ubuntu-vg/ubuntu-lv

延伸檔案系統 size , 可以用 df -lh 檢查容量

# resize2fs /dev/ubuntu-vg/ubuntu-lv





2018/03/01

memcached UDP 放大攻擊之亂--Centos7 關閉UDP及只綁定127.0.0.1


昨晚機器流量異常....爆增流量




* 十小時前的新聞
https://www.ithome.com.tw/news/121543
"Majkowski建議不使用UDP的Memcached用戶應直接關閉該通訊埠,或確保自己的Memcached伺服器受到防火牆的保護,也提醒開發人員最好不要使用UDP,就算不得不用,也不應預設為啟用狀態,並應嚴格限制回應封包的大小,以免成為駭客執行DDoS攻擊的幫兇。"

* 七小時前的新聞
https://www.networkworld.com/article/3258772/security/memcached-servers-can-be-hijacked-for-massive-ddos-attacks.html

* memcached 伺服器參數 ConfiguringServer
https://github.com/memcached/memcached/wiki/ConfiguringServer#commandline-arguments

* 看一下啟動程序怎麼寫的
[root@dev ~]# more /usr/lib/systemd/system/memcached.service
...SKIP 略...
[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
...SKIP 略...

* 看來改一下 memcached 的 OPTIONS 就可以
* -l 參數可以指定接收的 interface
* -U 可以關閉 UDP port
[root@dev ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1 -U 0"

* 重新啟動
[root@dev ~]# systemctl restart memcached.service

* 檢查 netstat 看看是否只剩下 127.0.0.1:11211 的
[root@dev ~]# netstat -tnulp | grep mem
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      12810/memcached




2017/09/17

CENTOS7 安裝 NGINX 並請申請 Letsencrypt SSL憑證使用

CENTOS7 安裝 NGINX 並請申請 Letsencrypt SSL憑證使用

# 首先先看看網路上的教學安裝文章, 照著作把 nginx 安裝起來
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7

# 然後安裝憑證, 這個 Letsencrypt 目前用程式安裝憑證
https://letsencrypt.org/



# 請依據制這裡的說明, 安裝程式及工具
https://certbot.eff.org/#centosrhel7-nginx



# 先把 domain FQDN 對應 IP 設定好
# 執行憑證申請及安裝, 因為 Letsencrypt 有縣市 IP 及 Domain 所以申請盡可能一次就成功。
# 依據說明執行
[root@dev letsencrypt]# certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: api.jangmt.com
2: dev.jangmt.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):2
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for dev.jangmt.com
Waiting for verification...
Cleaning up challenges
Cannot find a cert or key directive in /etc/nginx/conf.d/dev_jangmt_com.conf for set(['dev.jangmt.com']). VirtualHost was not modified.

IMPORTANT NOTES:
 - Unable to install the certificate
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/dev.jangmt.com/fullchain.pem. Your cert will
   expire on 2017-12-16. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again with the
   "certonly" option. To non-interactively renew *all* of your
   certificates, run "certbot renew"


# 失敗了, 因為還沒有設定好 cert or key directive  我們可以手動設定.
# 檢查一下 /etc/letsencrypt/ 應該有可以使用的憑證在 live 目錄內
[root@dev conf.d]# ls /etc/letsencrypt/ -la
total 20
drwxr-xr-x.   8 root root 4096 Sep 17 04:48 .
drwxr-xr-x. 143 root root 8192 Sep 17 05:03 ..
drwx------.   3 root root   49 Sep 17 04:03 accounts
drwx------.   4 root root   60 Sep 17 04:07 archive
drwxr-xr-x.   2 root root   72 Sep 17 04:07 csr
drwx------.   2 root root   72 Sep 17 04:07 keys
drwx------.   4 root root   60 Sep 17 04:07 live
-rw-r--r--.   1 root root  822 Sep 17 04:03 options-ssl-nginx.conf
drwxr-xr-x.   2 root root   70 Sep 17 04:07 renewal
 
 
# 然後設定一個初始的 NGINX 設定 /etc/nginx/conf.d/default.conf
# -----------------------------------------------------------
# http
server {
server_name _;
listen *:80 default_server deferred;
        # return 301 https://$server_name$request_uri;

        access_log  /var/log/nginx/access.log  main;
        error_log   /var/log/nginx/error.log warn;

        location / {
              root /usr/share/nginx/html;
              index  index.php index.html index.htm;
        }

        location ~ \.php$ {
                root           /usr/share/nginx/html;
                try_files $uri = 404;
                fastcgi_pass   127.0.0.1:9000;
                #fastcgi_pass unix:/var/opt/remi/php70/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        /etc/nginx/fastcgi_params;
        }

        location ~ /\.ht {
                deny  all;
        }
}


# https
server {
       listen 443 ssl default_server;
       server_name _;

       ssl_certificate /etc/letsencrypt/live/dev.jangmt.com/cert.pem;
       ssl_certificate_key /etc/letsencrypt/live/dev.jangmt.com/privkey.pem;

       access_log  /var/log/nginx/access.log  main;
       error_log   /var/log/nginx/error.log warn;
       server_tokens off;

       location / {
             root /usr/share/nginx/html;
             index  index.php index.html index.htm;
       }

        location ~ \.php$ {
                root           /usr/share/nginx/html;
                try_files $uri = 404;
                fastcgi_pass   127.0.0.1:9000;
                #fastcgi_pass unix:/var/opt/remi/php70/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        /etc/nginx/fastcgi_params;
        }

        location ~ /\.ht {
                deny  all;
        }

       #return 301 http://$server_name$request_uri;
}




# 然後, 就設定好了....XDXD
# 我知道跳過很多步驟, 因為我看得懂就好.
# 有錯誤隨時檢查 /var/log/nginx/error.log 紀錄檔
[root@dev conf.d]# tail /var/log/nginx/error.log
2017/09/17 05:06:08 [error] 4159#0: *11 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 59.127.16.209, server: 0.0.0.0:443
2017/09/17 05:06:09 [error] 4159#0: *12 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 59.127.16.209, server: 0.0.0.0:443

# 上面這個錯誤, 是我憑證沒有設定好造成的.
基本上如果有多個網站在同一個 NGINX 上的時候, default site conf 要先設定好, 才可以正常工作.
# Good Luck !!




2017/07/05

Nginx Ip Whitelist (白名單快速轉成 nginx 使用的清單)

Nginx Ip Whitelist

by pass whitelist ref: http://www.kitploit.com/2016/11/fireaway-next-generation-firewall-audit.html


# 白名單設定方式可以參考 stackoverflow 這一篇
https://stackoverflow.com/questions/13917866/nginx-ip-whitelist

# 中文可以參考這一篇
https://www.centos.bz/question/nginx-ip-whitelist/


想把白名單快速轉成 nginx 使用的清單, 但是又不想寫太多程式。
所以直接用 google spreadsheets 轉成 csv 功能
透過 linux shell script 轉換成為 nginx 可以使用的清單

在實際工作動作:
客服人員:編輯 spreadsheets 檔案
系統人員:白名單轉成檔案驗證,並 reload nginx 生效.

## ----------------------------------------------------
## linux script
## ----------------------------------------------------
#!/bin/bash
# 編輯網址 , google doc 權限設定控制
# 將 google doc 白名單取出成為 csv
URL="https://docs.google.com/spreadsheets/d/{請改成你的網址}/pub?gid=0&single=true&output=csv"
echo "w3m -dump '${URL}' > whitelist.csv" | sh

# 備份原本的白名單
mv -f customer_ip customer_ip.bak
echo "# $(date -R) update." > customer_ip
# 去除註解
grep -v '#' "whitelist.csv" > tmp_file
# 取行數
max=$(wc -l tmp_file  | cut -f1 -d" ")
for i in `seq 1 $max`
do
    line=$(awk "NR==${i}" tmp_file)
    action=$(echo $line | cut -d, -f1)
    cidr=$(echo $line | cut -d, -f2)
    echo "${action} ${cidr};" >> customer_ip
done
rm -f tmp_file
#rm -f whitelist.csv

# nginx 重新啟動
# run in /etc/nginx/conf.d
echo "restart NGINX service"
systemctl reload nginx
# return
echo "OK! Done. csv URL in ${URL} ";
## ----------------------------------------------------



2017/07/01

Linux Performance 效能評估工具


這個文章說明了系統個連接點的效能評估工具與方式。
http://www.brendangregg.com/linuxperf.html

netflix 工程師先透過 10 個工具在 60 秒告訴你,系統的效能摘要狀況...
http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html

接下來要仔細的分析效能上面的問題,透過 Brendan’s Linux Performance Tools tutorial 的這一篇文章來解釋。


每個指令都是獨有專精的效能評估工具
例如 : perf
https://perf.wiki.kernel.org/index.php/Main_Page
他是可以顯示CPU 上面資訊的計數器 及分析軟體、硬體的性能。
http://wiki.csie.ncku.edu.tw/embedded/perf-tutorial   成大資工WIKI

看起來就是折磨研究生的工具,但是工程師的好朋友。(泣...)

其他就慢慢研究,遇到再來使用了。





Bitnami 的預設安裝 VM 及容器服務

https://bitnami.com/   是一個提供預先安裝基礎建設及應用程式的服務網站,可以讓開發人員「初期」不用花太多心思再基礎建設上面,就可以用預先安裝好的服務。

所以先選你要的機器影像檔 VM
https://bitnami.com/stack/nginx/virtual-machine

因為我用的是 Linux KVM 但上面只提供 .OVA 格式,所以需要轉換一下格式。
https://wiki.hackzine.org/sysadmin/kvm-import-ova.html  KVM: Importing an OVA appliance

然後就是設定 KVM 的 Machine 了!!
(略)

設定好後,把 SSH 打開最重要的。
https://docs.bitnami.com/virtual-machine/faq/

至於服務該如何使用,可以參考他的文件說明

其他的操作,就和一般使用 Linux 是一樣的。很快速的你就可以有一個可靠的開發環境了。

最後,bitnami 會自動回傳統計資訊回他的網站,記得把他關閉。


2016/11/26

STOMP/MQTT 通訊協定的測試心得(client/server)

STOMP 通訊協定的測試心得(client/server)

STOMP 是啥東西? 
STOMP 是 Simple (or Streaming) Text Oriented Message Protocol 的縮寫
主要提供一個可以操作的通訊界面,可以支援不同平台的的客戶端交換文字訊息。它屬於一個訊息導向的中介軟體。這個服務類似 HTTP ,並且架構於 TCP 上面。
ref: https://segmentfault.com/a/1190000004906137 功能示意圖


用來搭建 IM (即時通訊服務) 是很簡單好用的中介工具
https://segmentfault.com/a/1190000004906137 

這裡有目前常見的訊息中介軟體的比較介紹 amqp mqtt or stomp
http://blogs.vmware.com/vfabric/2013/02/choosing-your-messaging-protocol-amqp-mqtt-or-stomp.html

建議和 html5 websocket 一起看,比較容易理解它到底再做啥? P66 頁開始。
http://www.slideshare.net/peterlubbers/html5-real-time-and-websocket/94-Learn_More_HTML5_User_Groups

這裡有 function 功能規格說明
https://mq.java.net/4.4-content/stomp-funcspec.html

這個大概就是目前的官方網站了
https://github.com/stomp-php/stomp-php/wiki

這個服務主要構過 broker 來提供服務,目前 broker 的軟體有很多種可以提供。

broker -- STOMP Servers
broker -- STOMP Servers 的列表,常用的。
https://stomp.github.io/implementations.html
我裡以 apache apollo 這套 activemq 的子專案,來做說明。

Apollo 1.7.1 版本,下載我是以 Linux 版來說明
http://activemq.apache.org/apollo/download.html

提供有 4 種存取的方式
WS  --  TCP + Websocket
WSS -- TCP + TLS + Websocket
HTTP -- TCP + HTTP
HTTPS -- TCP + TLS + HTTP
ref: http://www.slideshare.net/peterlubbers/html5-real-time-and-websocket/78-ws_and_wss_schemes_78


// 安裝說明文件
http://activemq.apache.org/apollo/documentation/getting-started.html

解開檔案後,我把它放在 /opt 上面 , 並使用這個程式建立一個 broker 名稱為 jangmtbroker 放在 /var/lib/ 上面
# /opt/apache-apollo-1.7.1/bin/apollo create jangmtbroker
Creating apollo instance at: jangmtbroker
Generating ssl keystore...

You can now start the broker by executing:

   "/var/lib/jangmtbroker/bin/apollo-broker" run

Or you can setup the broker as system service and run it in the background:

   sudo ln -s "/var/lib/jangmtbroker/bin/apollo-broker-service" /etc/init.d/
   /etc/init.d/apollo-broker-service start
 
* 設定為啟動的服務
# sudo ln -s "/var/lib/jangmtbroker/bin/apollo-broker-service" /etc/init.d/
* 接下來,就可以透過底下指令啟動它
# /etc/init.d/apollo-broker-service start


* 啟動後會有一個管理界面 Web Administration 預設只開放 127.0.0.1 可以改的
* 如果要修改可以參考 etc 下面的 xml 設定檔。
http://127.0.0.1:61680/ or https://127.0.0.1:61681/
* 預設帳密 admin and password.

# 在系統會看到 appolo 的 port
# netstat -antlp | grep apollo
tcp6       0      0 :::61613                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61614                :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61680         :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61681         :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61623                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61624                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::32777                :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61680         127.0.0.1:53532         ESTABLISHED 11471/apollo      
tcp6       0      0 127.0.0.1:61680         127.0.0.1:53536         ESTABLISHED 11471/apollo

* 防火牆記得要開這幾個 port


* 當然,預設密碼很危險,可以參考下列文件修改預設帳密
https://activemq.apache.org/apollo/documentation/user-manual.html#Using_Custom_Login_Modules

* apollo.xml 為系統主要設定檔, 可以針對 access_rule 設定權限
ex: 允許群組 admins 可以操作所有的動作
access_rule action="*" allow="admins"ex: 允許群組 monotors  可以操作連線及觀看系統狀態的功能
access_rule action="connect monitor" allow="monitors"
ex: 允許群組 appusers 可以操作連線、建立、送出、接收訊息
access_rule action="connect create send receive consume" allow="appusers"
ex: 允許群組 appusers 可以操作連線、建立、接收訊息
access_rule action="connect create  receive consume" allow="users"
透過這樣的區隔,可以仔細的分別設定不同的權限群組。

# 設定個別使用者的密碼,也可以用加密 ENC 方式設定
[root@dev etc]# grep -v '#' users.properties
# 帳號=密碼
mtchang=密碼
demo=密碼
app1=密碼

# 將使用者,分配到不同的群組,一個群組如果需要很多人可以使用 | 符號連接。
[root@dev etc]# grep -v '#' groups.properties
admins=mtchang
monitors=admin
users=demo
appusers=app1


# 以上,這樣 server 端就好了。
// --------------------------------------------------

* 客戶端工具有很多選擇, 我找了一個 STOMP Over WebSocket 的專案,使用 browser 就可以用了。
http://jmesnil.net/stomp-websocket/doc/
這個有說明如何使用 websocket api 來操作


* 主要我想要做一個線上即時聊天的界面,從 github 上找到 jmesnil 的 source code
https://github.com/jmesnil/stomp-websocket/tree/master/example
然後,小小修改一下。

我的個人小小聊天室,就出現了。你只要開兩個 browser 就可以自己和自己聊天了。

http://jangmt.com/stompchat/chat/  (純接收訊息)
http://jangmt.com/stompchat/chat/send.php  (送出訊息測試)


// 發送訊息到指定的 STOMP broker
// ----
$user = "app1";
$password = "密碼";
$host = "主機.jangmt.com";
$port = 61613;
$destination  = '/topic/chat.general.demo';
$message_body1 = '5秒消失_'.date(DATE_RFC2822);
$message_body2 = 'sticky:黏住桌面'.date(DATE_RFC2822);
try {
  $url = 'tcp://'.$host.":".$port;
  $stomp = new Stomp($url, $user, $password);
  $stomp->send($destination, $message_body1);
  $stomp->send($destination, $message_body2);
  //$stomp->send($destination, "SHUTDOWN");
} catch(StompException $e) {
  echo $e->getMessage();
}
?>





這個中介軟體 Apache  Apollo 伺服器端的界面長成這樣,可以看到線上使用者的資源使用狀況。





// --------------------------------------------------
// 如果你的需求是在 php 上面,要撈一些 data 訊息,可以參考下面的資訊
// PHP 官方網站都有說明了
http://php.net/manual/en/book.stomp.php

// 在 PHP 上面執行,可以參考 wiki 上面的說明
http://nrodwiki.rockshore.net/index.php/PHP_Examples

// client 端 , 也可以用 php 記得裝 stomp 套件。
# yum install php71-php-pecl-stomp
// 驗證
# php71 -i | grep stomp
/etc/opt/remi/php71/php.d/40-stomp.ini,
stomp.default_broker => tcp://localhost:61613 => tcp://localhost:61613
stomp.default_connection_timeout_sec => 2 => 2
stomp.default_connection_timeout_usec => 0 => 0
stomp.default_password => no value => no value
stomp.default_read_timeout_sec => 2 => 2
stomp.default_read_timeout_usec => 0 => 0
stomp.default_username => no value => no value

以上經驗分享,打完收工。使用比較有經驗後再來分享使用心得。
該繼續寫程式了。....XDXD

2016/11/24

Enom DNS 服務的動態 dns 更新


Enom DNS 服務的動態 dns 更新

圖跟內文無關


最近因為工作關係,租了一台韓國的 aws 主機來當 vpn 服務,想說 ip 也不想固定,弄個動態 ip 更新好了。我的 dns 主機商是 enom 他在網路上有很多的自動更新的 script。

先提供一個有趣的網站,這網站可以用命令列反查所在的對外 public ip 很適合用來寫程式。
https://ifconfig.co/ 命令列及 API 版本的 myip address

另外有一個網站 https://www.ipip.net/ 可以查詢每個 ip 的所在地,是一個很好用的服務。
另外也提供 api 接入的功能,可以很方便的接程式。

官方網站提供的程式,右方有各種平台用的。
http://www.enom.com/help/faq_dynamicdns.asp 

下面是在 github 找到的,其實重點在 enom api server 提供的服務,每個程式只是包裝了一些個人化的需求。
Enom api server
ENOMURL="http://dynamic.name-services.com"

python version:
https://gist.github.com/stef-levesque/11229362

shell version:
https://gist.github.com/h0tw1r3/11405624

php version:
https://github.com/mrubinsk/phpEnomUpdate/blob/master/phpEnomUpdate.php

php 最簡單版本的 update.
https://gist.github.com/agarzon/2431219

// --------------------------------------------
# php 版本的更新程式
[root@ip-172-31-12-22 enom]# cat /root/enom/ip-update.php
#!/usr/bin/php

/* Run this script every 5 minutes (or 1 hour, is up to you) using a cron task */
// ref: https://gist.github.com/agarzon/2431219
/* Edit this data*/
$domain = "網域名稱 example.com ";  
$pass = "密碼";
$host = "A紀錄名稱"; // Optional, for additional hosts names like: ftp., mail. or any sub-domains.

// 底下三行僅供參考
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=@.$domain&DomainPassword=$pass");
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=www.$domain&DomainPassword=$pass");
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=*.$domain&DomainPassword=$pass");
// 寫入 api service ,執行完後去查查看是否有這個 A 紀錄,或是 ip 更新了
file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=$host.$domain&DomainPassword=$pass");
?>

寫入排程
[root@ip-172-31-12-22 enom]# crontab -l
*/30 * * * * /root/enom/ip-update.php


2016/09/19

CentOS7 Linux 安裝給 pokemon bot 使用的 proxy server

CentOS7 Linux 安裝給 pokemon 使用的 proxy server 

Porxy 服務早期是因為網路頻寬小,通常在區網內把重複的流量用 proxy 來取代。
現在則變成一種可以欺騙 web server 客戶端來源 IP 的一個小技巧,有人用於當 bot 爬網站,有人用於分散流量抓迷片。而今天,我把它用來服務 pokemon bot client ,因為一個 bot 抓太慢拉!!! XDXD

* 安裝及設定 Linux 的 Proxy 服務

# 安裝 squid
yum install squid -y

# 編輯設定檔 /etc/squid/squid.conf

nano /etc/squid/squid.conf
# 在這段之後
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# 放入下面三行規格, ip 請自行更動
acl mynet src 111.32.141.0/24
acl mynet src 111.32.141.0/24
http_access allow mynet

# 啟動
systemctl restart squid 

# 開機預設啟動
systemctl enable squid 

# 確定 port 3128 是否工作
netstat -antlp | grep squid
tcp6       0      0 :::3128        :::*         LISTEN      29062/(squid-1)  

* 設定 pokemon bot , 這裡是以 Ar1i 開發的 PokemonGo-Bot 來當範例。
https://github.com/Ar1i/PokemonGo-Bot/tree/master/Builds-Only 
Ar1i 幾乎每天都在發新的版本,也修正很多 bug ,目前用過感覺最好的 bot 。


Proxy 設定



可以單機開四個 BOT



作者不斷修改更新版本,目前可以線上直接做很多手機的工作了。





2016/08/26

Pokemon GO 有很完整的社群開發論壇及完整的 API code

pokemon go 有很完整的社群開發論壇及完整的 API code,真是令人驚豔..
https://www.reddit.com/r/pokemongodev/ 不論原生公司喜不喜歡,在 github 上面一堆延伸開發的專案,且目前更新都很頻繁,大概三天就出一個版本了...

一開始是想要參考別人 API 怎麼寫的!!!
沒想到先看到 pokemon api , 各種版本都有, 少說有 6 種以上語言支持。
PoMG API by python 2.7
https://github.com/PokeAPI/pokeapi
https://pokeapi.co/docsv2/

然後就研究了一些 bot 在作啥麼....XDXD


-------
pokemon go 預測雷達, 很準.
有神獸出現時只要看 Found By Trainer: (Poke Radar Prediction) 才抓,其餘都是玩家來亂的。
https://www.pokemonradargo.com/

上面這個可能樹大招風,所以有時後會關閉服務或不正常。可以使用。

https://pkget.com/  大家找寶貝

-------
PokeMon GO 進化計算機, 及 pokemon 介紹. 哪些是神獸也可以參考這裡。
https://pokemon.gameinfo.io/tools/evolution-calculator?hl=zh_TW

-------
pokemon go 官方的 PTC 帳號註冊(Pokemon Trainer Club)
https://club.pokemon.com/us/pokemon-trainer-club/sign-up/
可以註冊一個免洗帳號,避免 google account 外流的風險。
因為他的 google  登入需要填入你的 gmaill 帳密,這很有外流的風險。

-------
很紅的 bot NecroBot , C# console for win
-------
最初的的 NecroBot 版本, 被自殺了。 https://github.com/NecronomiconCoding

but 他有被 fork ..XDXD  --> NecroBot Forked v0.9.6
https://github.com/NoxxDev/NecroBot/releases XDXD it goodjob


關於 necrobot 的設定可以參考這一篇:
http://apk.tw/thread-799962-1-1.html

北投公園座標
"DefaultLatitude": 25.136524,
"DefaultLongitude": 121.506284,
"MaxTravelDistanceInMeters": 250

新竹南寮漁港座標
"DefaultLatitude": 24.849289,
"DefaultLongitude": 120.926836,
"MaxTravelDistanceInMeters": 800


-------
necrobotvisualizer 需要搭配 Necrobot 的 GUI  for win
-------
Necrobot / MobBot Visualizer  圖形界面, 吃 NecroBot 的 websocket, 需要搭配 necrobot 跑
https://github.com/nicoschmitt/necrobotvisualizer
圖形界面,用 openstreet 當圖資。可以讓使用者指定走的方向(但不太容易操控),路過 pokestop 及 pokemon 會自動抓

再 windows 下執行,一開始要設定,設定完後如果把 config.json 改一下
把 config.json 的 "UseWebsocket": 改為 true 就可以支援 necrobotvisualizer
  "WebsocketsConfig": {
    "UseWebsocket": true,
    "WebSocketPort": 14251
  },

------------------
基於 Necrobot 的 gui BOT  for win
------------------
necrobot GUI 界面 , 結合 GUI 及 Necrobot 在一起。很詳細的工具。
但是 config.json 及 auth.json  需要自己設定。這會有點難度。
https://github.com/vandernorth/NecroBot.GUI/releases
設定值預設會把你的重複神奇寶貝交換光光....

-------
優先推薦的 bot,這個比較簡單. 可以快速上手.
-------
https://github.com/Ar1i/PokemonGo-Bot/tree/master/Builds-Only
C# 寫的,需要安裝 .net 4.6 以上才可以跑
執行 PokemonGo.RocketAPI.Console.exe 就可以跑.
走路的方法為決定時速(建議4~6)及方圓幾公尺,的範圍為自動搜尋範圍。以地圖方式指定。
帳號建議到 PTC 申請,不要使用預設的 google account 避免被盜帳號。

如果有 google map API key ,可以走道路不會亂走,
裡面有很多細項的參數,例如隨機速度 max and min ,間隔休息,
還有很多 pokemon 的管理、升級、進化等功能都可以操作, IV 值也可以線上直接看。
google map key 可以到 https://console.developers.google.com 申請一個, server key 就可以用了, 如不申請也是可以用的。各位可以試試看巴。

Console 視窗為顯示 log , 圖形界面為 pokemon 管理
延伸:使用 Proxy Server 掛多個 bot 


--------
PokemonGo-DesktopMap for win
--------
PokemonGo-DesktopMap , 需要申請一個 browser map api 給它用
可以顯示 pokestop 及 道館 , 還有沒有撒花都看得出來。但就是只有看而已。
https://github.com/mchristopher/PokemonGo-DesktopMap/releases



--------
Catchem-PoGo for win
--------
這個大概是目前做的最好的 bot ,可以支援多組設定檔,及更多的設定細節。
可以自動走路的路徑,人性化的參數。且支援多個圖資  API ,還可以透過  Telegram bot 來控制 bot .....天呀!太強大了!!!!!
官方網站: https://github.com/Lunat1q/Catchem-PoGo/releases



TIP:
-------
1. 在高雄的話,美術館,是個很棒的起點。 GPS地標: 22.655, 120.284
2. 等級練到 20 後,觀看 IV 值再來決定升 powerup 及 進化 evolvable 的順序。
3. 使用 bot 很容易被鎖帳號,所以還是出去走走巴,鍵盤訓練師是無法道館對戰的。
4. 容易被 ban 的行為: 在同一個 IP 執行超過一個程序,會被 banned 。但是換個 IP 就可以,過段時間也就會放這個 ip 出來,可以透過 proxy 服務來避開。不要很快時間的切換帳號在同一個  IP 上面,否則也是被 banned 。
5. 飛人的行為,我感覺沒那麼好抓。我猜可以是資料量太大,官方對於太小移動,或是頻率不高的飛人不好判斷,所以不會那樣快抓到。
6. 不要連續使用 bot 超過 24HR 那一定會出問題,另外不要用 google account 掛 bot ,可能讓你的 google account 被盜帳號。然後不要長時間移動太快, 例如平均 50KM/HR 的行走不間斷。




Pokemon GO in Linux
---------------------------------
至於 Linux 勒,請自行參考....
https://github.com/mchristopher/PokemonGo-DesktopMap
http://blog.pokemongofun.com/resolved-encrypt-so-is-not-found-please-place-it-in-the-bots-root-directory/



2016.9.4  last update

2016/08/20

How disable the touchpad in Linux MINT (暫時關掉觸控板的功能)

用了 NB 最麻煩的就是手滑,不小心摸到觸控板。
找了一下,暫時關閉的方式。



使用 root 權限 , 執行 xinput lst 觀看目前系統上的輸入裝置 id 值

BarkleyMT ~ # xinput list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ PixArt USB Optical Mouse                 id=11 [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                 id=14 [slave  pointer  (2)]
⎣ Virtual core keyboard                   id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                               id=7 [slave  keyboard (3)]
    ↳ Video Bus                               id=8 [slave  keyboard (3)]
    ↳ Power Button                             id=9 [slave  keyboard (3)]
    ↳ Sleep Button                             id=10 [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD                     id=12 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=13 [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                         id=15 [slave  keyboard (3)]
    ↳ DELL Wireless hotkeys                   id=16 [slave  keyboard (3)]


# 關閉觸控版, ID=14
BarkleyMT ~ # xinput set-prop 14 "Device Enabled" 1

# 打開觸控版 ID=14
BarkleyMT ~ # xinput set-prop 14 "Device Enabled" 0

比 Windows 簡單多了!!!




REF:
https://ask.fedoraproject.org/en/question/7485/how-disable-the-touchpad/  Fedora 的關法
http://www.dell.com/support/article/us/en/19/SLN128938/en#Issue4 DELL上面的 Windows 版本關掉方式

2016/07/09

Linux command 測試網路速度

Linux command 測試網路速度

原始碼 in https://github.com/sivel/speedtest-cli

# 安裝及執行
wget -O speedtest-cli https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod +x speedtest-cli
./speedtest-cli

# 執行範例
[root@dev dl]# ./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from TANet (111.111.11.111)...
Selecting best server based on latency...
Hosted by Chief Telecom (Changhua) [67.67 km]: 19.85 ms
Testing download speed........................................
Download: 798.55 Mbit/s
Testing upload speed..................................................
Upload: 185.07 Mbit/s



2016/04/01

Postgresql 上面的「尿布、啤酒、星期五」,不用寫程式下行 SQL 就搞定


MADlib + postgresql 9.4 in Linux CentOS 7
MADlib®: Big Data Machine Learning in SQL for Data Scientists

啤酒、尿布、星期五


MADlib 在 postgresql 上面以是以 postgres 函式的型態來實現對於數據資料的操作,你可以透過這個以 plpython 語言寫的函式,直接操作原始數據轉存到新的資料庫當中,這個函式庫支援很多機器學習的演算法,可以很方便的分析數據. 目前提供的有底下這些,看起來應該有陸續發展的可能,因為已經被放到 Apache 基金會的子項目計畫內了...XDXD

功能:
Classification 分類
Regression 回歸
Clustering 集群
Topic Modeling 主題模型
Association Rule Mining 關聯性規則
Descriptive Statistics 描述性統計
Validation 驗證

more... http://madlib.net/product/


官方網站 http://madlib.net/

我使用來安裝的版本是 CentOS Linux 7 ,但是安裝這個 LIB 前請先選擇一套支援的資料庫系統,這裡我用的是 Postgresql 9.4 的版本,安裝請參考這一篇:
http://blog.jangmt.com/2016/03/postgresql-94-in-centos-linux-7.html

下載 http://madlib.net/download/

安裝
[root@c7 ~]#  yum install madlib-1.8-Linux.rpm  -y

檢查是否裝了,安裝好後他的路徑放在 /usr/local/madlib/
[root@c7 ~]# rpm -qa | grep madlib
madlib-1.8-1.x86_64


我使用 Single Node 的模式,系統需求:( HAWQ >= 1.2, Greenplum >= 4.2 or PostgreSQL >= 9.2 )

在安裝後,這特 MADlib 必須搭配資料庫才可以使用,所以必須做一個匯入函式到資料庫的動作。

madlib 是 PostgreSQL 的自訂函數  ,它會透過 plpython2 在 postgresql 內產生自訂的函式。

centos7 預設安裝沒裝 plpython2 ,補安裝
[root@c7 ~]# yum install postgresql94-plpython -y
# 安裝好後,透過 madpack 將建立好的個人資料庫,匯入成為 postgresql 的函式。
# 由於此 lib 支援兩種的資料庫(postgres or Pivotal Greenplum) ,但這裡以 postgres 為主
# 安裝語法: madpack install -s madlib -p 資料庫種類 -c 帳號@主機:5432/資料庫
# 建議使用者,一人一個帳號,一個資料庫彼此的獨立,這樣才不會相互干擾。底下這個範例,我已經建立了一個個人的帳號及資料庫了。
# 帳號:  mtchang
# 主機:  127.0.0.1
# 資料庫:  mtchang

[mtchang@c7 ~]$ /usr/local/madlib/bin/madpack install -s madlib -p postgres -c mtchang@127.0.0.1:5432/mtchang
Password for user mtchang:  ooxx
madpack.py : INFO : Detected PostgreSQL version 9.4.
madpack.py : INFO : *** Installing MADlib ***
madpack.py : INFO : MADlib tools version    = 1.8 (/usr/local/madlib/Versions/1.8/bin/../madpack/madpack.py)
madpack.py : INFO : MADlib database version = None (host=127.0.0.1:5432, db=mtchang, schema=madlib)
madpack.py : INFO : Testing PL/Python environment...
madpack.py : INFO : > Creating language PL/Python...
madpack.py : INFO : > PL/Python environment OK (version: 2.7.5)
madpack.py : INFO : Installing MADlib into MADLIB schema...
madpack.py : INFO : > Creating MADLIB schema
madpack.py : INFO : > Creating MADLIB.MigrationHistory table
madpack.py : INFO : > Writing version info in MigrationHistory table
madpack.py : INFO : > Creating objects for modules:
madpack.py : INFO : > - array_ops
madpack.py : INFO : > - bayes
madpack.py : INFO : > - crf
madpack.py : INFO : > - elastic_net
madpack.py : INFO : > - linalg
madpack.py : INFO : > - pmml
madpack.py : INFO : > - prob
madpack.py : INFO : > - quantile
madpack.py : INFO : > - sketch
madpack.py : INFO : > - svd_mf
madpack.py : INFO : > - svec
madpack.py : INFO : > - tsa
madpack.py : INFO : > - conjugate_gradient
madpack.py : INFO : > - data_profile
madpack.py : INFO : > - lda
madpack.py : INFO : > - stats
madpack.py : INFO : > - svec_util
madpack.py : INFO : > - utilities
madpack.py : INFO : > - assoc_rules
madpack.py : INFO : > - cart
madpack.py : INFO : > - convex
madpack.py : INFO : > - glm
madpack.py : INFO : > - kernel_machines
madpack.py : INFO : > - linear_systems
madpack.py : INFO : > - recursive_partitioning
madpack.py : INFO : > - regress
madpack.py : INFO : > - sample
madpack.py : INFO : > - summary
madpack.py : INFO : > - kmeans
madpack.py : INFO : > - pca
madpack.py : INFO : > - validation
madpack.py : INFO : MADlib 1.8 installed successfully in MADLIB schema.

# 這樣就完成了!!!!

# 來個範例試試看 ,我找了一下看到了 Association rules ,這個比較熟悉所以使用這個當練習。
參考:http://doc.madlib.net/latest/group__grp__assoc__rules.html#examples

(1) 先由 SQL 匯入一些資料看看

DROP TABLE IF EXISTS test_data;
CREATE TABLE test_data (
    trans_id INT,
    product TEXT
);
INSERT INTO test_data VALUES (1, 'beer');
INSERT INTO test_data VALUES (1, 'diapers');
INSERT INTO test_data VALUES (1, 'chips');
INSERT INTO test_data VALUES (2, 'beer');
INSERT INTO test_data VALUES (2, 'diapers');
INSERT INTO test_data VALUES (3, 'beer');
INSERT INTO test_data VALUES (3, 'diapers');
INSERT INTO test_data VALUES (4, 'beer');
INSERT INTO test_data VALUES (4, 'chips');
INSERT INTO test_data VALUES (5, 'beer');
INSERT INTO test_data VALUES (6, 'beer');
INSERT INTO test_data VALUES (6, 'diapers');
INSERT INTO test_data VALUES (6, 'chips');
INSERT INTO test_data VALUES (7, 'beer');
INSERT INTO test_data VALUES (7, 'diapers');


(2) 先建立一個 myschema 的 schemas(模式),再來執行下面的指令。



(3) 使用 Association rules 函式庫
# 關聯性規格則請參考這一篇: http://blog.jangmt.com/2015/10/fpgrowth-algorithm.html
# 函式用法:
assoc_rules_results assoc_rules (
float8 support, (支持度)
float8 confidence, (信心)
text tid_col, 欄位 tid
text item_col, 欄位 item
text input_table, (來源資料表格)
text output_schema, (運算後輸出的 schema)
boolean verbose 有沒有 comments
)
# 範例:
SELECT * FROM madlib.assoc_rules( .25,.5,'trans_id','product','test_data','myschema',TRUE);



(4) Association rules 針對 test_data 產生的結果
# 產生的結果,會放在 myschema 內,也可以用這個 sql 來觀看
# sql 觀看結果
SELECT * FROM myschema.assoc_rules ORDER BY support DESC;



更多閱讀:
官方的安裝手冊 https://github.com/madlib/madlib/wiki/Installation-Guide
Association rules 函式庫 http://doc.madlib.net/latest/assoc__rules_8sql__in.html

2016/03/29

將 CSV 檔案加上 UTF BOM 讓它可以在 Windows 被 EXCEL 正確的開啟沒有亂碼的問題


將 CSV 檔案加上 UTF BOM 讓它可以在 Windows 被 EXCEL 正確的開啟沒有亂碼的問題

在 UTF-8 文件中放置 BOM 主要是微軟系統的習慣。但是真的沒有必要帶拉!!!!

http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom
According to the Unicode standard, the BOM for UTF-8 files is not recommended:

圖片和內文不太相關



下面提供一種在 windows 上面,政治正確的解法。 XDXD

// ========================================================
// 產生現在的秒數
$time_string = date("YmdHis");

// 寫入 utf8 with BOM
function writeUTF8File($filename,$content)
{
    $f = fopen($filename, 'w');
    fwrite($f, pack("CCC", 0xef,0xbb,0xbf));
    fwrite($f,$content);
    fclose($f);
}

$f = 'uploads/private/'.$time_string.'.csv';
$fdir = 'uploads/private/';

// 檔案不存在就先建立檔案
if (!file_exists($fdir)) {
    mkdir($fdir);
}

writeUTF8File($f,$csv);

echo 'CSV 輸出完成,請點選連結下載。
';
// ========================================================

2016/03/27

mysql 中文亂碼的避免及 php mysql pdo 宣告取用方式

Mariadb 和 Mysql 都會有亂碼, 只要它預設編碼還是在 latin 的時還是一直會發生.

所以改成 utf8 編碼是一個對於東亞語系的文字,會比較方便。
UTF8 的介紹請看 wiki https://zh.wikipedia.org/wiki/UTF-8

xxx_bin (區分大小寫)
xxx_general_ci (不區分大小寫)

Collation 每個字符集的排序規則

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
在 mysql 資料庫中有兩個編碼系統 UCS2 及 UTF8
utf8 使用 1~3 bytes ,帶有 65536 個組合的編碼
utf32 與 utf8mb4 是完整的的 unicode ,差異在 utf32 固定 4 bytes ,而 utf8mb4 則是彈性使用 1~4 bytes 。
utf8mb4 從 MySQL 5.5.3 (released March 2010). 開始提供

目前預設的編碼系統為
xxx_general_ci (default)

為了中文語系使用不要出問題,建議修正如下:
-----------------------------------------------------
# 修正 mysql 的設定檔
[root@c7 my.cnf.d]# more /etc/my.cnf.d/my-huge.cnf 
[client]
default-character-set=utf8mb4

[code]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# restart mysql service


# 檢查系統的編碼變數
----------------------------
[root@c7 my.cnf.d]# mysql -u root -p
Enter password:
MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

character_set_filesystem 要維持 binary
character_set_system 是唯讀變數




# 配合 PHP 程式上我會宣告如下,寫用一個 function 來取用 mysql 。

// -----------------------------------------------------------------------------------------
// 請在根目錄下建立一個檔案 VERSION.txt 檔案內容放置 release or developer , 依據此變數自動判斷目前所在開發環境
$system_mode = file_get_contents("VERSION.txt");
//$system_mode = 'release';
//$system_mode = 'developer';
if($system_mode == 'developer') {
// sql DB infomation -- for developer
$dbhost ='localhost';
$dbname ='exampleDB';
$dbuser ='exampleUSER';
$dbpassword ='example';
}elseif($system_mode == 'release') {
// sql DB infomation -- for release
$dbhost ='localhost';
$dbname ='exampleDB';
$dbuser ='exampleUSER';
$dbpassword ='example';
}else{
// 沒有設定 STOP
die('System mode set error !!!');
}
// ----------------------------------------------------------------------
//
// 連接資料庫的的設定,預設將 set name utf8 開啟
//
try {
// 在 PDO 宣告的時候就要將編碼一併宣告。 ref.pdo-mysql.connection
global $dbh;
$dsn = "mysql:host=$dbhost;dbname=$dbname";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'); 
$dbh = new PDO($dsn, $dbuser, $dbpassword, $options);
} catch (PDOException $e) {
    print "DB connect Error!: " . $e->getMessage() . "
";

    die();
}

// ---------------------------------------------------------------------
// run SQL command then return $result
// $result[0] --> 資料數量, 如果為 0 表示沒有變動的列
// $result[1] ~ $result[n] --> 資料內容,從第一筆開始
// 使用方式 example:
// $result = runSQL($sql);
// var_dump($result);
// ---------------------------------------------------------------------
function runSQL($query)
{
global $dbh;
try {
$stmt = $dbh->prepare("$query");
$stmt->execute();
// 查詢到的數量, 放到此變數的 [0] 索引位置
$db_dump_result_all[0] = $stmt->rowCount();
$i=1;
// 以物件方式存變數物件取用以 $result->var 方式取用
while ($db_dump_result = $stmt->fetch(PDO::FETCH_OBJ))  {
$db_dump_result_all[$i] = $db_dump_result;
$i++;
}
} catch (PDOException $e) {
        return("DB connect Error!: $e->getMessage() , SQL: $query ");
        die();
}
return($db_dump_result_all);
}
// --------------------------------------------------------------------

以上放在 github 上https://github.com/mtchang/ITCNotes/blob/master/mysql_utf8mb4_pdo.txt


更多閱讀:
How to support full Unicode in MySQL databases https://mathiasbynens.be/notes/mysql-utf8mb4
utf8mb4 編碼使用的一些紀錄 https://twpug.net/discussion/8646/utf8mb4-%E7%B7%A8%E7%A2%BC%E4%BD%BF%E7%94%A8%E7%9A%84%E4%B8%80%E4%BA%9B%E7%B4%80%E9%8C%84
stackoverflow about utf8mb4  http://stackoverflow.com/tags/utf8mb4/info
維基百科 utf8 http://zh.wikipedia.org/wiki/UTF-8
解釋 mysql 的 Unicode Character Sets http://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html




2016/03/23

PostgreSQL 9.4 in CentOS Linux 7 簡易安裝教學

PostgreSQL 9.4 in CentOS Linux 7

# 安裝下載
http://www.postgresql.org/download/linux/redhat/

# 安裝 REPO 來源檔
yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1.noarch.rpm -y

# 安裝主要資料庫程式
yum install postgresql94-server postgresql94-contrib -y
/usr/pgsql-9.4/bin/postgresql94-setup initdb
systemctl enable postgresql-9.4.service
systemctl start postgresql-9.4.service

# 裝好後所有的設定檔及紀錄檔都在 /var/lib/pgsql 這個目錄內
[root@c7 ~]# ls /var/lib/pgsql -la
total 8
drwx------.  3 postgres postgres   36 Mar 23 09:27 .
drwxr-xr-x. 70 root     root     4096 Mar 23 09:27 ..
drwx------.  4 postgres postgres   48 Mar 23 09:27 9.4
-rwx------.  1 postgres postgres  267 Mar 23 09:27 .bash_profile

# 確認帳號
[root@c7 ~]# id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres)

# 切換使用者,並且登入系統設定
[root@c7 ~]# su - postgres
-bash-4.2$ psql template1
psql (9.4.6)
Type "help" for help.

# 建立一個使用者為 mtchang 且將密碼修改為 1234 並且賦予 superuser 的權限。
template1=# CREATE USER mtchang WITH PASSWORD '1234';
CREATE ROLE
template1=# CREATE DATABASE mtchang OWNER mtchang ENCODING 'UTF8';
CREATE DATABASE
template1=# ALTER ROLE mtchang WITH superuser;
ALTER ROLE
template1=# \q
-bash-4.2$ exit
logout

# 登入測試
[root@c7 ~]# psql -h 127.0.0.1 -W -U mtchang
Password for user mtchang:
psql: FATAL:  Ident authentication failed for user "mtchang"

# 修正允許登入, 加入底下兩行
[root@c7 ~]# tail /var/lib/pgsql/9.4/data/pg_hba.conf  -n 15
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all         all         127.0.0.1/32          md5
host    all         all         192.168.1.0/24       md5

# 原來 Postgresql 的連線只開放本機 IP 可以存取,如果需要讓外面 IP 可以存取,需要打開預設的連線設定檔案
# data/postgresql.conf 將 listen_addresses = ‘localhost’ 修改為 listen_addresses = ‘*’ 結果如下:
[root@c7 ~]# cat /var/lib/pgsql/9.4/data/postgresql.conf | grep listen_address
listen_addresses = '*'

# 重新啟動 postgresql 服務
[root@c7 ~]# systemctl restart postgresql-9.4.service 

# 登入測試
[mtchang@c7 conf]$ psql -U mtchang -h 127.0.0.1 -W
Password for user mtchang:
psql (9.4.6)
Type "help" for help.

mtchang=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges  
-----------+----------+----------+-------------+-------------+-----------------------
 mtchang   | mtchang  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

mtchang=# \q

# postgresql 有很多管理工具,phppgadmin OR pgadmin3 都是很好的管理工具
#簡單介紹 pgadmin3 這個工具的使用

# postgresql 管理工具 pgadmin3 install
yum install pgadmin3


# pgadmin3設定畫面





# 連接後的畫面



# 更多資訊
psql 指令
-c 參數可以直接在命令列下 SQL 敘述句
-e 參數是將 SQL 的執行指令過程全部列出來

# postgresql 建立使用者的 SQL example
psql -h localhost -U postgres -W -e -c "CREATE USER jangmt WITH PASSWORD '密碼' ;"

# postgresql 建立資料庫的 SQL example
psql -h localhost -U postgres -W -e -c "CREATE DATABASE jangmtDB OWNER jangmt ENCODING 'UTF8';"

# postgresql 建立匯入資料庫的 SQL example
psql -h localhost -U jangmt -d jangmtdb -W -e -f sql.txt 

# postgresql pg_dump 可以將資料庫依需求匯出,以供備份或轉移系統使用。
pg_dump -f sql_dump.txt -h localhost -U jangmt -W jangmtdb

之前寫的舊版8.1安裝howto http://blog.jangmt.com/2011/04/rhelcentos-postgresql.html

PhpPgAdmin透過 web 介面來管理 postgresql 資料庫 http://phppgadmin.sourceforge.net/doku.php?id=faq_docs

2016/03/17

使用 SNMPD 的 TRAP(異常情況) 功能來觸發管理機制,以 UPS 不斷電系統的自動關機為範例


使用 SNMPD 的 TRAP(異常情況) 功能來觸發管理機制,以 UPS 不斷電系統的自動關機為範例

這篇文章主要說明,當你的 UPS 如果發現 AC(市電)斷電了,我該如何呼叫機器關機勒?
在各 UPS 的管理工具理,都有提供管理工具讓你設定在斷電後快快關閉電腦,但是如果一次要對大量的機器可能就需要付點費用,或是使用其他的方式達成。此文提供透過 UPS 的 SNMPTRAPD 在符合條件的 MIB 資訊被觸發時,就透過接收到的資訊傳遞給負責處理的程序。


介紹 SNMP 
------------
首先我們需要先了解何謂 SNMP 通訊協定,可以參考底下這篇文章
http://www.netadmin.com.tw/article_content.aspx?sn=1209100018


安裝軟體
------------
# Linux mint or ubuntu 的安裝
apt-get install snmp snmpd libsnmp-base libsnmp-dev snmp-mibs-downloader -y

# Linux CentOS 的安裝
yum install net-snmp net-snmp-agent-libs net-snmp-utils -y
systemctl enable snmptrapd.service 

在 /etc/snmp/snmptrapd.conf  可以看到預設的設定檔
這個設定可以在 'snmptrapd.conf(5)' 有詳細的說明如何設定 snmptrapd


設定 SNMPTRAPD 可以接收觸發的封包
------------------------------------
可以參考官方網站的說明
http://www.net-snmp.org/wiki/index.php/TUT:Configuring_snmptrapd

# -----------------
# 修改設定檔 /etc/snmp/snmptrapd.conf
# -----------------
# 這個是我參考官方網站後改寫的 /etc/snmp/snmptrapd.conf 範例
mint snmp # cat /etc/snmp/snmptrapd.conf
# 以 SNMP v2c 版本 , 通訊接收寫入的密碼是 public (很危險記得要改)
# SNMP v2c with community as public
authCommunity   log,execute,net public

# 底下這兩個 traphandle 是很常見的範例, 以 SNMPv2-MIB::coldStart 這個 MIB
# 來觸發後面的 command 動作 /etc/snmp/traps.sh cold
#traphandle SNMPv2-MIB::coldStart    /etc/snmp/traps.sh cold
#traphandle SNMPv2-MIB::warmStart    /etc/snmp/traps.sh warmStart

# 預設的觸發,可以在 traps.sh 產生的 traps.txt 看到紀錄
# 也可以從 /var/log/syslog(ubunut) or /var/log/message(centos) 看到紀錄
# traphandle default  /etc/snmp/traps.sh default

# 這個是 MEGATEC 測試後的 AC 斷電、復電的 MIB 值
# for UPSagent HDP801 (MEGATEC)
traphandle SNMPv2-SMI::mib-2.33.1.6.3.6     /etc/snmp/traps.sh HDP_AC_lost
traphandle SNMPv2-SMI::mib-2.33.1.6.3.2     /etc/snmp/traps.sh HDP_AC_restore
# 關於 MIB 會因為不同的 UPS 裝置送出的 MIB 值都不一樣,
# 實際請參考你的 UPS MIB 相對應的值
# 底下備註是不同 UPS 在實際斷電時, snmptrapd 接收到的 MIB LOG

# 寫一個 traps.sh 程式, 用來處理 snmptrapd 產生的 log 並且依據 log 產生對應的動作
mint snmp # cat /etc/snmp/traps.sh 
#!/bin/bash
# --------------------------------------------
# ref:http://www.net-snmp.org/wiki/index.php/TUT:Configuring_snmptrapd
# --------------------------------------------
logfile='/etc/snmp/traps.txt'

read host
read ip
vars=

while read oid val
do
  if [ "$vars" = "" ]
  then
    vars="$oid = $val"
  else
    vars="$vars, $oid = $val"
  fi
done

echo "trap: $1 $host $ip $vars" > $logfile

# ---------------------------------------------
# by mtchang 2016.3.17
# ---------------------------------------------
actionfile='/etc/snmp/action.txt'
ACstat=$(tail -n1 $logfile | cut -d: -f2 | cut -d" " -f2)

# log to debug 
echo "$ACstat $(whoami) $(date)"
echo "$ACstat $(whoami) $(date)" > $actionfile

if [[ "${ACstat}" == "HDP_AC_restore" ]]; then
    echo "shutdown -c 'Utility power has been restore'" >> $actionfile
    #echo "shutdown -c 'Utility power has been restore'" | bash
    #echo "ssh mtchang@192.168.1.181 'sudo /home/mtchang/cmd/snmptrapd_cancel_poweroff.sh'" | bash
    exit 0
elif [[ "${ACstat}" == "HDP_AC_lost" ]]; then
    echo "shutdown -h -P 3 'After 3 minutes will be Poweroff. The UPS is not on battery power'" >> $actionfile
    #echo "shutdown -h -P 3 'After 3 minutes will be Poweroff. The UPS is not on battery power'" | bash
    #echo "ssh mtchang@192.168.1.181 'sudo /home/mtchang/cmd/snmptrapd_poweroff.sh' &" | bash
    exit 0
else
    echo "ACstat=${ACstat},Nothing to do." >> $actionfile
    exit 1
fi

# 在 Linux ubuntu 上面的重新啟動
# 刪除 snmptrapd 及重新啟動, 因為沒有 script 所以連下三個指令,並看它是否工作
killall -e snmptrapd
snmptrapd 
netstat -antulp | grep snmp

# 在 Linux CentOS 上面的重新啟動
systemctl restart snmptrapd.service 
netstat -antulp | grep snmp


# 本機測試, 使用 snmptrap 產生模擬 snmptrap 封包, 測試觸發條件是否工作
mint snmp # pwd
/etc/snmp
mint snmp # snmptrap -d -v 2c -c public 127.0.0.1 "" SNMPv2-MIB::coldStart SNMPv2-MIB::coldStart s "test coldStart"

Sending 100 bytes to UDP: [127.0.0.1]:162->[0.0.0.0]:0
0000: 30 62 02 01  01 04 06 70  75 62 6C 69  63 A7 55 02    0b.....public.U.
0016: 04 62 25 BD  9A 02 01 00  02 01 00 30  47 30 0F 06    .b%........0G0..
0032: 08 2B 06 01  02 01 01 03  00 43 03 74  0B 62 30 17    .+.......C.t.b0.
0048: 06 0A 2B 06  01 06 03 01  01 04 01 00  06 09 2B 06    ..+...........+.
0064: 01 06 03 01  01 05 01 30  1B 06 09 2B  06 01 06 03    .......0...+....
0080: 01 01 05 01  04 0E 74 65  73 74 20 63  6F 6C 64 53    ......test coldS
0096: 74 61 72 74                                           tart

# 觸發的 log 檔紀錄
mint snmp # cat traps.txt 
trap: default localhost UDP: [127.0.0.1]:35655->[127.0.0.1]:162 SNMPv2-SMI::mib-2.1.3.0 = 0:21:07:30.90, SNMPv2-SMI::snmpModules.1.1.4.1.0 = SNMPv2-SMI::snmpModules.1.1.5.1, SNMPv2-SMI::snmpModules.1.1.5.1 = "test coldStart"

# 判斷後的 action 動作
mint snmp # cat action.txt
Thu Mar 17 10:48:00 CST 2016
Nothing to do.


# 上面的 log 也可以在系統的 /varlog/syslog (ubuntu) 看到, 在 centos 是 /var/log/message
mint snmp # tail /var/log/syslog -n 1
Mar 17 10:48:00 mint snmptrapd[14654]: localhost [UDP: [127.0.0.1]:35655->[127.0.0.1]:162]: Trap , SNMPv2-SMI::mib-2.1.3.0 = Timeticks: (7605090) 21:07:30.90, SNMPv2-SMI::snmpModules.1.1.4.1.0 = OID: SNMPv2-SMI::snmpModules.1.1.5.1, SNMPv2-SMI::snmpModules.1.1.5.1 = STRING: "test coldStart"


# 接下來從遠端機器送個封包,到這台機器. 測試看看遠端是否可以工作
[root@c7 ~]# snmptrap -v 2c -c public 192.168.1.181 "" SNMPv2-MIB::coldStart SNMPv2-MIB::coldStart s "test coldStart"

# 確認有收到, 但這太危險了. 所以要加強一下安全性
mint snmp # tail /var/log/syslog -n 1
Mar 17 10:51:20 mint snmptrapd[14654]: ip69168.cm.nsysu.edu.tw [UDP: [192.168.1.168]:36762->[192.168.1.181]:162]: Trap , SNMPv2-SMI::mib-2.1.3.0 = Timeticks: (607117) 1:41:11.17, SNMPv2-SMI::snmpModules.1.1.4.1.0 = OID: SNMPv2-SMI::snmpModules.1.1.5.1, SNMPv2-SMI::snmpModules.1.1.5.1 = STRING: "test coldStart"

# 還好他有支援 tcpwrapper 所以從 hosts.allow 設定一下限制可以收到封包的範圍
mint snmp # whereis snmptrapd
snmptrapd: /usr/sbin/snmptrapd /usr/share/man/man8/snmptrapd.8.gz
mint snmp # ldd /usr/sbin/snmptrapd  | grep libwrap
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f14e6eca000)
mint snmp # tail -n 2 /etc/hosts.allow 
snmptrapd:192.168.1.181,192.168.1.168:allow
snmptrapd:ALL:deny


# 測試模擬 UPS agent HDP801 動作
# AC 斷電
snmptrap -v 2c -c public 192.168.1.181 "" SNMPv2-SMI::mib-2.33.1.6.3.6 SNMPv2-SMI::mib-2.33.1.6.3.6 s "The UPS is not on battery power"

# AC 復電
snmptrap -v 2c -c public 192.168.1.181 "" SNMPv2-SMI::mib-2.33.1.6.3.2 SNMPv2-SMI::mib-2.33.1.6.3.2 s "Utility power has been restore"

# 測試 MIB coldStart
snmptrap -d -v 2c -c public 192.168.1.181 "" SNMPv2-MIB::coldStart SNMPv2-MIB::coldStart s "test coldStart"

測試完成後就可以去 UPS 上面設定 snmptrap了



關於 Linux system 關機這件事
------------------
# 在 AC 斷電時,立即啟動關機程序。但是如果電又馬上來了,就會覺得 ooxx 。所以預設關機指令執行後三分鐘後才關電,但這時候如果電來了,就可以執行取消關機的工作。

# 本機三分鐘後關機
shutdown -h -P 3 'After 3 minutes will be Poweroff. The UPS is not on battery power'

# 本機取消關機
shutdown -c 'Utility power has been restore'

# 以上只是把本地端的電源關閉,無法關閉其他遠端的機器
# -----------------------------------------------------------------------------------------
# 如果要控制遠端的電腦來關機,你必須要有遠端的 root 權限。
# 並且透過 ssh key 認證來執行遠端的 script 來關機。
# 所以我把它寫成了關機的批次檔案,放在遠端的機器

# 本機取消關機
mint cmd # cat snmptrapd_cancel_poweroff.sh 
#!/bin/bash
shutdown -c 'Utility power has been restore'

# 本機三分鐘後關機
mint cmd # cat snmptrapd_poweroff.sh 
#!/bin/bash
shutdown -h -P 3 'After 3 minutes will be Poweroff. The UPS is not on battery power'

# 這裡的 test 帳號使一般使用者帳號,已經設定具有 sudo 權限,且不用密碼的 sudo 。
# 並且主機已經設定 ssh key 認證,可以遠端被登入。
# 測試遠端關機的動作
ssh mtchang@192.168.1.181 'sudo /home/mtchang/cmd/snmptrapd_poweroff.sh' &
# 測試遠端取消關機的動作
ssh mtchang@192.168.1.181 'sudo /home/mtchang/cmd/snmptrapd_cancel_poweroff.sh'


#=========================================
# 主文結束
#=========================================

MIB LOG 備註
--------------
# 型號: Phoenixtec USHA Smart II Card 在線式UPS 的 snmptrapd 觸發 LOG 紀錄
# ------------------------------------------------------------------------------------
# 使用該系統自訂的 MIB
# 行為:電源好像有問題
Mar 18 16:32:13 power snmptrapd[21992]: 2016-03-18 16:32:13 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.4]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (61738343) 7 days, 3:29:43.43#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "Utility power not available"

# 行為:沒電,切換到電池供電模式
Mar 18 16:32:35 power snmptrapd[21992]: 2016-03-18 16:32:35 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.4]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (61744393) 7 days, 3:30:43.93#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.1.2.4.0 = INTEGER: 80#011SNMPv2-SMI::enterprises.2468.1.2.1.1.2.5.0 = INTEGER: 121#011SNMPv2-SMI::enterprises.2468.1.2.1.1.2.2.0 = INTEGER: 61#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "The UPS has switched to battery backup power"

# 行為:UPS 沒有在電池供電模式了
Mar 18 16:32:55 power snmptrapd[21992]: 2016-03-18 16:32:55 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.4]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (61744694) 7 days, 3:30:46.94#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "The UPS is not on battery power"

# 行為:原來是電來了
Mar 18 16:33:03 power snmptrapd[21992]: 2016-03-18 16:33:03 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.4]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (61744748) 7 days, 3:30:47.48#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "Utility power has been restore"



# 型號:鼎堅 MegaTec Model: CX504 在線式
# ------------------------------------------------------------------------------------
# 使用該系統自訂的 MIB
# UPS 電池測試
Mar 11 15:46:22 c7 snmptrapd[6889]: 2016-03-11 15:46:22 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.168]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (991179) 2:45:11.79#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "The testing is going on UPS"
# UPS 電池測試測試結束
Mar 11 15:46:32 c7 snmptrapd[6889]: 2016-03-11 15:46:32 192.168.1.132 [UDP: [192.168.1.132]:161->[192.168.1.168]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (992101) 2:45:21.01#011SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.2468.1.2.1.2#011SNMPv2-SMI::enterprises.2468.1.2.1.1.6.2.0 = INTEGER: 1#011SNMPv2-SMI::enterprises.2468.1.2.1.1.6.1.0 = INTEGER: 1#011SNMPv2-SMI::enterprises.2468.1.2.1.1.6.3.0 = INTEGER: 1#011SNMPv2-SMI::enterprises.2468.1.2.1.1.6.4.0 = INTEGER: 1457710859#011SNMPv2-SMI::enterprises.2468.1.2.1.1.6.5.0 = INTEGER: 1500#011SNMPv2-SMI::enterprises.2468.1.2.1.2 = STRING: "The testing of UPS is completed"

# AC 停電
#[root@c7 snmp]# cat traps.txt
#trap: HDP_AC_lost 192.168.1.132 UDP: [192.168.1.132]:162->[192.168.1.168]:162 DISMAN-EVENT-MIB::sysUpTimeInstance = 148:3:54:42.20, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::enterprises.935.0.5, SNMPv2-SMI::enterprises.935.0.5 = "UPS has switched to battery power."
# 顯示依據 shell script 的 action.txt 動作內容
#[root@c7 snmp]# cat action.txt
#HDP_AC_lost root Fri Mar 18 16:14:11 CST 2016
#shutdown -h -P 3 'After 3 minutes will be Poweroff. The UPS is not on battery power'


# AC 電來了
#[root@c7 snmp]# cat traps.txt
#trap: HDP_AC_restore 192.168.1.132 UDP: [192.168.1.132]:162->[192.168.1.168]:162 DISMAN-EVENT-MIB::sysUpTimeInstance = 148:3:55:28.20, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::enterprises.935.0.9, SNMPv2-SMI::enterprises.935.0.9 = "Utility power has been restored."
# 顯示依據 shell script 的 action.txt 動作內容
#[root@c7 snmp]# cat action.txt
#HDP_AC_restore root Fri Mar 18 16:14:58 CST 2016
#shutdown -c 'Utility power has been restore'


延伸閱讀
----------
UPS-MIB http://www.oidview.com/mibs/0/UPS-MIB.html
snmptrap 使用 http://www.net-snmp.org/wiki/index.php/TUT:snmptrap
snmptrapd 設定 http://www.net-snmp.org/wiki/index.php/TUT:Configuring_snmptrapd
man SNMPTRAP(1)
man snmptrapd.conf(5)