2018年6月5日 星期二

OCS Inventory 匯出資料到 Google 試算表(依電腦設備類型)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來(參考資料出處),並依個人需求調整。

如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。

下列程式調整SELECT電腦設備類型為Notebook寫入試算表分頁。

程式內容:
#coding=utf-8
#-*- coding: utf-8 -*-
import MySQLdb as mysqldb
import sys
import gspread
import string

def DB_return(exec_cmd):
    connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
    with connection:
        cursor = connection.cursor()
        cursor.execute(exec_cmd)
        rows_info = cursor.fetchall()
        return rows_info

def GSheet_write(GSpreadSheet,GDriveJSON,tab_data,data,worksheet_name):

    a_list=[]
    for i, element in enumerate(tab_data):
        a_list.append(tab_data[i])
    a_tup = tuple(a_list)

    start_row = 1
    start_letter = 'A'
    end_len = len(data[0]) - 1
    if end_len > 26:
        len_info = end_len - 26
        len_a='A'
    else:
        len_info = end_len
        len_a=''
    end_letter = string.uppercase[len_info]
    end_letter = len_a+end_letter
    end_row = len(data)
    range = "%s%d:%s%d" % (start_letter, start_row+1 , end_letter, end_row+1)
    range_tab =  "%s%d:%s%d" % (start_letter, start_row , end_letter ,start_row)

    from oauth2client.service_account import ServiceAccountCredentials as SAC
    try:
        scope = ['https://spreadsheets.google.com/feeds']
        key = SAC.from_json_keyfile_name(GDriveJSON, scope)
        gc = gspread.authorize(key)
        workbook = gc.open(GSpreadSheet)

        if worksheet_name in [sheet.title for sheet in workbook.worksheets()]:
          workbook.del_worksheet(workbook.worksheet(worksheet_name))
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
        else:
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
    except Exception as ex:
        print('connect google fail ', ex)
        sys.exit(1)

    cell_list = wks.range(range)

    try:
        idx = 0
        for (start_row , rowlist) in enumerate(data):
            for (colnum, value) in enumerate(rowlist):
                cell_list[idx].value = value
                idx += 1
                if idx >= len(cell_list):
                    break
        wks.update_cells(cell_list)
    except:
        print "Exception"


    cell_list_tab = wks.range(range_tab)

    try:
        idx = 0
        for (start_row , value) in enumerate(a_tup):
            cell_list_tab[idx].value = value
            idx += 1
            if idx >= len(cell_list_tab):
                break
        wks.update_cells(cell_list_tab)
    except:
        print "Exception"



GDriveJSON = 'GoogleAuthKey.json'
GSpreadSheet = '試算表檔名'
TYPE = 'Notebook'

rows_item = ['HardwareID', 'UserName', 'Computer', 'Type', 'CPU', 'RAM(MB)', 'Disk(MB)', 'Monitor']
rows_accest = DB_return("SELECT DISTINCT  A.HARDWARE_ID,A.TAG,H.NAME,B.TYPE,H.PROCESSORT,H.MEMORY,S.DISKSIZE,M.CAPTION \
from \
accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
join bios as B \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and A.HARDWARE_ID=B.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and A.TAG not like '%報廢%' \
and A.TAG not like '%出售%' \
and B.TYPE='" + TYPE + "' GROUP BY A.TAG")

GSheet_write(GSpreadSheet,GDriveJSON,rows_item,rows_accest,TYPE)



OCS Inventory 匯出資料到 Google 試算表(依TAG名稱寫入試算表不同分頁)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來(參考資料出處),並依個人需求調整。

如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。

下列程式調整為依電腦設備寫入同算表不同分頁,過濾掉電腦上所安裝不想列出的系統修補軟體。

程式內容:
#coding=utf-8
#-*- coding: utf-8 -*-
import MySQLdb as mysqldb
import sys
import gspread
import string

def DB_return(exec_cmd):
    connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
    with connection:
        cursor = connection.cursor()
        cursor.execute(exec_cmd)
        rows_info = cursor.fetchall()
        return rows_info

def GSheet_write(GSpreadSheet,GDriveJSON,tab_data,data,worksheet_name):
    a_list=[]
    for i, element in enumerate(tab_data):
        a_list.append(tab_data[i])
    a_tup = tuple(a_list)

    start_row = 1
    start_letter = 'A'
    end_len = len(data[0]) - 1
    if end_len > 26:
        len_info = end_len - 26
        len_a='A'
    else:
        len_info = end_len
        len_a=''
    end_letter = string.uppercase[len_info]
    end_letter = len_a+end_letter
    end_row = len(data)
    range = "%s%d:%s%d" % (start_letter, start_row+1 , end_letter, end_row+1)
    range_tab =  "%s%d:%s%d" % (start_letter, start_row , end_letter ,start_row)

    from oauth2client.service_account import ServiceAccountCredentials as SAC
    try:
        scope = ['https://spreadsheets.google.com/feeds']
        key = SAC.from_json_keyfile_name(GDriveJSON, scope)
        gc = gspread.authorize(key)
        workbook = gc.open(GSpreadSheet)
        if worksheet_name in [sheet.title for sheet in workbook.worksheets()]:
          workbook.del_worksheet(workbook.worksheet(worksheet_name))
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
        else:
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
    except Exception as ex:
        print('connect google fail ', ex)
        sys.exit(1)

    cell_list = wks.range(range)

    try:
        idx = 0
        for (start_row , rowlist) in enumerate(data):
            for (colnum, value) in enumerate(rowlist):
                cell_list[idx].value = value
                idx += 1
                if idx >= len(cell_list):
                    break
        wks.update_cells(cell_list)
    except:
        print "Exception"


    cell_list_tab = wks.range(range_tab)

    try:
        idx = 0
        for (start_row , value) in enumerate(a_tup):
            cell_list_tab[idx].value = value
            idx += 1
            if idx >= len(cell_list_tab):
                break
        wks.update_cells(cell_list_tab)
    except:
        print "Exception"



GDriveJSON = 'GoogleAuthKey.json'
GSpreadSheet = '試算表檔名'

rows_item = ['HardwareID', 'UserName', 'Computer', 'CPU', 'RAM(MB)', 'HD_Model', 'HD_Size(MB)', 'Monitor', 'Software']

connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
with connection:
    cursor = connection.cursor()
    cursor.execute("select * from accountinfo where TAG not like '%出售%' and TAG not like '%報廢%'")
    numrows = int(cursor.rowcount)

    for i in range(numrows):
        row = cursor.fetchone()
        GsheetName = row[1]

        reload(sys)
        sys.setdefaultencoding('utf-8')

        rows_accest = DB_return("SELECT DISTINCT \
A.HARDWARE_ID,A.TAG,H.NAME,H.PROCESSORT,H.MEMORY,S.NAME,S.DISKSIZE,M.CAPTION,SF.NAME \
from accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and SF.NAME not like '%Hotfix%' \
and SF.NAME not like '%Update%' \
and SF.NAME not like '%安全性更新%' \
and SF.NAME not like '%更新%' \
and SF.NAME not like '%驅動程式%' \
and A.TAG like '" + GsheetName + "' \
ORDER BY H.NAME")

        GSheet_write(GSpreadSheet,GDriveJSON,rows_item,rows_accest,GsheetName)



2017年9月20日 星期三

OFFICE 表格內的文字消失

微軟9月份的Office軟體更新後會造成表格合併儲存格的文字消失,還沒更新的就先不要更新。

已經安裝的也有解決辦法,將已更新的 KB3213656 或 KB4011039 修正檔移除就可恢復正常了。

2017年8月19日 星期六

OFFICE 365 搭配 Linux BIND DNS 設定

OFFICE 365 DNS網域設定方式(For Linux)

在Zone設定檔裡增加O365 網域 DNS記錄
新增下列DNS記錄:

;o365 SubDomain
$ORIGIN o365.example.com.tw.

;O365用來驗證網域是否歸您所有
o365.example.com.tw. 3600 IN TXT "MS=ms12345678"

增加上面兩列設定就可完成OFFICE 365的網域驗證。

; 將網域的內送郵件傳送到 Office 365 中的 Exchange Online 服務
o365.example.com.tw. 3600 IN MX 5 o365-example-com-tw.mail.protection.outlook.com.

; 防止他人使用您的網域來傳送垃圾郵件或其他惡意電子郵件
o365.example.com.tw. 3600 IN TXT "v=spf1 include:spf.protection.outlook.com -all"

;O365各項服務主機的DNS記錄
;自動導引outlook用戶端與Exchange Online連結
autodiscover.o365.example.com.tw. 3600 IN CNAME autodiscover.outlook.com.

; Lync用戶端會使用它來協助尋找 Lync Online 服務並登入
sip.o365.example.com.tw. 3600 IN CNAME sipdir.online.lync.com.

; Lync 行動用戶端會使用它來協助尋找 Lync Online 服務並登入
lyncdiscover.o365.example.com.tw. 3600 IN CNAME webdir.online.lync.com.

; Office 365 會使用它來將驗證導向正確的身份識別平台
msoid.o365.example.com.tw. 3600 IN CNAME clientconfig.microsoftonline-p.net.

; Office 365 行動裝置管理 (MDM)
enterpriseregistration.o365.example.com.tw. 3600 IN CNAME enterpriseregistration.windows.net.

; Office 365 行動裝置管理 (MDM)
enterpriseenrollment.o365.example.com.tw. 3600 IN CNAME enterpriseenrollment.manage.microsoft.com.

;協調 Lync 用戶端之間的資訊流程
_sip._tls.o365.example.com.tw. 3600 IN SRV 100 1 443 sipdir.online.lync.com.

;藉由啟用 SIP 同盟,讓 Office 365 網域與 Skype 之外的用戶端共用
_sipfederationtls._tcp.o365.example.com.tw. 3600 IN SRV 100 1 5061 sipfed.online.lync.com.

如郵件寄送是使用主網域(example.com.tw)來寄送信件,也需在主網域(example.com.tw)設定上列設定值(注意:網域名需修改為主網域,例: o365.example.com.tw --> example.com.tw)。



2017年7月21日 星期五

iRedMail Server 主機、DB 備份還原


因為發生慘案,先趕快將 iRedMail Server 還原後回想的還原步驟,可能會漏掉還原過程中少數步驟。但有大部份的還原步驟總比沒有好,有機會..................吔!!!!!
希望不會再有機會用到。


安裝時,有可能系統採最小安裝,會缺少某些 compile 工具程式,依提示補上即可。

一、安裝 CentOS 或 Ubuntu、iRedMail
1.安裝 CentOS 或 Ubuntu


2.下載 iRedMail:
請選擇最新版本下載:
https://bitbucket.org/zhb/iredmail/downloads/
tar -xvf iRedMail-x.x.x.tar.bz2
cd iRedMail-x.x.x
bash iRedMail.sh


3.iRedMail 固定的設定畫面,依它的設定步驟提供各項資料設定。
設定過程中要先建立一個 domain(如有多個 Domain 挑一個預設的 Domain)、MySQL 密碼、管理者帳號密碼(帳號預設為:postmaster@domain_name)。


4.安裝 Let’s Encrypt(這篇是講還原,所以沒有安裝後續修改 Apache、nginx 的設定方式)
yum install -y git bc wget


git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt


/opt/letsencrypt/letsencrypt-auto certonly --standalone --email xxx@example.com --agree-tos -d example.com (可利用 -d 加多個Domain)


自動更新 SSL 憑證設定檔:
cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini


編輯自訂設定檔(沒備份到):
vi /usr/local/etc/le-renew-webroot.ini
修改(必須和原來申請SSL KEY填的資料一樣,不然就利用上面的步驟重新申請 SSL):
rsa-key-size = 4096
email = xxxxx@example.com
domains = example1.com, example2.com …………..
webroot-path = /opt/www/    #roundcubemail 安裝目錄


下載 SSL 更新程式:
yum install curl
curl -L -o /usr/local/sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot


手動執行,測試 shell script 更新憑證 :
/usr/local/sbin/le-renew-webroot


加入 Crontab 排程執行憑證更新 :
crontab -e
設定每個禮拜一的凌晨 2:30 (排程自訂)進行一次憑證的檢查及更新
30 2 * * Mon /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log;systemctl restart nginx.service postfix.service dovecot.service
這樣就有了一個半永久的 SSL 憑證


二、還原設定
1.從備份的 etc 資料夾複製  letsencrypt 資料夾到 /etc 下


2.還原 postfix 設定檔:
main.cf(確認 main.cf 裡是否有另外套件的設定資料檔案,如有一併還原)
master.cf


3.還原 dovecot.conf 設定檔(LOG 檔 owner 為:vmail:vmail)


4.還原 nginx.conf、conf.d/default.conf
PS:
連線時出現: 502 bad gateway 有可能是 nginx.conf 裡的
server unix:/var/run/php-fpm.socket 路徑指向錯誤


5.產生新的 DKIM KEY(檔案路徑在 /var/lib/dkim,沒備份到)
amavisd -c /etc/amavisd/amavisd.conf genrsa /var/lib/dkim/example.com.pem 2048
chown amavis:amavis /var/lib/dkim/example.com.pem
chmod 400 /var/lib/dkim/example.com.pem
systemctl restart amavisd


檢查:
amavisd -c /etc/amavisd/amavisd.conf showkeys
amavisd -u amavis -c /etc/amavisd/amavisd.conf debug


記得修改 DNS DKIM 設定。


6.修改 amavisd.conf,增加 Domain (公司有多個網域都要加入,另不要用舊的設定檔,除非版本相同)


7.還原備份的 vmail1 裡的使用者信箱(直接搬移 各個 Domain 資料夾進 /var/vmail/vmail1/)


8.還原 MySQL DB
先解壓縮 iRedMail 備份的 DB:
zip2 -d xxxxxxx

還原 DB:
mysql -uroot -p amavisd < amavisd-2017-07-20-03\:30\:08.sql
mysql -uroot -p iredadmin < iredadmin-2017-07-20-03\:30\:08.sql
mysql -uroot -p iredapd < iredapd-2017-07-20-03\:30\:08.sql
mysql -uroot -p roundcubemail < roundcubemail-2017-07-20-03\:30\:08.sql
mysql -uroot -p vmail < vmail-2017-07-20-03\:30\:08.sql
還回以上的 DB 即可,切勿還原 sql DB

9.觀察 LOG 看是否有錯誤訊息



2017年6月30日 星期五

ownCloud 掛載 Google Drive、DropBox

Google 端設定:
1.要申請 Google API 認證 key 前,Chrome 先登入要申請的 Gmail 帳號

2.申請 Google API key 網址


3.這裡是申請 ownCloud 讀取 Google Drive 的認證 key

選擇啟用 Google Drive API

出現要建立專案的提示

建立專案

專案成功建立後,再選擇啟用 Google Drive API

建立 憑證




要不要下載 JSON 認證檔案都沒關係,可從網頁內查詢得到

完成的畫面

ownCloud 端設定:

出現錯誤訊息頁面:
表示要先加入 Google 的  Allow Risky Access Permissions By Unreviewed Apps 群組

加入群組後,再回到 ownCloud 按<允許存取>重新連結 Google Drive 一次。
重新連結就會出現:

ownCloud 成功加上 Google Drive 後,就可以退出 Allow Risky Access Permissions By Unreviewed Apps 群組了。

DropBox APPS 認證 KEY 網頁:

DropBox 的作法更簡單,目前 ownCloud v10 只支援 OAuth1 認證。

按 Create app 後,就產生一組認證 KEY & 金鑰


DropBox 二個步驟搞定,再到 ownCloud 儲存區掛載 DropBox 空間。

新增 DropBox 儲存區,輸入 APP key 及 金鑰後,按<允許存取>






2017年6月29日 星期四

ownCloud 安裝 OnlyOffice Plug-in


ownCloud 安裝 OnlyOffice Plug-in:
# cd /var/www/owncloud/apps/
# git clone https://github.com/ONLYOFFICE/onlyoffice-owncloud.git onlyoffice
# chown -R www-data:www-data onlyoffice



切換到 owncloud web 設定:

設定 ownCloud OnlyOffice Plug-in 連結 OnlyOffice Document Server:






OCS Inventory 匯出資料到 Google 試算表(依電腦設備類型)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來( 參考資料出處 ),並依個人需求調整。 如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。 下列程式調整SELECT電腦 設備類型 為Noteboo...