http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/149401

Vagrant Docker Dokku

By Yao Chunlin · 星期六 2013年8月10日

经常用到virtualbox 可以使用vagrant把做好的虚拟机大包,这样可以在团队共享,也可以通过定制的命令丛一个模版生成多个虚拟机给不同的工程用。

docker可以很快的创建linux的容器,用来提供SaaS比较好,可以做一个提供PostgresSQL的,做一个提供CouchDB的

dokku在docker上面建立了一个类似heroku的PaaS平台,开发使用比较方便,有了它之后可以直接开发程序,git push 一下就发布了。只不过网速慢的时候每次发布都要下载依赖的组件。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/147401

QQ邮箱的IMAP实现SEARCH命令有BUG

By Yao Chunlin · 星期二 2013年2月19日

IMAP协议要求SEARCH在处理多个条件的时候是AND关系,但是QQ的实现是OR关系。国内的这些产品想要找到开发团队报告问题真不简单。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/144401

swank-cdt connection refused

By Yao Chunlin · 星期六 2012年4月7日

My swank-cdt respond connection refused.After few hours of debug, I wrote a small application in java.Found that the debugger try to use ipv6 address. Then add my hostname after 127.0.0.1, This problems resolved.

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/142401

大陆互联网的2012

By Yao Chunlin · 星期四 2011年9月15日

今年以来,网络上传闻中国要对境外网站实行白名单制度。如果真到了那一天我们应该怎样使用互联网呢。也许应该研究MESH网络和大气中的激光通信技术了。网民们可以自己动手学学在非洲农村组建网络的技术。MESH网络必须要参加的节点达到一定的数量才能起作用。激光通信比无线MESH实现的难度高一点。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/141401

十年前的911之夜

By Yao Chunlin · 星期日 2011年9月11日

十年前,我在HF公路的工地上,住在HF的一栋破房子里。每天工地上的活干完了之后就在这里休息,学习学习计算机,工地比较偏僻,周围黑灯瞎火也无处可去。我不喜欢工地,从学校毕业后在工地上呆了没有多久我就想我不能一辈子干这个。我想要从事我感兴趣的计算机。前一年考过了MCSE,01年还没有下一步的奋斗目标。911那天晚上,我和往常一样上网看看,那时候还是用的56k的猫拨号上网。记得逛到新浪的时候,首页上有一篇新闻的标题写的是一架飞机撞上了世贸中心。当时我都没有点进去看。我想美国私人飞机多就是不好,不知道哪个傻逼撞到世贸中心上了,我看了写文章,又到别的网站上去看了看。过了一会儿回到新浪是看到有另一架飞机也撞上了世贸中心。我感觉有点不对劲儿,没有这么巧的事。把这两篇新闻都点开看了,觉得事态比较严重,我记得我那晚睡得比较晚,一直在新浪上跟踪事态的发展。但是美国离我比较远,没有什么深刻的体会,我记忆最深刻的就是废墟好大。

十年时间过的真快,后来我所在的公司改制,我又考了些计算机的证书,跳槽从事计算机。出国深造,回国成家以及当上父亲。十年中经历了人生的低谷,也有向着目标前进和奋斗的乐趣。也许这是我人生中变化最大的十年。

今夜借911十周年之际,我也顺便回忆了这十年来我的经历。百感交集。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/140401

给中控SC203添加类似httppush的功能

By Yao Chunlin · 星期五 2011年9月9日

中控的门禁系统有httppush的功能,不过要购买带这种功能的门禁机器,而且要购买httppush的sdk。我们的SC203没有这样的功能,不过既然我已经可以给SC203写程序了,可以自己实现类似的功能。 首先写一个sleep程序,可以睡眠3秒钟,这样可以控制每3秒判断有没有新的刷卡记录,有就上传。

# sleep.S
# this program sleep 3 seconds
# To compile this program type:
# > mipsel-generic-linux-gnu-gcc -nostdlib -march=mips32 -mtune=mips32 -I target/usr/include -o sleep sleep.S
# Tested on zksoftware.com SC203 controller

#include <asm/unistd.h>     // ...for system serivices          
        .comm ts,8,4  #time_spec ts
        .text                   # begin code segment
        .globl      __start         # for gcc/ld linking
        .ent        __start         # for gdb debugging info.
__start:        
        .set        noreorder       # disable instruction reordering
        .cpload     $t9         # PIC ABI crap (function prologue)
        .set        reorder         # re-enable instruction reordering
        la      $a0,ts          # load ts
        li      $v1,3       #sleep three seconds 
        sw      $v1,0($a0)
        sw      $zero,4($a0)
        move        $a1,$zero
        li      $v0,__NR_nanosleep      # specify system nanosleep service
        syscall                 # call the kernel
        move        $a0,$zero       # load return code
        li      $v0,__NR_exit       # call exit(0)
        syscall
        .end        __start         # for gdb debugging info.

这个sleep程序有什么用呢?请看请看下面这段代码

#!/bin/sh
DEST=/mnt/mtdblock
old=""

while :;
do
        new=`ls -l $DEST/extlog.dat`
        if [ "$old" != "$new" ] ; then
                old="$new"
                ftpput  -u nobody -p xxxxx 192.168.1.1 /extlog.dat  $DEST/extlog.dat
        fi
        /mnt/mtdblock/sleep
done

这样就是一个ftppush了,只要extlog.dat文件的大小发生改变就会通过ftp上传整个记录。只要记录到了服务器上,想怎么处理都可以了。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/139401

中控(zksoftware.com) SC203门禁的Hello World程序

By Yao Chunlin · 星期四 2011年9月8日

最近装了中控的门禁系统,型号是SC203。这个门禁机用的是MIPS的CPU,有16M内存,系统是嵌入式的Linux,内核版本2.4.20,glibc-2.3.2,使用GCC3.2.3编译。根据GPL他应该提供系统的Source给我们,所有链接到GPL部分的Source。但是这家公司没有提供。网上也看到有老外在索要源代码,不过厂商不理他。

手头上虽然有mips的交叉编译器,可是不是对应这么老的内核和C库的。今天想了一下还是可以给它编写不使用glibc,直接调用系统服务的程序的。先用汇编试验了一下,正好复习一下。

# hello.S

# To compile this program type:
# > mipsel-generic-linux-gnu-gcc -nostdlib -march=mips32 -mtune=mips32 -I target/usr/include -o hello hello.S
# Tested on zksoftware.com SC203 controller

#include <asm/unistd.h>

        .rdata                  # begin read-only data segment
        .align 2
hello:      .asciz      "Hello, world!\n"   # a null terminated string
        length =    . - hello       # length = IC - (hello-addr)
        .align 4
        .text                   # begin code segment
        .globl      __start         # for gcc/ld linking
        .ent        __start         # for gdb debugging info.
__start:        
        .set        noreorder       # disable instruction reordering
        .cpload     $t9         # PIC ABI crap (function prologue)
        .set        reorder         # re-enable instruction reordering
        li      $a0,1           # load stdout fd
        la      $a1,hello       # load string address
        li      $a2,length      # load string length
        li      $v0,__NR_write      # specify system write service
        syscall                 # call the kernel (write string)
        move        $a0,$zero       # load return code
        li      $v0,__NR_exit       # call exit(0)
        syscall
        .end        __start         # for gdb debugging info.

这个程序打印HelloWorld,看似简单,也花费了不少时间。一开始提示指令错误,原因是默认编译的是mips1的目标码,指定march=mips32后解决,后来又提示"Bus Error",原因是没有加.cpload $t9。关于.cpload的作用可以查看linux-mips.org

如果写个程序自动监视extlog.dat文件,有变化的时候把最新的信息发送到我的服务器,就可以把门禁机和我的系统整合。目前中控提供的SDK主要针对的Windows,不适合我们的开发。 如果要构筑完整的开发环境的话需要参考以下链接,另外还剩中控的main程序和相关的几个库的源代码没有。如果只是要追加一些功能的话,没有也没关系。比如写一个小的webserver放到门禁机上运行。

http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/138401

racoon sherw vpn client 注意点

VPN
By Yao Chunlin · 星期二 2011年8月23日
  • 在Ubuntu 上使用sherw vpn client的时候如果选择了使用tap接口,必须把rp_filter设置为0,不然不能正常传输。
  • sherw vpn client 的nat-t选项的force-rfc会导致不能传输,如果要force的话,在racoon上面设置。
  • racoon作为road warrior客户的时候,如果不使用xauth,只是用pre_shared_key的话不会正常发送MODE_CFG包,得不到IP,也不会调用phase1_up
  • racoon作为服务器的花两个用户从同一个nat后面能同时连上,但是一个会无法通信。
    Linux内核不支持,FreeBSD支持,在pfSense上面测试成功。注意pfSense的generate_policy要配置成unique.
http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/136401

Invalid MIT-MAGIC-COOKIE-1 keyxhost problem

By Yao Chunlin · 星期日 2011年8月14日

最近升级到了ubuntu 11.04发现原来的关闭LCD的功能不好用了。 手工执行 /etc/acpi/screenblank.sh可以关闭显示,但是按快捷键没有用,修改/usr/share/acpi-support/screenblank使用 logger `xset dpms force off 2>&1`发现了标题中的错误。这个错误应该是无权链接到Xserver,把命令改成下面的样子修好了。

su $user -c "xset dpms force off"
http://chart.apis.google.com/chart?cht=qr&chs=74x74&chl=http://yao-blog.appspot.com/qr/135401

TeamViewer Alternative solution

VNC
By Yao Chunlin · 星期三 2011年8月10日

TeamViewer的替代方案

使用TeamViewer也有一年多时间了,一直用它帮助别人解决电脑问题。可能因为我同时打开的目标机器太多了,被Teamviewer认为疑似商用环境,现在每次使用只能几分钟,非常不方便。看了一下官网价格4659元。太贵了。我以前也用过一些远程控制方案,最早用NetMeeting,后来用过VNC之类的,当然远程桌面也用过。QQ的远程控制我是不会用的,因为我的机器没有QQ。这些方案有一个问题,如果对方在内网可能不好用,即使在公网,使用还是不够傻瓜化。远程桌面使用时对方还看不到桌面。曾经用过一段时间TTVNC。但是走别人的服务器总是不放心。昨天想了一个解决方案:用SSH的端口转发解决内网访问的问题,同时SSH提供加密,解决VNC不够安全的问题。使用TightVNC作为控制工具,用VBScript来达到自动化,即使被远程支持的用户不会设置也没有关系。

花了一天时间写了一些代码,做成了比较原始的远程管理工具。

  • 在SSH服务器上创建一个support用户。SSH服务器比较好架设,如果你用的OpenWRT或者pfSense之类的,可以直接在路由器上架设,我是用的我的VPS重新开了一个SSHD的实例,只允许公钥登录。

useradd support

  • 创建两对密钥分别给受控端和管理员使用,添加publickey到authorized_keys

    no-pty,command="/usr/sbin/nologin",permitopen="127.0.0.1:1",no-agent-forwarding,no-X11-forwarding ssh-rsa XXXpubkey= remote support

    no-pty,command="/usr/sbin/nologin",no-agent-forwarding,no-X11-forwarding ssh-rsa XXXpubkey= support admin

  • 编写一些脚本main.vbs


Option Explicit
Randomize
Dim oShell, oFso
Set oShell = CreateObject("WScript.Shell")
Set oFso = CreateObject("Scripting.FileSystemObject")

Dim title
title = "Remote Support ;-)"
Dim curPath
curPath = oFso.GetParentFolderName(WScript.ScriptFullName)
oShell.CurrentDirectory = curPath

Dim tfolder
Const TemporaryFolder = 2
Set tfolder = oFso.GetSpecialFolder(TemporaryFolder)

'Display welcom message
oShell.Run "welcome.vbs", 0,False

Function GetFullPath(fname)
    GetFullPath = oFso.BuildPath(curPath, fname) 
End Function

Sub ImportRegFile()
    ON ERROR RESUME NEXT
    'Your .Reg file and path goes here as in the example below
    Dim sRegFiles(1)
    sRegFiles(0) = "serverkey.reg"
    sRegFiles(1) = "vncserver.reg"
    Dim file
    for each file in sRegFiles
        'This line runs Regedit in silent mode
        oShell.Run "reg.exe IMPORT " & Chr(34) & GetFullPath(file) & Chr(34), 0, True
    Next
End Sub

Sub BackupOldSetting()
    oShell.Run "reg.exe COPY HKCU\Software\TightVNC\Server HKCU\SOftware\TightVNC\ServerBK /s /f", 0, True
END Sub

Sub RestoreOldSetting()
    oShell.Run "reg.exe COPY HKCU\Software\TightVNC\ServerBK HKCU\SOftware\TightVNC\Server /s /f", 0, True
    oShell.Run "reg.exe DELETE HKCU\Software\TightVNC\ServerBK /f", 0, True
END Sub

Sub killVNC()
    Const strComputer = "." 
    Dim objWMIService, colProcessList
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'tvnserver.exe'")
    Dim objProcess
    For Each objProcess in colProcessList 
        oShell.Run "pskill.exe /accepteula " & objProcess.ProcessId , 0, True
        'objProcess.Terminate
    Next
END SUB

'Kill other vnc process
Call killVNC

'Detect old setting
Dim haveOldSetting
On Error Resume Next
oShell.RegRead("HKCU\Software\TightVNC\Server\")
If Err.Number = 0 Then
    haveOldSetting = True
ELSE
    haveOldSetting = False
    Err.Clear
End If
ON ERROR GOTO 0

DIM regimported
regimported = oFso.BuildPath(tFolder, ".regimported")
IF oFso.FileExists(regimported) = False Then
    'Backup old setting
    Call BackupOldSetting
    'Import new setting
    Call ImportRegFile
    oFso.CreateTextFile regimported, True
END IF

Dim remainTimes, connected
remainTimes = 3
connected = False
Dim regSuccess, regFailure
set regSuccess = CreateObject("VBScript.RegExp")
set regFailure = CreateObject("VBScript.RegExp")
regSuccess.pattern = "Remote port forwarding from \d+ enabled"
regFailure.pattern = "Remote port forwarding from \d+ refused"
Dim port, procPlink, oneline
DO until connected = True OR remainTimes <= 0
    port = int(10000 * rnd()) + 30000
    'port = 30000
    set procPlink = oShell.Exec("supportlink.exe" & " -l support -N -v -R " & port & ":127.0.0.1:5902 -i key.ppk -ssh -batch example.com")
    Do Until procPlink.StdErr.AtEndOfStream
        oneline = procPlink.StdErr.ReadLine()
        IF regSuccess.test(oneline) = True THEN
            connected = True
            Exit Do
        END IF
        IF regFailure.test(oneline) = True THEN
            procPlink.Terminate
            Exit Do
        END IF
    Loop
    remainTimes = remainTimes - 1
LOOP

IF connected = False THEN
    'Show Error message
    oShell.PopUp "Can not connect to server!" , , title, vbCritical + vbOkOnly
    WScript.Quit
END IF

'Call Vncserver and show port number
Dim vncProc
set vncProc = oShell.Exec("tvnserver.exe")

Dim oknul
oknul = oFso.BuildPath(tFolder, ".ok.nul")
'Create flag file
oFso.CreateTextFile oknul, True

'Show Dialog
Dim finishProc
set finishProc = oShell.Exec("cscript.exe finish.vbs " & port)
DO WHILE vncProc.Status = 0
    If oFso.FileExists(oknul) = False Then 
        Exit Do
    END IF

    WScript.Sleep 300
LOOP
IF oFso.FileExists(oknul) Then
    finishProc.Terminate
    'oFso.GetFile("ok.nul").Delete
END IF
procPlink.Terminate
vncProc.Terminate
IF haveOldSetting THEN
    Call RestoreOldSetting
ELSE
    oShell.Run "reg.exe DELETE HKCU\Software\TightVNC\Server /f", 0, True
END IF
oFso.GetFile(regimported).Delete
'kill previouse processes

welcome.vbs

Option Explicit
Dim title
title = "Remote Support ;-)"
Dim oShell, oFso
Set oShell = CreateObject("WScript.Shell")
Set oFso = CreateObject("Scripting.FileSystemObject")
Dim tfolder
Const TemporaryFolder = 2
Set tfolder = oFso.GetSpecialFolder(TemporaryFolder)
Dim count
count = 10
DO While oFso.FileExists(oFso.BuildPath(tfolder,".ok.nul")) = False AND count > 0
oShell.PopUp "Connecting , Please Wait ", 3, title, vbInformation + vbOkOnly
count = count -1
LOOP

finish.vbs

Option Explicit
Dim title
title = "Remote Support ;-)"

Dim oShell, oFso, port
Set oShell = CreateObject("WScript.Shell")
Set oFso = CreateObject("Scripting.FileSystemObject")
port = WScript.Arguments.item(0)

Dim returnCode
returnCode = vbOk
DO While returnCode = vbOk
returnCode = oShell.PopUp ("YOUR NUMBER IS " & port & vbCrLf & "When finished click [Cancel] to exit", 0, title, vbInformation + vbOkCancel)
LOOP
ON ERROR RESUME NEXT
Dim tfolder
Const TemporaryFolder = 2
Set tfolder = oFso.GetSpecialFolder(TemporaryFolder)

oFso.GetFile(oFso.BuildPath(tfolder, ".ok.nul")).Delete
WScript.Quit
  • 把所需的Exe文件和VBS放到同一个目录下,还有所需的两个注册表文件,一个是把服务器的公钥加入注册表,这样plink.exe就不会提示。另一个是把vncserver的配置导入,我们的vncserver只监听loopback地址,这样别人就无法连接。使用XP自带的iexpress可以把这些文件打包成一个exe文件,自动解压执行,打包后只有600多KB

运行时会出现提示“在连接服务器”,提示会自动刷新直到连接成功或者失败。成功后出现对话框,把YOUR NUMBER IS后面的数字告诉控制端的用户。控制的用户可以运行plink.exe -N -v -l support -i admin.key -batch -ssh -L 5900:127.0.0.1:port转发本地5900端口到远程服务器上的对应端口(就是刚才的数字)。然后vncviewer.exe localhost::5900就可以连接到远程客户机器。

只有远程的客户端运行的程序要傻瓜化,本地的我可以直接打命令。当然,为了使用方便可以写一段VBS,另外写一个shell脚本,可以在我的UBUNTU机器上用。由于VNC和SSH都是跨平台的方案,这样的远程控制方法可用在多个系统上。当然不用VNC用远程桌面也一样是可行的。

VNC有文件传输功能,如果不想用VNC的文件传输,可以把Cygwin的sshd放到客户机器上运行,使用sftp来传输文件。当然SSHD自己的端口也要转发。

整个的思路灵感来自X2Go,X2Go Server只能在Linux机器上运行。VBScript我不是很熟,上面的代码有很多是从Google搜索到的。

存档