postgresql查询当天内所有数据/指定日期所有数据 unix timestamp转换相关

版权声明

由于数据库中所有日期数据我存储是utc时间(unix timestamp with timezone),而用户大部分为非UTC时区用户,所以查询当天所有数据,指定日期所有数据少有些许繁琐。

查询当日内所有数据:

def check_order():
    sql = """
    SELECT * FROM table_name
WHERE 
(DATE_PART('day', (order_date::TIMESTAMP AT TIME ZONE 'Asia/Tokyo') 
- 
(now()::TIMESTAMP AT TIME ZONE 'Asia/Tokyo')) = 0 )
;
    """ 
    data = pgsql.selectAll(sql)
    return data

查询指定日期所有数据:

def check_order(date):
    sql = """
    SELECT * FROM table_name
WHERE 
(DATE_PART('day', (order_date::TIMESTAMP AT TIME ZONE 'Asia/Tokyo') 
- 
('%s'::DATE AT TIME ZONE 'Asia/Tokyo')) = 0 )
;
    """ % date 
    data = pgsql.selectAll(sql)
    return data

返回的date也是utc时间,如果需要显示指定时区时间可以:

SELECT xxx,xxxx,order_date AT TIME ZONE 'Asia/Tokyo' FROM table_name

关于flask-xcaptcha的神奇bug

今天在写🐎的时候发现,如果是下面这个结构:

<table>
   <form action="{{ url_for('test') }}" method="POST">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
        {{ xcaptcha }}️️
        <button type="submit" class="btn btn-primary">Submit</button>
    </form> 
</table>

把form套在table里面会导致xcaptcha.verify = False
具体发病原因没仔细研究,做个记录。

 

Asterisk+GOIP 将SIM卡转为SIP

版权声明

起因:
在几年前我买了个北京铁通商务通的无线座机,类似于小灵通,必须处于北京移动覆盖范围内才可以使用。但是最近几年不在北京租房子了,出了北京就没有信号。
所以,我想找个朋友,把机器扔到朋友家,可是也不能老麻烦人家帮忙接电话啊。。。所以,我在想有啥办法能把SIM卡转成VOIP,只要机器放在北京,插上电就不用管了,登陆VOIP账号就能在任何地点接打电话。

之后我就看到有个硬件设备叫做GOIP,可以把SIM卡转为VOIP客户端。

当然,我也看到了其他人树莓派+USB卡托的教程(https://steemit.com/cn/@ety001/5zehat),但是我觉得还是买现成的设备比较稳定。

我主要参考了以下文章:
https://joybean.org/2018/05/30/iphone-multi-card-multi-standby-schema-solution-voip-and-goip
https://github.com/tangaza/Tangaza/wiki/Connecting-a-GoIP-GSM-VoIP-gateway-to-an-Asterisk-AGI

我的Asterisk采用VPS,系统是Ubuntu 18.04,Asterisk直接apt install安装好。
安装好后只需要修改两个文件。配置文件的具体变量可以参考:
https://github.com/asterisk/asterisk/blob/master/configs/samples/sip.conf.sample
https://github.com/asterisk/asterisk/blob/master/configs/samples/extensions.conf.sample
https://www.cnblogs.com/Loadhao/p/6835331.html
https://blog.csdn.net/u013132673/article/details/52571371
https://jyqc688.iteye.com/blog/2277289
https://www.cnblogs.com/lr393993507/p/5309913.html
https://www.voip-info.org/asterisk-config-sipconf/
https://www.voip-info.org/asterisk-config-extensionsconf/

/etc/asterisk/sip.conf
在general修改以下内容:
增加:
bindport=5060
bindaddr=0.0.0.0
修改:
context=default
tcpenable=yes
allowoverlap=yes ;用于支持接通后输入卡号密码之类的。

allowguest=yes
dtmfmode=rfc2833
videosupport=yes
disallow=all
allow=ulaw
allow=alaw
allow=g729
allow=h263
allow=h263p
allow=h264
allow=gsm
qualify=yes

在文件末尾增加以下内容
[goip] ;goip设备账户参数,请自行设定password
canreinvite=no
context=incoming
dtmfmode=rfc2833
fromuser=goip
host=dynamic
disallow=all
allow=ulaw
allow=alaw
allow=g729
insecure=port,invite
secret=password
defaultname=goip
nat=yes ;设备如果在防火墙或者其他设备后面需要增加nat=yes。
qualify=yes
type=friend
[username];用户账户参数,请自行设定user和password
type=friend
context=outcoming
callerid = user
secret = password
host = dynamic
canreinvite = no
dtmfmode = rfc2833
mailbox = user
disallow = all
allow = ulaw
transport = udp
qualify=yes
nat=yes

/etc/asterisk/extensions.conf
在general部分后增加以下内容:

[incoming] ;我这个案例。。。是闲的蛋疼做了个语音菜单,哈哈哈~
exten => 6666,1,Answer() ;6666是GoIP>配置>呼入管理>转移号码中填写的数字,VOIP服务器监听6666这个号码进行应答。
exten => 6666,2,Wait(3)
exten => 6666,3,Playback(/var/lib/asterisk/sounds/1) ;录音文件必须是gsm格式,要提前放在/var/lib/asterisk/sounds/,把文件chown改成asterisk:asterisk
exten => 6666,4,Playback(/var/lib/asterisk/sounds/2)
exten => 6666,5,Dial(SIP/USER,30,r) ;USER填写你上面sip.conf设定的用户名,呼叫30秒若无应答放弃接通,r作为第3个参量,在通知被叫通道有来电的这段时间内,主叫方会听到振铃声音。
exten => 6666,6,Hangup()

[outcoming]
exten => _0.,1,Dial(SIP/${EXTEN:1}@goip,30,r);拨出号码前加0可以通过goip呼出,例如010010,就是呼叫10010,例如0+85212345678,就是呼叫国际区号为+852号码为12345678。
exten => goip,1,Dial(SIP/goip,30,r)
exten => nby,1,Dial(SIP/USER,30,r)

[default]
exten => goip,1,Answer()
exten => goip,n,Dial(SIP/goip,30,r)
exten => goip,n,Hangup
exten => USER,1,Answer()
exten => USER,n,Dial(SIP/USER,30,r)
exten => USER,n,Hangup

除此之外,记得fail2ban也要增加Asterisk的防护规则:
http://www.fail2ban.org/wiki/index.php/Asterisk
https://cyphercodes.github.io/2018/04/08/Secure-Asterisk-13-with-Fail2ban-on-Ubuntu-16-04/

Centos7 Firewalld 端口转发

最近客户老爷们吵着要国内中转的shadowsocks服务,我用的防火墙是centos7自带的firewalld,搜了搜没有配置端口转发的教程,那我就来写一下吧。
起初我以为阿里云阉割了SNAT转发,不允许客户在机器上配置端口转发,但是实际测试是可以的。为此我发工单肛了一遍阿里云的售后。
本文使用的操作系统是centos7,防火墙为默认的firewalld。
决定你端口转发是否能成功的最重要一点是你得打开防火墙伪装IP的功能,这就是SNAT。
[sourcecode language=”plain”]
firewall-cmd –query-masquerade # 检查是否允许伪装IP
firewall-cmd –add-masquerade # 允许防火墙伪装IP

firewall-cmd –zone=区域 –add-masquerade
firewall-cmd –remove-masquerade# 禁止防火墙伪装IP
[/sourcecode]
不打开SNAT会怎么样呢?我们的跳板机就相当于下图的网关服务器。

如上图,网关之上没有经过SNAT处理,那么请求过后的回复数据包就不能在互联网中找到这个私网IP地址,所以用户也就不能顺利取得想要的资源了。
下图打开SNAT之后,使用了SNAT源地址转换技术,服务器应答后先由网关服务器接收,再分发给内网的用户主机,从而使得用户顺利的拿到了所需资源。

下面是端口转发的命令
[sourcecode language=”plain”]

firewall-cmd –add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
firewall-cmd –add-forward-port=port=80:proto=tcp:toaddr=192.168.1.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd –add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd –list-all #查询所有配置
[/sourcecode]
参考了以下内容:

第8章 Iptables与Firewalld防火墙。


https://fedoraproject.org/wiki/FirewallD/zh-cn#.E7.AB.AF.E5.8F.A3.E8.BD.AC.E5.8F.91
http://www.qingpingshan.com/m/view.php?aid=165196
https://havee.me/linux/2015-01/using-firewalls-on-centos-7.html
https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

Centos7 安装MySQL5.6 php5.6 nginx1.10 邮件服务 以及vhost脚本

这个脚本主要是我用来一键配置服务器用的。

主要包括nginx1.10 php5.6 mysql5.6 postfix opendkim。

以及dropbox备份,虚拟主机添加脚本。

可以自动配置满分的邮件服务器,DNS那块请参考别的教程配置一下,dkim的TXT记录在/root/’yourhostname’-dkim-signature_default.txt,用之前修改hostname,rDNS也要修改。

linode vultr 应该都是粘贴上就能直接用的。

nginx配置在/etc/nginx

php.ini在/etc下

php-fpm也在/etc下

有问题可留言咨询。

閱讀全文 Centos7 安装MySQL5.6 php5.6 nginx1.10 邮件服务 以及vhost脚本

写给在帝都想快速增驾摩托本的老司机们的指南 北京 增驾摩托 增驾D

起初啊,我也对骑摩托没啥兴趣,可是在帝都的各位老司机们想必都见过当你开着车堵在三环上,一辆辆摩托车快速从你车边擦肩而过,这种爽快感,正是常年经受拥堵的老司机们心中所向往的。 閱讀全文 写给在帝都想快速增驾摩托本的老司机们的指南 北京 增驾摩托 增驾D

Arduino UNO,Leonardo,Pro Micro,Nano 测试nRF24L01(SI24R01)方法

买了10个SI24R01,想做点好玩的用,但是怕用的时候才发现模块有问题,于是到处找测试方法,看了看论坛的帖子,挨个试了一次都测试不通,于是通过Google找到了一个可以在Arduino UNO,Leonardo,Pro Micro,Nano测试的方法。 閱讀全文 Arduino UNO,Leonardo,Pro Micro,Nano 测试nRF24L01(SI24R01)方法

CentOS7 服务器文件双向同步方案

主要参考了http://maxsum.me/archives/65/这篇文章
感谢这篇文章的作者
另外还需要感谢同事亮哥 解答了我很多的问题 这个脚本也是在亮哥指点下完成的
众所周知,由于CentOS7改了很多东西,有许多东西更蛋疼了。。。
找了很多文件同步的方案,最终确定使用了Unison+inotify-tools。
Unison是一套双向同步软件,可以实现跨平台的双向同步,但是不带文件修改检测。
inotify 是 Linux 自带的一套监控文件变化的工具,配合 Unison 使用,可以实现实时同步。
不多啰嗦,我就直接给自动化部署脚本了。 閱讀全文 CentOS7 服务器文件双向同步方案