星期二, 4月 13, 2021

ubuntu 20.04 + Python3.9.4

sudo apt vim
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
#ubuntu 21.04預設為python 3.9.5,直接apt安裝即可
sudo apt install python3 python3-pip python3.9-venv

sudo su
export mypyenv=3.9.5;
wget https://www.python.org/ftp/python/"$mypyenv"/Python-"$mypyenv".tgz
tar zxvf Python-"$mypyenv".tgz
cd Python-"$mypyenv"/
export LDFLAGS=-L/usr/lib64;./configure --prefix=/opt/python"$mypyenv"  --enable-shared --enable-optimizations
make -j 8
make test
make install

# 如果要用vpython, 因為還沒設定路徑,所以要用完整路徑執行剛安裝的python, 且會遇到shared library的問題,
# 因此要記得export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/$mypyenv/lib
# vpython 指令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/$mypyenv/lib
cd $HOME
/opt/$mypyenv/bin/python3 -m venv v$mypyenv
vi $HOME/.bashrc
#加上 source $HOME/$mypyenv/bin/activate # $HOME基本上是你執行python3 -m venv的地方…
然後link 相關lib到$HOME/$mypyenv/lib裏
cd $HOME/$mypyenv/lib/
ln -s /opt/$mypyenv/lib/*.so ./
ln -s /opt/$mypyenv/lib/*.so.1.0 ./
vi $HOME/$mypyenv/bin/activate
#最後面加上
PYTHON3=/opt/python3.10.1
if [ -z "${LD_LIBRARY_PATH}" ]
then
    LD_LIBRARY_PATH="$PYTHON3/lib"; export LD_LIBRARY_PATH
else
    LD_LIBRARY_PATH="$PYTHON3/lib:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH
fi

gdal

#直接裝套件
sudo apt install gdal-bin libgdal-dev
#或是自行編譯
apt install proj-bin libproj-dev netcdf-bin 
apt install libhdf5-dev libhdf4-dev libcurl4-openssl-dev libdap-dev libopenjp2-7-dev libkml-dev libgeos-dev
export GDALVER="3.2.3"
wget http://download.osgeo.org/gdal/$GDALVER/gdal-$GDALVER.tar.gz
tar zxvf gdal-$GDALVER.tar.gz
cd gdal-$GDALVER
./configure --prefix=/usr/local/gdal-$GDALVER
make -j 2 # 看你有幾個core,數字就多少,可以用到多核,
make install

postgresql

#ubuntu 21.04 預設為13版,改用如下指令
sudo apt install postgresql-server-dev-13 postgresql-client-13 postgis
#ubuntu 20.04 預設為12版
sudo apt install postgresql-server-dev-12 postgresql-client-12 postgis # 全都需要,不然pip3 install psycopg2會失敗
sudo su
su postgres
psql
CREATE DATABASE djangodb;
CREATE USER djdbuser WITH ENCRYPTED PASSWORD 'xxxxxx' ; <--新增使用者且對密碼加密(這個不需本機使用者,且可以用MD5由別台機登入)
GRANT ALL PRIVILEGES ON DATABASE djangodb to djdbuser ;
\q
psql djangodb
create extension postgis;

#修改
vi /etc/postgresql/12/main/pg_hba.conf
#加上
local   djangodb        all                                     md5
#重啟服務
systemctl restart postgresql
#
pip3 install GDAL==$(gdal-config --version | awk -F'[.]' '{print $1"."$2}')

django + uwsgi + nginx

sudo apt install nginx npm
sudo npm install -g parcel-bundler
pip3 install django
pip3 install uwsgi
pip3 install pyproj
pip3 install scipy
pip3 install netcdf4
pip3 install matplotlib
pip3 install pandas
pip3 install --global-option=build_ext --global-option=`gdal-config --cflags`  GDAL==`gdal-config --version`
#pip3 install psycopg2-binary #2.8版後改安裝psycopg2-binary,不然系統會說沒有psycopg2 模組
pip3 install psycopg # ubuntu 22.04
# 建立django專案(名稱為,remotesensing,路徑為/var/www/cgi-bin)
cd /var/www/cgi-bin
django-admin startproject remotesensing
cd remotesensing
python3 manage.py startapp xbradar


假設我們有一個remotesensing的django project,在PROJHOME=/var/www/cgi-bin/remotesensing 下
設定nginx
#在$PROJHOME/remotesensing/ 下新增 uwsgi_params 檔案
vi $PROJHOME/remotesensing/uwsgi_params
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS            $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;


#在$PROJHOME/remotesensing/ 下新增 remotesensing_nginx.conf 檔案
vi $PROJHOME/remotesensing/remotesensing_nginx.conf
# the upstream component nginx needs to connect to
upstream django_remotesensing {
     server unix:///var/www/cgi-bin/remotesensing/remotesensing/remotesensing.sock; # 這裏我們預計使用sock檔案,這個路徑必需是uwsgi所指定的路徑(設定檔如下),另外需注意路徑權限的問題
    #server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name 192.168.10.91; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /remotesensing/media  {
        alias /var/www/cgi-bin/remotesensing/media;  # your Django project's media files - amend as required
    }

    location /remotesensing/static {
        alias /var/www/cgi-bin/remotesensing/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location /remotesensing {
        uwsgi_pass django_remotesensing;
        include     /var/www/cgi-bin/remotesensing/remotesensing/uwsgi_params; # the uwsgi_params 我們上面新增的uwsgi_params檔案
    }
}

#存檔後將這個檔案製作soft link到 /etc/nginx/sites-enabled 裹
cd /etc/nginx/sites-enabled
sudo ln -s /var/www/cgi-bin/remotesensing/remotesensing/remotesensing_nginx.conf
sudo systemctl restart nginx # 重啟 nginx 服務


設定uwsgi
新增PROJHOME/remotesensing/uwsgi.ini檔
vi /var/www/cgi-bin/remotesensing/remotesensing/uwsgi.ini
[uwsgi]
# 注意,註解要是全新的一行,不要接在設定面,會被當成設定內容,導致錯誤。
chdir        = /var/www/cgi-bin/remotesensing
# Django's wsgi file
#module       = remotesensing.wsgi:application
mount        = /remotesensing=remotesensing.wsgi:application
#按個人習慣,我喜歡把一個PROJ加到URL裏,例如http://my.domain/remotesensing 如果要拿掉,記得上面設定也要改。
manage-script-name = true
#env          = DJANGO_SETTINGS_MODULE=remotesensing.settings.production
env          = DJANGO_SETTINGS_MODULE=remotesensing.settings
# the virtualenv (full path)
home         = /opt/vPy-3.9.5

# process-related settings
# master
master       = true
# maximum number of worker processes
processes    = 2
# the socket (use the full path to be safe
socket       = /var/www/cgi-bin/remotesensing/remotesensing/remotesensing.sock
# 這個是指透過socket連接,不用另外指tcp port,較省資源
#當系統運作時,會在上面的路行建立remotesensing.sock檔,這個路徑必需與nginx.conf一致。另外需注意權限問題,此處是改為666
# ... with appropriate permissions - may be needed
chmod-socket = 666
#uid          = driftertek
#gid          = www-data
# clear environment on exit
vacuum       = true


讓 uwsgi 可以監視某個資料夾(此處設為/etc/uwsgi/vassals),只要裏面的uwsgi相關的config檔有更勭,就會自動套用
以root的身份建立資料夾
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
把之前建立的uwsgi.ini放建立soft link 到 /etc/uwsgi/vassals 裏
sudo ln -s /var/www/cgi-bin/remotesensing/remotesensing/uwsgi.ini /etc/uwsgi/vassals/


以 root 的身份執行下面指令(注意,如果是用venv,只要以實際的完整路徑去執行uwsgi即可,它會知道相關環境。)
sudo /opt/vPy-3.9.5/bin/uwsgi --emperor /etc/uwsgi/vassals --uid driftertek --gid driftertek
上面這行可以放到rc.local裏去,或是新增成systemctl的一個服務(這裏取名叫djuwsgi)
vi /etc/systemd/system/djuwsgi.service
[Unit]
Description=for django detect uwsgi conf in /etc/uwsgi/vassal

[Service]
Type=simple
ExecStart=/opt/vPy-3.9.5/bin/uwsgi --emperor /etc/uwsgi/vassals --uid driftertek --gid driftertek  --daemonize /var/log/uwsgi/emperor.log
Restart=always

[Install]
WantedBy=multi-user.target

#注意使用者名稱及uwsgi的位置可能不同
#ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid ihmt --gid ihmt  --daemonize /var/log/uwsgi/emperor.log
#存檔之後
mkdir /var/log/uwsgi 
systemctl start djuwsgi
#設為開機啟動
systemctl enable djuwsgi
systemctl enable nginx # nginx 也順便設一下
systemctl enable postrgresql

星期二, 12月 08, 2020

NOR1

MOSQUITTO1 yum install epel-release yum install libwebsockets #epel套件 yum install mosquitto vi mosquitto.conf #mqtt 服務 port port 1883 #以下二行為啟用mqtt 的 websockets port (給javascript用) listener 1893 protocol websockets persistence false persistence_location /var/lib/mosquitto/ allow_anonymous true #存檔 #測試 mosquitto -c /etc/mosquitto/mosquitto.conf #服務啟動 systemctl start mosquitto #開機啟動 syetemctl enable mosquitto #註服務log檔是記在 /var/log/messages 中。 postgresql yum install epel-release #連上官網,選擇OS, 版本等即可得到如鑑指令 dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm dnf -qy module disable postgresql dnf install -y postgresql13-server /usr/pgsql-13/bin/postgresql-13-setup initdb systemctl enable postgresql-13 systemctl start postgresql-13 www1 安裝anaconda #目前是python 3.8.5 conda create --name py3.8 python=3.8 vi ~/.bashrc #最後加上一行 source activate py3.8 #登出/登入 看看命令提示字元前面是否有(py3.8)字樣,有就正常。 conda install numpy conda install scipy conda install matplotlib conda install netcdf4 conda install pandas conda install pytz conda install python-dateutil conda install django # gdal conda install -c conda-forge gdal # 有些軟體版本會降 conda install -c conda-forge postgis # 有些軟體版本會降(包含gdal, 所以上面gdal應該不用裝 ) #安裝apache

星期一, 1月 13, 2020

centos 8

終於等到centos 8,是該準備做系統升級與搬移的事了
yum update
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf config-manager --set-enabled PowerTools # 執行這個指令才能裝netcdf,不然會有如下錯誤訊息。(qhull lapack也在PwoerTools裏)
# 註,如果上述指令失敗,可以試著改 vi /etc/yum.repos.d/CentOS-Linux-PowerTools.repo 這個檔案,修改裏面的 enabled=1。
Error: 
 Problem: conflicting requests
  - nothing provides libsz.so.2()(64bit) needed by netcdf-devel-4.7.0-2.el8.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
dnf install redhat-rpm-config #不知道安裝什麼,出現如下的錯誤,如果遇到了,就執行這個指令。
gcc: 錯誤:/usr/lib/rpm/redhat/redhat-hardened-cc1: 沒有此一檔案或目錄
    error: command 'gcc' failed with exit status 1
安裝基本套件,先裝後裝八成都要裝。也可以事後遇到有缺再補裝。
yum install cmake.x86_64 httpd php git.x86_64 gcc.x86_64 libxml2-devel.x86_64 json-c-devel.x86_64 proj-devel.x86_64 zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel tcl-devel gdbm-devel libpcap-devel xz-devel lapack-devel.x86_64 qhull-devel.x86_64 libpng-devel.x86_64 gcc-c++.x86_64 netcdf-devel.x86_64 libjpeg-turbo-devel.x86_64 libffi-devel
# libffi-devel 是安裝jupyter 或 psycopg2等套件時,需要的,如果沒裝會有如下錯誤
ModuleNotFoundError: No module named '_ctypes'
# 重點是裝完libffi-devel之後python要重新make install 才行!!!!
# 這些套件目前yum沒有的裝 GMT-devel.x86_64 proj-epsg.x86_64 libdb4-devel agg-devel.x86_64
找不到make這個指令,可用如下指令找出是哪個套件
yum provides \*/bin/make

安裝python 3.8

CentOS 8 之後有提供python3.6,如果有安裝,為免麻煩,就先移除了吧…
yum remove python3

#export mypyenv=3.6.5;
export mypyenv=3.8.3;
wget https://www.python.org/ftp/python/"$mypyenv"/Python-"$mypyenv".tgz
tar zxvf Python-"$mypyenv".tgz
cd Python-"$mypyenv"/
export LDFLAGS=-L/usr/lib64;./configure --prefix=/opt/python"$mypyenv"  --enable-shared --enable-optimizations
make
make test
#如果順利沒有報錯,就進行下一步
make install
#設定python3 的環境變數
vi /etc/profile.d/pythonvar.sh
#! /bin/bash
PYTHON3=/opt/python3.8.2
if [ -z "${PATH}" ]
then
    PATH="$PYTHON3/bin"; export PATH
else
    PATH="${PATH}:$PYTHON3/bin"; export PATH
fi
if [ -z "${MANPATH}" ]
then
    MANPATH="$PYTHON3/share/man"; export MANPATH
else
    MANPATH="$PYTHON3/share/man:${MANPATH}"; export MANPATH
fi

if [ -z "${LIBRARY_PATH}" ]
then
    LIBRARY_PATH="$PYTHON3/lib"; export LIBRARY_PATH
else
    LIBRARY_PATH="$PYTHON3/lib:${LIBRARY_PATH}"; export LIBRARY_PATH
fi

if [ -z "${LD_LIBRARY_PATH}" ]
then
    LD_LIBRARY_PATH="$PYTHON3/lib"; export LD_LIBRARY_PATH
else
    LD_LIBRARY_PATH="$PYTHON3/lib:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH
fi
不知道從啥時開始,pip3 可以用一般的使用者安裝套件,只要後面加上--user,但這應該是裝在使用者的家目錄下的.local資料夾中。 一般使用者用pip3 install --upgrade pip --user,會把pip搞掛。解決方法是把家目錄下的.local資料夾移除…但不知道有啥影響。
pip3 install numpy 
pip3 install scipy 
pip3 install matplotlib
pip3 install netcdf4 
pip3 install pandas 
pip3 install pillow 
pip3 install pytz 
pip3 install python-dateutil 
# python GDAL 這個必需要跟系統裏的gdal版本一致(如果有裝多版本,還需確定是不是正確連結lib)
pip3 install --global-option=build_ext --global-option=`gdal-config --cflags`  GDAL==`gdal-config --version`

安裝postgresql 12


dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf --disablerepo AppStream install postgresql12-server postgresql12-contrib postgresql12-devel #需要加--disablerepo AppStream
dnf install postgis30_12-devel  #不需要加--disablerepo AppStream
dnf install geos38-devel-3.8.0-1.rhel8.x86_64
pip3 install psycopg2-binary

星期一, 11月 09, 2015

CentOS 7

安裝選擇GNOME桌面的安裝,設定好網路之後就可以開始了。
安裝需要的套件
yum update
yum install epel-release.noarch
yum install cmake.x86_64 httpd php GMT-devel.x86_64 git.x86_64 gcc.x86_64 libxml2-devel.x86_64 json-c-devel.x86_64 proj-devel.x86_64 proj-epsg.x86_64 zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel tcl-devel gdbm-devel libdb4-devel libpcap-devel xz-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel lapack-devel.x86_64 qhull-devel.x86_64 libpng-devel.x86_64 gcc-c++.x86_64 netcdf-devel.x86_64 agg-devel.x86_64 libjpeg-turbo-devel.x86_64
yum install libffi-devel -y # python 3.7 需要這個套件
一、安裝 python3.7.0
#export mypyenv=3.6.5;
export mypyenv=3.7.0;
wget https://www.python.org/ftp/python/"$mypyenv"/Python-"$mypyenv".tgz
tar zxvf Python-"$mypyenv".tgz
cd Python-"$mypyenv"/
export LDFLAGS=-L/usr/lib64;./configure --prefix=/opt/python"$mypyenv"  --enable-shared
make
make test
#如果順利沒有報錯,就進行下一步
make install
#設定python3 的環境變數
vi /etc/profile.d/pythonvar.sh
#! /bin/bash
PYTHON3=/opt/python3.6.5
if [ -z "${PATH}" ]
then
    PATH="$PYTHON3/bin"; export PATH
else
    PATH="${PATH}:$PYTHON3/bin"; export PATH
fi
if [ -z "${MANPATH}" ]
then
    MANPATH="$PYTHON3/share/man"; export MANPATH
else
    MANPATH="$PYTHON3/share/man:${MANPATH}"; export MANPATH
fi

if [ -z "${LIBRARY_PATH}" ]
then
    LIBRARY_PATH="$PYTHON3/lib"; export LIBRARY_PATH
else
    LIBRARY_PATH="$PYTHON3/lib:${LIBRARY_PATH}"; export LIBRARY_PATH
fi

if [ -z "${LD_LIBRARY_PATH}" ]
then
    LD_LIBRARY_PATH="$PYTHON3/lib"; export LD_LIBRARY_PATH
else
    LD_LIBRARY_PATH="$PYTHON3/lib:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH
fi
#這個版本直接裝了pip了,接下來就來安裝必需套件
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
pip3 install netcdf4
pip3 install pandas
pip3 install pillow
pip3 install pytz
pip3 install python-dateutil
basemap 因為太大,只能自行安裝,方法如下
wget https://downloads.sourceforge.net/project/matplotlib/matplotlib-toolkits/basemap-1.0.7/basemap-1.0.7.tar.gz #下載 basemap-1.0.7
tar zxvf basemap-1.0.7.tar.gz; cd basemap-1.0.7
# 安裝geos lib
# 關於geos lib的版本問題,不管是系統帶的,還是epel,版本最新只到3.4,但是basemap好像需要3.5.X,再後續要安裝postgis套件時,會用到postgresql10的套件庫,
# 它提供的就是3.5的版本,因此建議先安裝其套件庫 
#yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-1.noarch.rpm
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
# 再執行yum安裝就會用上新版的geos lib
yum install proj-devel
#yum install geos-devel
yum install geos36-devel # pgdg-centos10-10-2.noarch.rpm的套件已經改用3.6了,且套件名也加上版號。
#上面的geos36-devel的安裝資料夾也改為/usr/geos36。
#basemap需要GEOS lib,它預設是檢查/usr/local/netcdf /usr/local/lib,但是我們前一步yum裝的時候,是放在/usr/include /usr/lib64/usr/geos36。
#所以需要透過export GEOS_DIR 告訴它位置後再用python3執行setup.py
#export GEOS_DIR=/usr; python3 setup.py install # 注意大小寫
export GEOS_DIR=/usr/geos36; python3 setup.py install # 注意大小寫
成功之後進到python3並執行 
from mpl_toolkits.basemap import Basemap
第一次執行會出現下面的訊息,
/opt/python3.5.2/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')


二、設定apache, php, wsgi,設定 apache 使用 wsgi 模組
#假設已經安裝httpd, php 

#沒有的話請 
yum install httpd php
#CentOS7好像不太希望人客用改iptables檔案的方式來管理防火牆規則。

#所以用 firewall-config

#執行下列命令

firewall-config

#細節就不多說了,反正記得http, https要勾選。

#啟動httpd
/sbin/service httpd start
#用瀏覽器連上IP測試看看是否能看到Testing 123.. 的頁面,有的話繼續下一步。

#開始設定之前,需先確保我們用的是自行編譯的PYTHON3.5.2,不是CentOS系統裏的2.X。
[root@localhost site-packages]# python3
Python 3.5.2 (default, Aug 29 2016, 19:12:24) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import site
>>> site
<module 'site' from '/opt/python3.5.2/lib/python3.5/site.py'>
>>> exit()

#前面的/opt/python3.5.2就是編譯時的設定 --prefix=/opt/python3.5.2,
#所以site-packges的完整路徑如下:
/opt/python3.5.2/lib/python3.5/site-packages


#確定之後,接下來繼續安裝及設定 django 與 wsgi
yum install httpd-devel.x86_64 #記得裝這個
#安裝 mod_wsgi
#不是用 yum install mod_wsgi.x86_64 #這個根我們編譯的版本不見得合
pip3 install mod-wsgi  #httpd-devel.x86_64沒裝的話,會有找不到apxs的錯誤。

#裝完之後,會有一個執行檔叫mod_wsgi-express,在/opt/python3.5.2/bin/中,
mod_wsgi-express install-module 
#會得到下面的內容,這是apache要載入模組時用的,:
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
WSGIPythonHome /opt/python3.5.2

#設定載入 mod_wsgi
#新增django.conf在/etc/httpd/conf.d 下
vi /etc/httpd/conf.d/django.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIDaemonProcess 192.168.4.20 python-path=/var/www/cgi-bin:/opt/anaconda3/lib/python3.4/site-packages
WSGIProcessGroup 192.168.4.20
WSGIScriptAlias /test /var/www/cgi-bin/testa.py process-group=192.168.4.20

# 上面的設定內容。是指當有人連到 http://192.168.4.20/test 時,系統(當然是192.168.4.20這台機器)會去執行testa.py
# 在/var/www/cgi-bin/ 中新增 testa.py 檔案,
# 內容如下:
def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]

    start_response(status, response_headers)

    return [output]

/sbin/service httpd restart
# 如果一切正常,用瀏覽器造訪 http://192.168.4.20/test
# 就能看到 Hello World!
</module>

#關於wsgi.py 當執行 django-admin startproject odbintl 時,會產生 odbintl 資料夾
#odbintl 資料夾裏有manage.py,然後還有再一層的odbintl資料夾,這一層裏就放著settings.py, wsgi.py urls.py等
#其中,這些檔案是不是需要有可執行的權限?看樣子是不用,雖然上網查有些問題會要求大家設執行權限。
#我的wsgi.py的內容就是預設值,沒變,內容如下
"""
WSGI config for odbintl project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "odbintl.settings")
# 上面的test就是startproject時給的名字
application = get_wsgi_application()

#當我們新增一個project時,apache如何知道要這專案在哪?當然是要到/etc/httpd 裏去設定
vi /etc/httpd/conf.d/django.conf
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
#怎麼知道在哪呢?用這個就可以得到 mod_wsgi-express install-module
#WSGIPythonHome /opt/python3.5.2
#WSGIDaemonProcess 192.168.4.20 python-path=/var/www/cgi-bin/odbintl:/opt/python3.5.2/lib/python3.5/site-packages
#WSGIProcessGroup 192.168.4.20

#WSGIScriptAlias /test /var/www/cgi-bin/testa.py process-group=192.168.4.20
#WSGIScriptAlias /odbintl /var/www/cgi-bin/odbintl/odbintl/wsgi.py process-group=192.168.4.20

WSGIScriptAlias /odbintl /var/www/cgi-bin/odbintl/odbintl/wsgi.py
WSGIPythonPath /var/www/cgi-bin/odbintl:/opt/python3.5.0/lib/python3.5/site-packages

Alias /favicon.ico /var/www/cgi-bin/odbintl/static/favicon.ico
Alias /robots.txt /var/www/cgi-bin/odbintl/static/robots.txt

Alias /odbintl/media /var/www/cgi-bin/odbintl/media
Alias /static /var/www/cgi-bin/odbintl/static/

<directory cgi-bin="" odbintl="" static="" var="" www="">
Require all granted
</directory>

<directory cgi-bin="" media="" odbintl="" var="" www="">
Require all granted
</directory>

<directory cgi-bin="" odbintl="" var="" www="">
<files wsgi.py="">
Require all granted
</files>
</directory>

三、安裝postgis (因為django有些套件會用到裏面的lib,所以就算不啟用postgresql,這一步的軟體還是要裝,但不用啟動服務,因為我們會把postgresql資料庫的服務裝在另一台電腦)
# PostgreSQL穩定版的到10.0,到這裏 http://yum.postgresql.org/repopackages.php 找到我們系統的套件 CentOS 7 x86_64
# 複製連結,然後用yum install 安裝。
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-1.noarch.rpm
# 接下來安裝postgis
yum install postgresql10-server.x86_64 postgresql10-contrib.x86_64 postgresql10-devel.x86_64 postgis24_10-devel.x86_64
# postgresql 設定
/usr/pgsql-10/bin/postgresql-10-setup initdb # 初始化,這個指令會建一個postgres表,所有者是postgres。
chkconfig postgresql-10 onsystemctl enable postgresql-10 # 設定開機啟動
/sbin/service postgresql-10 startsystemctl start postgresql-10 # 啟動postgresql server

要讓postgres透過本地端連線且使用md5認證的方法為
su postgres
psql #不加 -U postgres 也行,因為已經是postgres使用者了,所以就是用postgres登入,但此時是用peer的認證方式)
alter user postgres password '********'; #設定密碼,其實建議不用設,用postgres使用者登入後在psql就好,因為它只用來系統維護。
\q #退出資料庫
exit #退出postgres使用者
修改
vi /var/lib/pgsql/10/data/pg_hba.conf
#加上
local   all             postgres                                md5
/sbin/service postgresql-10 restart

#新增資料庫使用者,及新建資料庫(如果打算從舊資料庫的備份搬移資料庫過來,就不用這一步)
su postgres
createdb djangodb
psql
CREATE USER abcuser WITH PASSWORD 'xxxxxx' ; <--新增使用者(這個使用者已經是本機使用者時用)
CREATE USER abcuser WITH ENCRYPTED PASSWORD 'xxxxxx' ; <--新增使用者且對密碼加密(這個不需本機使用者,且可以用MD5由別台機登入)
GRANT ALL PRIVILEGES ON DATABASE djangodb to abcuser ;
\q
#註,abcuser如果不是linux使用者,那麼socket的認證方式要改成md5,
#連線到djangodb
psql djangodb
CREATE EXTENSION postgis; <-- #設定postgis extension,

#在/etc/profile.d 下新增 pgsqlvar.sh
#! /bin/bash
PGSQLHOME=/usr/pgsql-10
if [ -z "${PATH}" ]
then
    PATH="$PGSQLHOME/bin"; export PATH
else
    PATH="$PGSQLHOME/bin:${PATH}"; export PATH
fi

四、postgreSQL搬移
#簡單QA1: 如果搬移前本來有舊版的資料(不是指舊版本的資料庫),如之前備份後沒在用,現在要再備份一次。那怎辦,
#因為不會做差異備份所以,目前只好把原資料庫砍了,再重新初始化一次,步驟如下:
#1先把資料庫的服務關掉,
#2把 /var/lib/pgsql/10/data更名(這是指initDB時用的是預設值的時候)。還有/var/lib/pgsql/10/initdb.log 這個檔也先更名。目的是失敗時可以回來。
#3再啟動資料庫服務,重新執行前面的initdb及之後的步驟,就可以得到一個乾淨的資料庫了。

#從舊機器匯出資料 PS:舊資料庫管理員 postgres 
#如果postgre沒設密碼,且是預設的socket認證(就是peer),那就切換成 su postgres,再執行下面指令。
pg_dumpall | gzip > pgsql_backup.dump # 沒有家目錄,可以先cd /tmp ,

#如果之前有設密碼,且允許md5認證,那可用下面的方式
pg_dumpall -U postgre | gzip > pgsql_backup.dump
#會問密碼好幾次,請勿打錯(錯一次就得重來),建議在記事本上打完複製,然後三次都用貼上的。
#複製pgsql_backup.dump至新機器,並匯入資料 PS:新資料庫的管理員是postgres

#在新機器中
# 如果只允許linux socket認證(就是peer)則執行
su postgres
gunzip -c filename.gz | psql

#如果允許md5認證則執行下列指令匯入資料
gunzip -c filename.gz | psql -U postgres  # 當然需要密碼,就上面的'*********'

#要讓postgresql可以透過tcp連線有二個部份要設定,pg_hba.conf及postgresql.conf
#記得pg_hba.conf設的是client的IP, postgresql.conf設的是server的IP。
#修改 /var/lib/pgsql/10/data/pg_hba.conf 這裏的設定主要是你的伺服器要開放哪一個使用者透過哪個IP連到哪個資料庫。
host    dbname             username             192.168.4.20/32            md5
host    dbname             username             192.168.4.11/32            md5

#修改/var/lib/pgsql/10/data/postgresql.conf 指定哪個IP來提供服務,預設是localhost,(如果你的機器有同時很多個IP的話,那就可以指定其中一個或用*來表示全部。)
#總之,這裏的設定是表示你的postgresql伺服器要用哪一個IP來服務大家。我們的pgsql 的 SERVER IP是 192.168.4.22,所以設定如下(不知道為什麼如果只是給DJANGO的連線(127.0.0.1),可以不用這個設定)
listen_addresses = 'localhost,192.168.4.22'           # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
#重新啟動postgresql服務
/sbin/service postgresql-10 restart

五、postgresql資料庫同步
如果機器掛了!!!!!!有備援的資料庫多好。
主機器的設定
vi /var/lib/pgsql/10/data/pg_hba.conf 加上一行
host    replication     postgres    192.168.2.199/32         trust 
# 上面那一行,主要是讓192.168.2.199的機器可以透過postgres 進行備份


vi /var/lib/pgsql/10/data/postgresql.conf 
listen_addresses = 'localhost, 192.168.4.22' #(serverIP是伺服器的IP)
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 16 
hot_standby = on

備援機的設定
按前面方法裝一台postgresql資料庫,並initDB且設好postgres的密碼
/usr/pgsql-10/bin/postgresql10-setup initdb # 初始化,這個指令會建一個postgres表,所有者是postgres。
alter user postgres password '********'; #設定密碼
pg_basebackup -D /var/lib/pgsql/10/data -F p -X stream -v -P -h 192.168.4.22 -U postgres
備份成功之後,會多了 /var/lib/pgsql/10/data
[root@localhost 10]# ll /var/lib/pgsql/10/
總計 12
drwx------.  2 postgres postgres    6  8月 11 07:34 backups
drwx------. 20 root     root     4096  9月  9 10:43 data #<-- 注意,如果使用者不是postgres要變更。
-rw-------.  1 postgres postgres 1406  9月  6 14:41 initdb.log

chown postgres:postgres -R data
# 設定recovery.conf,預設是沒這個檔案,但是有提供sample檔,所以我們先複製一份過來
cp /usr/pgsql-10/share/recovery.conf.sample /var/lib/pgsql/10/data/recovery.conf
vi recovery.conf
standby_mode = on
primary_conninfo = 'host=192.168.4.22 port=5432 user=postgres'
trigger_file = '/home/ha/pgdb/pg.trigger.file'
#存檔後重新啟動服務
/sbin/service postgresql-10 restart


#
六、安裝 GDAL2.1.1
# 安裝 netcdf, openjpeg, geos, c++ compiler
yum install netcdf-devel.x86_64 openjpeg-devel.x86_64 geos-devel.x86_64 gcc-c++.x86_64
# 下載
export GDALVER="2.1.1"
wget http://download.osgeo.org/gdal/$GDALVER/gdal-$GDALVER.tar.gz
tar zxvf gdal-$GDALVER.tar.gz
cd gdal-$GDALVER
./configure --prefix=/usr/local/gdal-$GDALVER
make
make install
#完了之後記得設定path

##
# 用pip3 安裝 python下的 gdal
##
# 一直以來用pip3 install gdal 都會遇到如下的錯誤:
# error: command 'gcc' failed with exit status 1
# 查了一下,這問題大概是和系統裝的GDAL版本有關
# 首先確保我們可以執行如下指令取得安裝的版本
gdal-config --version 
#如果正常,會顯示安裝版本…如果不正常,要不就是沒有安裝GDAL,要不就是路徑沒設定。
#可以正常執行gdal-config之後,再用如下指令安裝正確的版本即可
pip3 install GDAL==$(gdal-config --version | awk -F'[.]' '{print $1"."$2}')

七、移植django
#因為django_raster套件的需要,postgis, GDAL2.1.1要先裝
# 因為我們server用的是postgresql 所以要先測試postgresql是否可正常使用
pip3 install django
#執行下面的安裝如果找不到pg_config這個執行檔,它應該是安裝postgis時會產生的,在/usr/pgsql-X.Y/bin 中
#可以在/etc/profile.d/ 中新增pgsqlvar.sh 內容如下:
[root@localhost gdal-2.1.1]# vi /etc/profile.d/pgsqlvar.sh 
#! /bin/bash
PGSQLHOME=/usr/pgsql-10 # 這個是我們裝pgsql的資料夾
if [ -z "${PATH}" ]
then
    PATH="$PGSQLHOME/bin"; export PATH
else
    PATH="$PGSQLHOME/bin:${PATH}"; export PATH
fi
#存檔後重新登出登入,或 source /etc/profile.d/pgsqlvar.sh
pip3 install django
pip3 install psycopg2
# 測試django
django-admin startporject mytest
cd mytest
vi mytest/settings.py
#把下面的部份,用sqlite改成postgis
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'cmdodb',
        'USER': 'xxx',
        'PASSWORD': 'axxxxx',
        'HOST': 'localhost',
        'PORT': '',
    }
}
#python3 managy.py mytest
#如果一切正常,就表示django與postgresql及apache整合正常,可以正式開始移值
# 開始移植django
# 依據上一步,應該已經有了可以用wsgi模組的apache。
# 把機器A的 django project copy 到機器B。
# 我的django project 放在 /var/www/cgi-bin/odbintl 中
# 不想太麻煩,所以東西就copy到機器B的/var/www/cgi-bin/odbintl 中
scp -r cmd@192.168.4.11:/var/www/cgi-bin/odbintl ./
# django的project,一定有一個managy.py,先用它來試一些指令,通常它會載入setttings.py
# 其中就會import一些有的沒的模組,如果有我們後來裝上的,非系統帶的,就會報錯,這時就用pip裝回去就是了
python3 managy.py
#出現 ImportError: No module named 'django_extensions'
pip3 install django_extensions
# 再執行一次
python3 managy.py
# 這次出現 ImportError: No module named 'django_countries'
pip3 install django_countries
#####
# 接下來陸續遇到 django-raster, django-geojson
#終於,裝好了,python3 manage.py,結果,遇到下面的怪問題
######
File "/opt/python3.5.0/lib/python3.5/site-packages/raster/ogrraster.py", line 7, in <module>
    from utils import convert_pixeltype, HEADER_STRUCTURE, HEADER_NAMES,\
ImportError: No module named 'utils'
#看起來應該是 django-raster套件的問題,且出在第七行from utils import convert_pixeltype...
#直接執行 python3,並輸入 from utils import convert_pixeltype 果然出現一樣的問題
#解決方法,是 from utils import 改成 from .utils import 
#對,就是utils前面加上一個.號。
#所以,就修改有問題的那一個檔案吧,
vi /opt/python3.5.0/lib/python3.5/site-packages/raster/ogrraster.py
#跳到第七行,在utils前面加上一個.
#本來
from .utils import convert_pixeltype, HEADER_STRUCTURE, HEADER_NAMES,\
#改成
from .utils import convert_pixeltype, HEADER_STRUCTURE, HEADER_NAMES,\
#存檔

#############
# 確認特殊資料夾的寫入權限
#############
#當然,如果有一些暫存檔產生,或供上傳的地方,就要注意資料夾權限,通常是所有者改為apache
#在舊伺服器的django app(我的是 /var/www/cgi-bin/ )目錄輸入下面的指令
[root@cmd1-odb cgi-bin]# ll -R odbintl | grep ^d | grep apache 
drwxrwxr-x  2 apache apache   4096 Sep 10 15:14 media
drwxrwxr-x 2 apache apache 262144 Oct 29 16:23 django-cache
#所以當檔案移到新伺服器時,也要記得確定資料夾的所有者
chown -R apache:apache media
chown -R apache:apache django
最後的最後,SELINUX如果沒做相應的設定,那就disable它吧,不然會報錯。
#############
# 修改odbintl/settings.py
#############
#只列出需要改的地方
#ALLOWED_HOSTS = ['nrtinfo.oc.ntu.edu.tw']
ALLOWED_HOSTS = ['192.168.4.20'] # 新伺服器的IP
GDAL_LIBRARY_PATH = '/usr/local/gdal2.0.1/lib/libgdal.so' #GDAL2.0.1 程式庫的路徑
#由於原本的django與postgresql是同一台伺服器,這次只搬移django,postgresql伺服器沒更動
#所以至需要更改settings.py讓它連上原來的伺服器。
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'yyyyyy',
        'USER': 'xxx',
        'PASSWORD': 'zzzzzz',
        'HOST': '192.168.x.x',
        'PORT': '5432',
    }
# 原伺服器的postgresql開放給新主機連入,至少三個地方要改
# 1 postgresql.conf(開放給哪個機器連入,以及哪個port)、
#主要改的部份為listen_addresses
vi /var/lib/pgsql/9.3/data/postgresql.conf # 注意,不同版本的路徑不見得一樣
listen_addresses = 'localhost,192.168.4.20,192.168.4.11'                # what IP address(es) to listen on;
port = 5432

# 2 pg_hba.conf,讓本來透過local連資料庫的使用者,可以由host連入。
vi /var/lib/pgsql/9.3/data/pg_hba.conf
#新增一行類似下面的內容
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    yyyyyy             xxx             192.168.4.xx/32            md5
#yyyyyy是資料庫的名字,使用者是xxx。這裏的資料當然是要與odbintl/settings.py檔案裏的內容一樣。
#就是django是透過哪個使用者連到postgresql的哪個資料庫,密碼在settings.py要給,這裏當然是不用。因為settings.py是資料庫的client端。
#這裏的設定是針對server端,意思是給哪個使用者,透過哪個ip連到哪個資料庫,加密方法是md5。密碼早就設好了,在postgresql設定時設好的。
#重啟postgresql 服務
/sbin/service postgresql-9.3 restart 
#注意服務名稱,如果不確定,用 chkconfig --list | grep postgresql 查一下postgresql的全名。
# 3 防火牆開5432這個port. 建議用system-config-firewall 修改,以下是直接修改iptables檔案,新增一行
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
/sbin/service iptables restart

</module>
django使用不同版本 gdal library 的方法,由於CentOS 的EPEL套件庫預設裝的GDAL版本雖然新,但通常也不會太新。但是我們的GEO-DJANGO會要求使用新一點的版本
解決方法是編輯settings.py (CREATE PROJECT時就會有的那個檔案,你知道的)
加上一行
GDAL_LIBRARY_PATH = '/usr/local/gdal-2.1.0/lib/libgdal.so' #路行看你編譯時放哪


問答:
Q:硬是把資料表砍了之後,如何重建?
A:python3 manage.py sqlmigrate app_name 0001 | python3 manage.py dbshell

Q:XYZ檔轉成GEOTIFF的指令(用GDAL)
A:gdal_translate -Ot Float32 -of Gtiff -a_srs "EPSG:4326" ./Taidp200m.xyz taidp200m_raw.tiff

Q:django 的view 裏的request物件中的key如何做到不管大小寫?
A:  把request.GET裏的字串都改成小寫,另外存一個python的dictionary(取名為request_lower),要注意的是request物件用request.GET.get(key)取值。但python dictionary用request_lower.get(key)。指令為 request_lower={k.lower():request.GET.get(k).lower() for k in request.GET}。

Q: 建站初期,總有需要全站重建的時候,如何清空資料?
A: 全站清空指令 python3 manage.py flush (會提醒你這個動作不可反悔,接受就按yes)。清空完之後,基本上連建好的superuser(肯定也包含user)都會不見,需要重建superuser(python3 manage.py createsuperuser)。

Q: django 的 view 裏 import xarray (或pandas之類的套件之後) 系統就停在那了…用web browser去看,就是一直等,等到逾時。此時到伺服器去restart httpd 的服務也要等半天。關於此類的錯誤,請到apache的設定檔去(關於WSGI的部份),在WSGIScriptAlias下面新增如下面的一行:
WSGIApplicationGroup %{GLOBAL}
原因如下(擷取自stack overflow):
Various of the scientific packages that it is going to need will not work in Python sub interpreters. That directive will force the use of the main interpreter context.
Q: gdal_translate 將xyz轉成geotiff的方法
A: gdal_translate -ot Float32 -of GTiff -a_srs EPSG:4326 -a_nodata 9999 Taidp.xyz test.tif
Q: geotiff 由rgb轉成rgba的方法
A: gdal_translate rgb_in.tif rgba_out.tif -b 1 -b 2 -b 3 -b mask
Q: ftp使用非pasv模式時,會卡住
A: 防火牆需載入想應的模組 /sbin/modprobe nf_conntrack_ftp 與 /sbin/modprobe nf_nat_ftp 每次重開機都要載入,就把這二行寫在/etc/rc.local 這個檔案裏面。
Q: 使用roundcube web mail時,doovecot 會報錯,大致內容是無法改變家目錄下/mail/.imap/INBOX 的權限。
A: mkdir -p /etc/skel/mail/.imap/INBOX # 這/etc/skel 裏的東西就是家目錄在建立時會出現的東西,所以把INBOX先建好即可。
Q: 使用Centos7用autofs無法成功掛winXP的網芳(XP很舊我知道),但用smbclient明明有顯示分享磁碟。
A: 可以看/var/log/messages,如果有如下的版本問題的訊息,那可以特別指定用哪一版,
kernel: No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
所以auto.misc的內容如下
disk1 -fstype=cifs,rw,noperm,vers=1.0,username=xxx,password=yyyyy ://192.168.1.50/diskd
七、安裝 seadas
wget http://oceandata.sci.gsfc.nasa.gov/SeaDAS/installer/7.2/seadas_7.2_linux64_installer.sh
sh seadas_7.2_linux64_installer.sh
# 安裝 ocssw 時需要 git 套件,不然會有奇的問題。 yum install git.x86_64 
八、安裝地圖服務(MapServer 7.0)
8.1 mapserver
MapServer7.0在CentOS7上面裝比CentOS6方便多了,因為CentOS7的套件夠新,符合MapServer7.0所需。
#首先安裝所需套件
yum install proj-epsg.x86_64 # <-- -dcmake_install_prefix="/opt/mapserver" -dcmake_prefix_path="/usr/local/gdal2.0.1" -dwith_curl="ON" -dwith_kml="ON" ..="" 2="" 8.2="" 8.3="" apserver7.0.0="" bin="" build="" cairo-devel.x86_64="" cat="" cd="" cgi-bin="" cmake="" download.osgeo.org="" epsg="" errno:="" error.="" error="" fcgi-devel.x86_64="" for="" fribidi-devel.x86_64="" gdal1="" gdal2.0.1="" gdal2="" gdal="" giflib-devel.x86_64="" harfbuzz-devel.x86_64="" http:="" httpd="" init="epsg:4326" install="" install_manifest.txt="" lib64="" lib="" libmapcache.so.1.4.0="" libmapcache.so.1="" libmapcache.so="" library="" list="" local="" make="" map="/var/www/html/map/wms2.map&" mapcache-1.4.0.tar.gz="" mapcache-1.4.0="" mapcache.fcgi="" mapcache="" mapcache_seed="" mapserv="" mapserver-7.0.0.tar.gz="" mapserver7.0="" mapserver="" mkdir="" mod_mapcache.so="" modules="" msprocessprojection="" no="" pre="" proj-epsg.x86_64="" proj="" projection="" system="" tar="" usr="" wget="" yum="" zxvf="">
九、安裝 samba

星期三, 10月 28, 2015

compile mb-system version 5.5.2252

在安裝mb-system 5.5.2252版時,遇到下面的問題: configure: error: Did not find libgmt according to --with-gmt-lib - check the installation! 我的gmt5是裝在 /usr/local/gmt5 裏
#執行下述命令時就是會出問題
./configure --with-netcdf-include=/usr/local/netcdf/include --with-netcdf-lib=/usr/local/netcdf/lib --with-gmt-include=/usr/local/gmt5/include/gmt --with-gmt-lib=/usr/local/gmt5/lib64
#檢查config.log
#可以看到下列訊息
#configure:14103: checking for GMT_begin in -lgmt
#configure:14128: gcc -o conftest -g -O2   -L/usr/local/gmt5/lib64 conftest.c -lgmt  -lm  >&5
#/usr/bin/ld: warning: libpsl.so.5, needed by /usr/local/gmt5/lib64/libgmt.so, not found (try using -rpath or -rpath-link)
#查一下configure 14103行附近
vi configure
if test "$GOT_GMT" = "yes" ; then
        $as_echo "GMT library location specified: $gmt_libdir - check if libgmt libpsl are there..."
    save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -L$gmt_libdir"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMT_begin in -lgmt" >&5 #<--這是14103行
$as_echo_n "checking for GMT_begin in -lgmt... " >&6; }
if ${ac_cv_lib_gmt_GMT_begin+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgmt  $LIBS" # <-- 這一行有問題,現在的gmt需要加上 -lpsl
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
###
#所以把 change the LIBS line
LIBS="-lgmt  $LIBS" 
#改成 to
LIBS="-lgmt -lpsl $LIBS"
試用
TMPLIST=tmplist
DATALIST="datalist"
ls -1 | grep all$ > $TMPLIST
mbdatalist -F-1 -I $TMPLIST > $DATALIST # 產生datalist-1 檔
mbdatalist -F-1 -I $DATALIST -N # 每個原始檔會產生三個檔案,副檔名依次為 fbt fnv inv 
mbm_plot -F-1 -I $DATALIST -G2 -N -C # -N:航跡。-G2 有打光的彩色地形。-C:等深線。

./datalist-1.cmd

星期五, 11月 07, 2014

inotify (檔案變更監視) 以及 autossh reverse tunnel (ssh 逆向通道)

最近需要管理一台會到處"漂"的電腦,它有網路(衛星的哩)、有電源還有冷氣可吹,高級的很。
缺點就是衛星網路很慢,所以如果想要遠端去管理,最佳方案是文字介面,因為它在防火牆內(雖說如果需要,也能拿到實體ip),不過它也沒什麼服務,還是放防火牆內安心些。
所以,ssh 逆向通道就很方便啦,反正電腦隨時保持一條管道讓我可以ssh進去就好。方法也實在簡單。不過有幾個重點應該要注意。
第一,網路會斷,斷了是沒關係,但是連線後要能再連回來,所以autossh可以代勞這個事。
第二,那台電腦會每天重開機,重開機之後要能自動連線回來。這個我不知道是什麼原因,猜想是因為重開機或重啟SSH reverse tunnel時,因為被連端的電腦的port還來不及關閉,新的連線需求就又來了,導致電腦回應說我的port已經在使用中了,所以無法建立連線。由於知識不足,所以想了另一個方法,就是我每次要建tunnel時,就把port加1。當這個port加到一個值時,就再來新的一輪。例如讓port從2220開始,每執行一次就讓port+1,直到port 到2230之後,就再讓port從2220開始。
#!/bin/bash
killall -9 autossh
sleep 10
rportf="/home/user/bin/rport"
RPORT=$(/bin/cat $rportf)
RPORT=$(/usr/bin/expr $RPORT + 1)
echo $RPORT
if [ $RPORT -gt 2230 ]; then
  RPORT=2220
fi
/bin/echo $RPORT > $rportf
SSH_OPTIONS="-i /home/user/.ssh/id_rsa"
# Always assume initial connection will be successful
export AUTOSSH_GATETIME=0
# Disable echo service, relying on SSH exiting itself
export AUTOSSH_PORT=0
autossh -f -- $SSH_OPTIONS -o 'ControlPath none' -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -R $RPORT:localhost:22 serverUserName@serverIP -N
監視一個檔案,如果它有變動,就...
因為那台再外面"漂"的電腦,順利的話會定時傳東西回來。
所以,如果有東西回來時,我要把它放在一個地方昭告大家…
lsyncd是不錯的選擇,不過我想試點不同的,如inotify或是fanotify之類的。
不過好像centos6.5的kernel 還不支援fanotify ,而且查到的討論很少。
所以還是用inotify,不過殘念的是inotify的計畫已經停止了…所以將來還是得回歸到fanotify吧(?)
inotify 預設沒有安裝,套件庫也沒有,要先裝epel,假設你有epel套件庫,那就
yum install incron
即安裝完成。
設定開機啟動 chkconfig incrond on
用法很像crontab,就輸入下面的指令
incrontab -e
如果不給用,出現 user 'xxx' is not allowed to use incron 那就編輯 /etc/incron.allow (如果不存在,就新增一個)
把要用incrontab 的使用者加進去即可,例如:
vi /etc/incron.allow
xxx
yyy
好了之後,再重新
incrontab -e
#分三個部份:
#要監視的檔案/資料夾 事件 要執行的指令
/home/cmd/or1/ IN_MODIFY /bin/cp $@/latestmidas.json /var/www/html/nrtfcst/
#上面會去監視/home/cmd/or1資料夾, 如果有變更(IN_MODIFY),就把裏面的latestmidas.json這個檔案cp到 /var/www/html/nrtfcst中。
#其實我只想監視一個檔案,但是如果我只設定一個檔案,它只有第一次的更動會複製,接下來就沒反應了。
#原因是它是針對檔案的代碼,但是這個檔案一有變動,代碼如果也根著變,它的監視行動就取消了(因為對像(代碼)不見了),但是如果是監視資料夾就沒這個問題,只是這個資料夾有任何變動,我都會把我原來只想監視的檔案複製一份到別的地方。(還好,反正這個資料夾也就一個檔案)。

星期三, 9月 24, 2014

lsyncd 安裝 + 免密碼登入ssh

yum install rsync xinedtd
vi /etc/xinetd.d/rsync
disable = yes 改成
disable = no
/sbin/service xinetd start
chkconfig xinetd on

安裝epel
wget http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
安裝 lsyncd
yum install lsyncd
設定 epel
vi /etc/lsyncd.conf
加入下述內容
# 不知道怎麼回事,在使用者模式下命令是正常,但是放在服務下就失敗
# 一直是ssh permission的問題,試了半天,重點是rsh時要指定使用者(-l), 及其 private key (-i)
settings{
    statusFile = "/var/run/lsyncd.status",
    logfile = "/var/log/lsyncd.log",
    nodaemon = false,
--    insist = true,
    log = all
}
sync{
    default.rsync,
    source="/home/cmd/disk1/send2ntu",
    target="192.168.4.11:./or1/",
    rsync={
       binary = "/usr/bin/rsync",
       rsh = "/usr/bin/ssh -i /home/cmd/.ssh/id_rsa -l cmd -o StrictHostKeyChecking=no",
       compress = true,
       sparse = true,
       update = true,
       links = true,
       times = true
    },
    delay = 10
}
# 完成之後存檔,/sbin/service lsyncd restart 即可啟動。 
# 測試正常之後即可設定開機啟動 chkconfig lsyncd on
# selinux issue:
# 很煩,弄了很久,一直有如下的錯諤訊息
#rsync: Failed to exec sudo: Permission denied (13)
#rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
#rsync: connection unexpectedly closed (0 bytes received so far) [sender]
#rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6]
#測試了老半天之後,想到 selinux 定理:就是查不出原因的錯誤,而且打指令可以執行,放到服務裏就不行
#那九成是selinux出包,用如下指令暫時關掉 selinux
# echo 0 > /selinux/enforce 
# 再重新啟動 lsyncd 竟然正常,那就就定selinux 得設定
# 這裏講一下新工具,allow2audit,它可以分析autit.log檔,並且幫忙產生設定檔,用就是了!!
# 執行下面的指令,把audit.log裏關於AVC與rsync的問題丟給audit2allow 處理,
cat /var/log/audit/audit.log | grep AVC | grep rsync | audit2allow -M  rsyncissue
#******************** IMPORTANT ***********************
#To make this policy package active, execute:
#
#semodule -i rsyncissue.pp
#寫會產生rsyncissue.pp 與 rsyncissue.te 二個檔案,後面那個可以看看,前可那個是二進位檔,用下面的指令設定
semodule -i rsyncissue.pp
#就幫你把問題解決了!!!!
#不過有時候上面的二個步驟要多做幾次才行,因為你知道的,selinux就是那麼複雜。
安裝allow2audit
它是一個關於selinux policy管理的套件組中的一個程式
如果用yum知道哪個套件組有它?請用下面的指令
yum provides */allow2audit
免密碼登入ssh主機
ssh-keygen -t rsa -C "mdchiou@ntu.edu.tw"
#輸入上述指令後,下面三個問題都直接enter即可
Generating public/private rsa key pair.
Enter file in which to save the key (/home/or1/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/or1/.ssh/id_rsa.
Your public key has been saved in /home/or1/.ssh/id_rsa.pub.
#至此即產生完金鑰與私鑰,再透過下面的指令把私鑰上傳至欲登入的主機
ssh-copy-id user@IP
#就這樣,超方便der
安裝samba
yum install samba.x86_64
pdbedit -a user1 # linux已經存在的帳號如or1...
#修改iptables 開放 139 445
#修改selinux 權限開放家目錄
setsebool -P samba_enable_home_dirs on