关于webssh的实现

webssh的关键点:

  1. 选择websocket协议,http不适合
  2. webssh server端需要能:
    1. select websocket的输入,一旦有输入,就转发到ssh server
    2. select ssh server的输出,一旦有输出,就转发到websocket
    3. 要实现上面两点:
      1. 要么自己实现websocket server,因为:
        1. select websocket的输入是websocket server的事情,而select ssh server 的输出是应用逻辑的事情,无法在同一个select上检查这两个fd的事件
      2. 要么websocket server端语言支持多线程
    4. 对于PHP语言,我们实现自己的websocket server比较麻烦,同时,PHP也不支持多线程,所以PHP实现webssh很难
    5. 对于Python语言,因为Python支持多线程,所以,这事儿就好办,jumpserver里面的webssh就是通过多线程实现的

文件打开之“文本模式”与“二进制模式”

php 中关于 fopen函数的说明中,mode参数没有正式提到二进制模式(b),但是在参数说明的列表下面有关于二进制打开方式的说明,并且提到可以使用”b” 来指定二进制模式,这里的二进制模式和文本模式的差别仅仅在于 \r\n 与 \n 之间的差别,和文件编码没有关系。

python中关于“文本模式”和“二进制模式”的差别则在于文件的编码

spring bean 顺序问题

问题:

配置类中明确定义了DataSource bean,但是在另一个类中Autowired的一个jdbcTemplate怎么都装配失败,调试发现,DataSource Bean定义的太晚了,如果提前到jdbcTemplate定义的那个类中就没问题了

另外的解决办法: 其实我们完全可以在配置类上 :

这样的话,只需要在 application.properties 中定义如下即可:

 

logstash-output-syslog 之 facility定义问题

问题:

当我们在logstash-output-syslog中配置facility为local6的时候,实际上走的是local4;而定义facility为local7的时候,实际上走的是local5,但是,定义为daemon的时候,确实是daemon

原因:

  1. 参考源码: https://github.com/phpor/logstash-output-syslog/blob/master/lib/logstash/outputs/syslog.rb 关于facility的定义有一个数组:

    而rfc中的定义如下: https://tools.ietf.org/html/rfc3164#section-4.1.1



    我们发现,4和10的定义是重复的,9和15的定义是重复的; 而插件源码中把这两个重复的条目就简单去掉了,于是就导致facility-code就对不上了
  2. 解决办法: 把重复的两项补回去就可以了

给容器设置网络

  1. 通过pipework给容器添加、配置、期望网络(这个就不说了)
  2. 如果在不重启容器的情况下,禁用容器的网络,然后在需要的时候在启动呢?
    1. 禁用容器网络: ifdown eth0
    2. 启用容器网络: ifup eth0
  3. 如果容器中没有ifup、ifdown、甚至没有ip命令呢?
    1. 通过nsenter -t pid-of-container -n   (进入容器网络名字空间,但是文件系统还是宿主机的)
    2. 执行ip相关命令:

       

      注意: 这里使用的是ip命令,而不是ifconfig、ifup之类的,因为ip命令不参考本地文件系统中的相关配置,而后者会参考本地文件系统相关网络配置;因为我们需要ip命令,所以使用的是宿主机的文件系统,而不是容器的文件系统,所以在这里设置容器网卡的时候,不能使用ifconfig、ifup之类

    3. 在宿主机上使用ip netns exec 也能达到和使用nsenter相同的效果,但是似乎没有发现一个比较好的办法根据pid找到网络名字空间,所以还是nsenter更方便些

paramiko模块学习

第一步:安装

 

rpmbuild 之 devel

我们见过比较专业一些的软件会包含多个rpm包,如:

phpor.1.0.0.el7.x86_64

phpor-docs.1.0.0.el7.x86_64

phpor-devel.1.0.0.el7.x86_64

phpor-debuginfo.1.0.0.el7.x86_64

那么,一个spec文件如何build出来多个rpm包呢?

首先,我们以devel为例,参考: https://stackoverflow.com/questions/2913130/building-both-devel-and-normal-version-of-a-rpm-package

可见,devel是以子包的形式出现的

示例:

http://kmymoney2.sourceforge.net/phb/rpm-example.html

rpmbuild 安装到BUILDROOT 下面的文件和目录都要打包的rpm包中,否则会报错(rpmbuild会认为你遗忘了),如果不想打包,就提前删掉

rpmbuild 之 /usr/lib/rpm/check-buildroot

rpm打包之前会执行: /usr/lib/rpm/check-buildroot, 其逻辑为,检查将要打包的文件中是否包含buildroot,因为这只是build时候的临时目录,如果出现在打包文件中,就可能会出现问题,起检查方法简单粗暴:

如果包含,就会报类似如下的错误信息,然后退出

关于check-buildroot脚本:

其一:

通过mktemp来创建临时文件,根本不需要自己制造随机文件名

其二:

保证在脚本退出后删除临时文件

其三:

注意,这里 ” || : ” 的用法,保证test为假时脚本退出码为零

xfs bug

 

 

windows 路由之metric

如下图来看, 虽然172.16.22.29存在一条更精确的路由,但是该精确路由的metric比默认路由的metric更大一些,最终还是选择了默认路由,看来metric的影响力还是很大的

添加路由是指定metric参数吧,如下:

明明指定的metric为9,结果却是19(默认网关的metric+9)

 

可以通过网络设置来修改接口的跃点数(metric),最小值为10(设置为更小的值也没有用)

相关参考: http://blog.csdn.net/liqfyiyi/article/details/8788206