假如父亲不曾保护我

送好父亲最后一程,大妹回云南,小妹回广东,偌大的一座屋子里就剩下我、大哥一家子和老妈,一下子静了下来。

多呆了两天,我也得回厦门上班,因为自己的车子先送小孩回去上课,大哥说叫个车子,我倒是觉得没必要,乘坐中巴车也方便。自己一向认为可节约的钱没必要花,反正自己也不赶时间,这其实跟父亲一样,他也持有同样的看法和理念。

破旧的中巴车载着自己,顺着自己再熟悉不过的路,先经过镇上,再开往青苑、科名,然后再下了一段十来公里的盘山公路,就到了湖头,记得长坑到湖头是29公里,却要开一个来小时。看着车窗外青山绿树,许是太久没乘坐过从长坑出发的班车,思绪一下子回到了二十八年前。

那年夏天,父亲带我乘坐大巴车到县城读高中,那是我人生中第二次坐上机动车,第一次是老师带我们到一中参加一个比赛。那个时候自己还小,个头也才一米四九,老妈一直担心我生活上的一些问题,比如不会洗衣服叠衣服,其实这些都是小事情,需要自己动手的时候,很快就掌握了。

那个时候的父亲比现在的我多了几岁,想来自己现在或许也会跟那个时候的父亲有差不多的想法吧。我记得父亲把我安顿好之后,为了避免在县城住下要花钱,得在当天下午赶回长坑,然后我就跟着父亲顺着一中宿舍边上那条路一直往车站的方向走,走到路口邮电局那边,他担心我回去迷路,就叫我回宿舍。看着父亲远去的背影,我想我那时是有些彷徨的,不知接下去会怎么样,不过父亲对我有期待,希望我能好好学习,我是知道的。

只是自那以后,我跟父母兄妹呆在一起的时间就越来越少了。到现在算起来,自己在外面的时间都快两倍于呆在父母身边的时间了。

记忆里,即使我还在读初中的时候,我的想法经常会跟父亲有冲突,直至前些年他和老妈来帮我带小孩,有一次和父亲因为想法不同导致冲突,父亲怒冲冲跑回家,把老妈也带回去,我们夫妻二人只好自己带小孩,现在想来,真是不该!只不过反过来想想,这其实跟我小时受父亲影响太深有撇不开的关系,我有时脾气暴躁,会动手打小孩,又比如为人比较正直,尽量与人为善,其实都是受父亲影响,因为父亲就是这么一个人。

也许冥冥之中有天意,我十几年来未曾在国庆放假回老家,去年因为疫情之故,大人小孩一起回去跟父母住了几天,看得出只要我们回家,父亲总是很高兴,还在路上就频频打电话问到了哪里。

也不知咋回事,近一年来有一段时间总是喜欢插上耳机循环播放《酒干倘卖无》,假如父亲不曾保护我,我的命运将会是什么?

车窗外青山依旧,只是那时坐在自己身边的父亲,现在却撇下我走了,不管我了!

VLAN单线复用

家里的弱电箱就在电视机柜旁边,当初装修布置了一条从弱电箱到书柜边上的网线。在调整之前,光猫放在弱电箱里,改成桥接,上网拨号由路由器负责(路由器是AC88U,路由功能比光猫强太多了),路由器就放在电视机旁边。

这样放也没什么问题,以下就是之前的网络路线。

  • 路由 – 网线 – 书房交换机 – NAS和台式机;
  • 路由 – 网线(书柜边上) – 指纹锁网关(指纹锁网关要是放到路由器旁边网线接入,跟指纹锁的通讯经常掉线);
  • 路由 – 网线 – 播放器(播放局域网内的视频)
  • 路由 – 无线 – 手机、平板、笔记本、米家网关、各类传感器、博联控制器和博联插座等。

直到有一天,家里的臭小宝把路由器的一根天线给掰断掉,我觉得路由器放在他能接触到的地方总归不安全,就想着把路由器移到别的地方。

但是家里只有书柜那边和书房有网线直通弱电箱,其他地方都被我拔掉了,一段时间觉得无线都可以用,没必要留网线,但是电源接口太紧缺,就把卧室里的网线全部都改造成电源插座了。

放在书柜上是个好选择,一来臭小宝根本摸不到,而来位置不错,无线覆盖也挺好的。问题就在于我只拉了一条网线,怎么让路由器拨号又把网络送回弱电箱呢?

网络搜索了下,知道有个做法叫单线复用,需要有个支持VLAN的交换机和路由器配合,马上京东下单了一个水星SG105 PRO,到货之后,开始动手进行路由器和网关的设置。

先设置交换器,其中端口5聚合加T(注意端口号并不一定和端口标注的数字对应)。

再SSH登录路由器,先查看路由器WAN口的端口号.

robocfg show

执行的结果(这是做好的设置)。

我的路由器WAN是端口4,那就设置端口4加T。

robocfg vlans reset vlan 1 ports "0 1 2 3 4t 5 7 8t" vlan 2 ports "4t 8u"

按照下图把线接好,一切OK,路由器可以上网,通过弱电箱的交换机也可以上网。

测试成功后,因为以上路由器的设置在重新开机后会丢失,必须把上述路由器的设置写入jffs/scripts/services-start,开机启动。

弄好之后,把路由器放到书柜上,就好啦。

HA设置警戒

原来是通过米家设置警戒,也就是从23点到早上6点,要是外门打开,网关就发出狗叫的声音,不过存在一个问题,假如我出差很晚才回到家又忘记关掉警戒,自己一打开外门,大声的狗叫会把家里人吵醒。

因为我经常通过HOME ASSISTANT看看家里的动态,比如门有没有关好之类的,想到HA也有调用网关狗叫的功能,要是通过HA设置网关警戒,那出差的时候就不太会忘记关掉这个警戒功能,而且HA是网页打开,速度快,比起米家应用,方便很多。

先设置警戒开启和结束的时间,在HA的CONFIGURATION里添加以下信息。

input_datetime:
  dog_bark_starts_at:
    name: Input with only time
    has_date: false
    has_time: true
  dog_bark_ends_at:
    name: Input with only time
    has_date: false
    has_time: true

然后增加以下AUTOMATION,要关闭的时候直接在页面上关闭即可。

############################
#外门若在定义的时间内打开,狗叫。
############################
  - alias: dog barks when outdoor opened
    trigger:
      platform: state
      entity_id: binary_sensor.door_window_sensor_158d00027af45c
      from: 'off'
      to: 'on'
    condition:
      - condition: template
        value_template: "{{(states('sensor.time') > (states.input_datetime.dog_bark_starts_at.state[0:5])) and (states('sensor.time') < (states.input_datetime.dog_bark_ends_at.state[0:5]))}}"
    action:
      service: xiaomi_aqara.play_ringtone
      data:
        gw_mac: 7c49eb1d173c
        ringtone_id: 8
        ringtone_vol: 100

NEXTCLOUD设置fail2ban

先建立nextcloud的log文件

sudo touch /var/log/nextcloud.log
sudo chown www-data:www-data /var/log/nextcloud.log

在nextcloud安装目录下设置log(/config/config.php,直接添加在这一行下面under ‘installed’ => true。

"log_type" => "file",
"logfile" => "/var/log/nextcloud.log",
"loglevel" => "3",

其中Loglevel设置成3即可。

设立filter

vim /etc/fail2ban/filter.d/nextcloud.conf

把以下内容放入其中

[Definition]
failregex = ^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)".*}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":".*","app":".*","method":".*","url":".*","message":"Login failed: .* \(Remote IP: <HOST>\).*}$
ignoreregex =

 

最后i设置jail

vim /etc/fail2ban/jail.d/nextcloud.local

把以下内容放入其中

[nextcloud]
enabled = true
port = http,https,3443
filter = nextcloud
logpath = /var/log/nextcloud.log
maxretry = 1

查看实际的效果

sudo fail2ban-client status nextcloud

假如有IP被禁止,需要解禁,则运行以下命令

fail2ban-client set nextcloud unbanip 110.xx.xx.xx

 

ufw导致天猫精灵无法工作

原来是通过路由器做端口映射,这样就可以从其他地方访问家里的home assistant和nas,昨天想到干脆把那台一直开机的Ubuntu机器直接DMZ到外网,然后设置UFW和fail2ban,没想到原来好好的天猫精灵就此出了问题。

在端口映射的情况下,天猫精灵通过oAuth2验证访问家里的home assistant,就可以实现语音控制家里的电器;在DMZ+主机ufw+fail2ban的情况下,天猫精灵死活没办法通过oAuth2验证。

真是奇怪得很,映射下的端口我通过ufw全部开放,没有任何差别,怎么会有这个问题,会不会是ufw有什么问题?

试了另外一个防火墙csf,也是存在同样的问题,开启csf之后精灵oAuth2就没法工作。再仔细想了想,可能是因为home assistant是通过容器安装(docker),docker完全honor宿主机的防火墙策略,导致oAuth2没法工作。

于是开启home assistant的debug模式,再次测试精灵,日志显示http/https有问题,想到我并没有开启80/443的端口(开了也没法外部访问,电信根本就不开这两个端口),于是就让ufw开启80/443试试看,没想到一打开这两个端口,oAuth2就开始工作了。

自动更新华硕路由器的证书

给路由器申请了letsencrypt证书,但是由于更新证书是在vps上完成的,而路由器没有安装rsync(我一直采用rsync同步),所以没法把vps上的证书自动同步到路由器上,只能定期手动上传,很是麻烦。

今天突然想把这个事情给解决下,上网找了一下,发现还有另外一个命令scp能达到同样的目的,就在vps上设置了以下命令,把更新后的证书同步到家里的惠普笔记本上。

20 0 1 * * sh /etc/cron.weekly/rsync_letsencrypt_xxxxx_update.sh

然后从惠普笔记本把相应的文件同步到路由器上。

scp -P XXXX -i /XXXXX-rsync-key -r /etc/letsencrypt/rsa/XXXXXXXX/* XXXXXX@192.168.2.1:/jffs/.cert/

建立cron。

25 0 1 * * sh /etc/cron.weekly/rsync_letsencrypt_asus_update.sh

再把相应的文件改名。

cd /jffs/.cert/
rm -rf cert.pem
rm -rf key.pem
mv xxxxx.cer cert.pem
mv xxxxx.key key.pem

这样,每天定期重启路由后,就是最新的证书了。

自动同步vps和家里nas的文件

之前都是把vps上的备份文件使用rclone同步到google drive,想想google drive毕竟要花钱,一直想找个办法把这些备份文件同步到家里的电脑或者nas上(我把一个wd my cloud当nas用)。

因为查找这个nas在wifi环境下传输速度慢的原因,让我知道mycloud居然可以通过ssh连接,也就知道mycloud用的是Linux,那就好办了。

路由器上已经有公网ip并且设置好ddns,第一步就在路由器上设置好端口映射,这样就可远程通过ssh或者winscp或者ftp连上家里这个mycloud。

然后设置mycloud禁止root使用密码登陆,只允许密钥登录,保证安全。

最后在境外的vps上添加rsync脚本。

rsync -avz -e "ssh -o port=xxxx -i /root/.ssh/xxxx /data/backup/* root@xxxxxxx.cn:/nfs/hseih/

设置cron,每天20点2分执行同步命令,把vps上的备份文件传输到家里的mycloud,命令如下

2 20 * * * sh /etc/cron.weekly/rsync_backup_mycloud.sh

这样就不用担心vps上空间不足只能保存30天的备份文件,也不用把文件同步到google drive,节省费用。

不经意的错误导致热水器无法开启

我总是把各种软件升级到最新版,前天把HA升级到0.84.6后,昨天回去发现热水器没有按照预设的时间开启关闭,很是奇怪,除了升级之外,我没有做任何的其他调整。

以为input_boolean有什么变化,就一直想在这个方面找原因,搞来搞去,一点效果都没有。

由于纯属业余爱好,当初是怎么把这个开关接入到HA里的,由于没有记录,一下子也想不起来,翻看了配置里的几个文件,才理清了这个热水器开关自动化的思路,发现了问题所在。

由于是用了米家AQARA空调伴侣当作开关,HA并无原生的组件来控制这个开关,因此,第一步我使用了shell_command来打开关闭这个开关。

shell_command:
heater_on: /usr/local/bin/miiocli device --ip 192.168.2.35 --token 203dca9dfd709524ab7d6fd22f026257 raw_command toggle_plug '["on"]'
heater_off: /usr/local/bin/miiocli device --ip 192.168.2.35 --token 203dca9dfd709524ab7d6fd22f026257 raw_command toggle_plug '["off"]'

再来建立一个input_boolean。

heaternew:
name: heaternew
# initial: on
icon: mdi:ceiling-light

之后建立一个automation,在input_boolean划到on时,执行shell_command的heater_on;划到off时,执行heat_off。

#################
#热水器
#################
- alias: Turn on Heater
initial_state: true
trigger:
- platform: state
entity_id: input_boolean.heaternew
to: 'on'
action:
- service: shell_command.heater_on

- alias: Turn off Heater
initial_state: true
trigger:
- platform: state
entity_id: input_boolean.heaternew
to: 'off'
action:
- service: shell_command.heater_off

以上就实现了将米家空调伴侣作为电源开关使用的意图,最后按照实际需要设定开启关闭就简单了。

既然执行input_boolean无法开关电源,那就从检查shell_command开始,在service里调用这个开关的命令,一点问题也没有。那就检查第二步,好了,问题就在这个步骤里,这个automation的初始化状态居然是关闭的,怪不得我怎么操作input_boolean都没有效果,也不知道为什么之前都好好的,这次所有的automation在重新启动后,初始状态全部变为off。

既然如此,那就在automation里添加initial状态为on。

initial_state: true

重新启动ha,打开关闭热水器电源就没问题了。