分類
Linux 软件

在centos6上裝Synapse

裝了Matrix家的Synapse就可以使用Riot.im聊天了,好處是服務器是自己的,客戶端是開源的。

首先跟着官方文檔,安裝依賴。此時需要注意centos6自帶的sqlite版本太低,而且插件FTS4也未啟用。參考Install Python and Sqlite from Source安裝sqlite和python2.7即可。

#安裝sqlite3.12並開啟FTS4
mkdir -p ~/tmp/compile&&mkdir ~/tmp/opt&&cd ~/tmp/compile
wget https://www.sqlite.org/2016/sqlite-autoconf-3120200.tar.gz
tar xf ./sqlite-autoconf-3120200.tar.gz
cd sqlite-autoconf-3120200
./configure --prefix=~/opt/sqlite/sqlite3 --disable-static --enable-fts5 --enable-json1 CFLAGS="-g -O2 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_RTREE=1"
make
make install
mkdir ~/bin
ln -s ~/opt/sqlite/sqlite3/bin/sqlite3 ~/bin/sqlite
#到這裡就安裝好了,執行sqlite即可看到版本為3.12
#執行pragma compile_options;可見FTS4已開啟
#.quit退出sqlite
#安裝使用sqlite3.12的python2.7
wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
xz -d Python-2.7.14.tar.xz&&tar -xvf Python-2.7.14.tar
cd Python-2.7.14
LD_RUN_PATH=$HOME/opt/sqlite/sqlite3/lib ./configure LDFLAGS="-L$HOME/opt/sqlite/sqlite3/lib" CPPFLAGS="-I $HOME/opt/sqlite/sqlite3/include"
LD_RUN_PATH=$HOME/opt/sqlite/sqlite3/lib make
LD_RUN_PATH=$HOME/opt/sqlite/sqlite3/lib make install

使用virtualenv生成一個Synapse專用的虛擬環境。安裝Synapse時還會遇到Twisted版本過低,在虛擬環境下這樣操作一下:

wget https://twistedmatrix.com/Releases/Twisted/17.1/Twisted-17.1.0.tar.bz2
tar -jxvf Twisted-17.1.0.tar.bz2
cd Twisted-17.1.0
python setup.py install 
cd ..

配置nginx前置代理的時候,用letsencrypt的centbot各種失敗,最後還是用回ssl for free的笨方法。推薦使用letsencrypt的centbot,配好後非常省時省力。順便貼一下nginx配置:

server {
    listen 443 ssl;
    server_name YOURDOMIN;

    ssl_certificate     /etc/letsencrypt/live/YOURDOMIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOURDOMIN/privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location /_matrix {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

由於使用了nginx做代理,所以8008端口的監聽範圍可以在homeserver.yaml中改成127.0.0.1。

最後跟着官方教程增加用戶,然後在Riot.im里勾上自定義服務器就可以聊天了。也可以參考下Run your end-to-end encrypted chat server using Matrix and Riot

如果傳送文件時提示文件大小超過限制,多半是nginx給擋下了,可以在nginx配置文件的http段里添加下面兩行來解決:

    sendfile        on;
    client_max_body_size 40M;

Android我從F-droid下載的客戶端,沒有gcm,所以在後台時檢查消息的頻率可以自行設置,我設置的5分鐘,默認10分鐘。網頁端打開的時候有一點點慢,打開後就沒問題了。Fedora可以安裝taw/Riot的源,即

sudo dnf copr enable taw/Riot 
sudo dnf install -y riot --refresh

Fedora29的包taw還沒打,我們可以自己打:

sudo dnf install npm
git clone https://github.com/vector-im/riot-web.git
cd riot-web
npm install
cp config.sample.json config.json
#修改下面4處
    "default_hs_url": "https://YOURDOMIN",
    "default_is_url": "https://YOURDOMIN",
    "disable_guests": true,
    "features": {
        "feature_groups": "labs",
        "feature_pinning": "labs",
        "feature_rich_quoting": "labs",
        "feature_presence_management": "labs",
        "feature_sticker_messages": "labs",
        "feature_jitsi": "labs",
        "feature_tag_panel": "enable",
        "feature_lazyloading": "enable"
    }
#編譯
npm run build
#編譯獨立APP
npm install electron
#運行APP
npm run electron
#生成可執行文件
node_modules/.bin/build -l --x64
#可執行文件在electron_app/dist/linux-unpacked/

##升級##
cd riot-web
git fetch origin
git reset --hard origin/master
npm install
npm run build
npm install electron
node_modules/.bin/build -l --x64

Synapse搬家

官方文檔並未給出具體備份與還原方法,經過摸索發現非常簡單。如果是按照我上面步驟安裝的,只需再新服務器上搭建好環境,然後複製如下文件到虛擬環境中就可以啟動了。如果文件路徑有變化,則需要修改homeserver.yaml和YOURDOMIN.log.config這兩個配置文件。

homeserver.yaml
YOURDOMIN.log.config   
YOURDOMIN.signing.key  
YOURDOMIN.tls.crt
YOURDOMIN.tls.dh
YOURDOMIN.tls.key
media_store
homeserver.db

Synapse重置用戶密碼

參考:reset password for matrix/synapse accounts

Centos7上裝Synapse

大致一樣啦。sqlite3還是要自己安裝,系統帶的不行。python可以用3了。Twisted要裝17.9.0。

本文更新於 2018/12/26。

分類
說說

17123005

去花蓮。

分類
Linux

Termux Python3.6安裝paramiko

之前寫過一個python腳本通過paramiko使用SSH鏈接越獄後的iPhone執行一些安裝軟件或重啟SpringBoard之類的操作。後來遇到Termux覺得安卓手機也可以試試,不試不知道,一試坑不少,好在最後還是裝好了。

#首先安裝系統的依賴
apt install libffi-dev clang libsodium libsodium-dev openssl-dev libcrypt-dev python-dev
#然後安裝pynacl,直接pip裝會報錯,指定使用系統的sodium庫即可
SODIUM_INSTALL=system
pip install pynacl
#最後再安裝paramiko和python-nmap
pip install paramiko python-nmap

本文更新於 2018/04/04。

分類
相册

17112719

do you prefer alone
分類
說說

17112709

郭:于謙的父親王老爺子是個心地善良的富人,放出話來“別的地方我管不了,我方圓十里內不能有窮人”。然後,他把附近的窮人都趕走了。“我心善,見不了窮人”。

分類
方法

root後的android /system仍然只讀?

前兩天寫了個腳本通過https://freeapi.ipip.net/獲取IP信息,在公司電信網絡沒問題,在家裡有時可以有時不行。對比dns後發現獲得的ip是不同的,於是打算在hosts文件里寫死。安卓的hosts文件在/system/etc/hosts,但是在/etc/hosts也有鏈接,獲取Termux已經在root用戶下,仍然提示文件只讀。搜索後發現我的android6用的可能是system-headless root,也就是/system是已只讀方式掛載的,這樣或許可以保護系統吧。解決辦法在How to edit 'etc/hosts' file?找到:

#for Android 6
su # become the root (don't miss confirmation request!)
mount -o remount,rw /system # allow to write
vi /system/etc/hosts ## edit the file in place - do what you want, then <ESC>:wq ##
mount -o remount,ro /system # get things back to normal
exit # unroot


#for Android 8 with magisk and busybox
su # become the root (don't miss confirmation request!)
busybox mount -o remount,rw /system # allow to write
vi /system/etc/hosts ## edit the file in place - do what you want, then <ESC>:wq ##
busybox mount -o remount,ro /system # get things back to normal
exit # unroot

#for Android 10 
#remount /system may get this error
#mount: '/system' not in /proc/mounts
#just remount the root dir / will be ok

su # become the root (don't miss confirmation request!)
mount -o remount,rw / # allow to write
vi /system/etc/hosts ## edit the file in place - do what you want, then <ESC>:wq ##
mount -o remount,ro /system # get things back to normal
exit # unroot

後來呢,發現有時還時不行,所以不單單是dns的問題。再後來,發現ip-api家的免費接口也很不錯,現在兩個一起用。

本文更新於 2021/07/13。

分類
程序

時間比較




網頁版使用了moment.js。家裡的菲利普電飯鍋的預約功能需要輸入幾個小時後做好飯,而不是幾點幾分做好飯,每次都要扳着指頭數距離明天早上7點還有幾個小時。下面還有一個python版,可以放到termux里跑:

#!/data/data/com.termux/files/usr/bin/python
# -*- coding: utf8 -*-

#時間比較
import sys,datetime

#str轉換成datetime
def strTodaTime(s):
    if len(s)==19:
        return datetime.datetime(int(s[0:4]),int(s[5:7]),int(s[8:10]),
                                      int(s[11:13]),int(s[14:16]),int(s[17:19]))
    else:
        print("格式錯誤,--help查看幫助。")
        
#計算時間
def showTimeDuration(dtStr2='',dtStr1=''):
    if dtStr1 == '':
        datetime1 = datetime.datetime.now()
    else:
        datetime1 = strTodaTime(dtStr1)
    
    if dtStr2 == '':
        date2 = datetime.date.today() + datetime.timedelta(days=1)    
        time2 = datetime.time(7, 0)
        datetime2 = datetime.datetime.combine(date2, time2)
    else:
        datetime2 = strTodaTime(dtStr2)
        
    print(datetime2 - datetime1)

if __name__ == '__main__':
    if len(sys.argv) == 3 :
        showTimeDuration(sys.argv[1],sys.argv[2])
    elif len(sys.argv) == 2 :
        if sys.argv[1]=='--help':
            print('參數1默認是第二天早上七點,如2017-11-16T07:00:00。\n參數2默認是當前時間,格式同參數一。')
        else:
            showTimeDuration(sys.argv[1])
    else:
        showTimeDuration()