利用TortoiseSVN钩子脚本实现SVN提交消息自动记录

作者:songerzhou 发布时间:October 28, 2011 分类:技术相关 No Comments

顾名思义,这个用Wscript实现的TortoiseSVN钩子脚本就是自动记录SVN的提交消息(Commit Message)。虽然我们很容易通过查看SVN日志并搜索来查询自己最近的操作记录,但使用过就会知道操作麻烦、需要网络连接、不能导出等一些问题令人十分不爽,于是一个自动记录提交消息的想法就诞生了。TortoiseSVN钩子脚本可以用其他语言实现,Bat、WSH、Python、甚至是PHP都是可以的。这个工具我现在一直在用,尤其是在写每周的工作周报时查看上周工作记录很方便。

这里是我自己的日志截图:
利用TortoiseSVN钩子脚本实现SVN提交消息自动记录

这里是源代码:

01 var objArgs,num;
02
03 objArgs = WScript.Arguments;
04 num = objArgs.length;
05 if (num != 6)
06 {
07     WScript.Echo("发生内部错误!");
08     WScript.Quit(1);
09 }
10
11 var fso = new ActiveXObject('Scripting.FileSystemObject');
12
13 if (fso.FileExists(objArgs(0)))
14 {
15     // 这里是保存日志TXT的目录,需手动创建
16     var logPath = "E:\\work\\log";
17     var logFile = logPath + "\\" + getTime(1) + "\\" + getTime(2) + ".txt";
18
19     var a = new ActiveXObject('Adodb.Stream');
20     a.Mode = 3; // read/write
21     a.Type = 2; // text
22     a.Charset = 'utf-8';
23     a.Open();
24     a.Position = 0;
25     a.LoadFromFile(objArgs(2));
26
27     var b = new ActiveXObject('Adodb.Stream');
28     b.Mode = 3; // read/write
29     b.Type = 2; // text
30     b.Charset = 'utf-8';
31     b.Open();
32     b.Position = 0;
33    
34     if (fso.FileExists(logFile)) {
35         b.LoadFromFile(logFile);
36         b.ReadText();
37     }
38
39     if (!fso.FolderExists(logPath + "\\" + getTime(1))) {
40         fso.CreateFolder(logPath + "\\" + getTime(1));
41     }
42
43     b.WriteText("日期: " + getTime(3) + "\r\n");
44
45     // 写提交消息
46     b.WriteText("信息:\r\n" );
47     b.WriteText(a.ReadText() + "\r\n\r\n");
48     b.WriteText("----------\r\n");
49    
50     a.LoadFromFile(objArgs(0));
51    
52     b.WriteText(a.ReadText() + "\r\n");
53     b.WriteText("--------------------------------------------------\r\n\r\n");
54    
55     if (fso.FileExists(logFile)) {
56         b.SaveToFile(logFile, 2);
57     } else {
58         b.SaveToFile(logFile);
59     }
60
61     a.Close();
62     b.Close();
63 }
64
65 function getTime(type) {
66     var s,d = new Date();
67     if (type > 0) {
68         s = d.getYear() + "-";
69         s += (d.getMonth() + 1);
70         if (type > 1) {
71             s += "-" + d.getDate();
72             if (type > 2) {
73                 s += " " + d.getHours() + ":";
74                 s += d.getMinutes() + ":";
75                 s += d.getSeconds();
76             }
77         }
78     }
79     return s;
80 }

网站数据自动备份的实现

作者:songerzhou 发布时间:October 22, 2011 分类:技术相关 No Comments

虽说学并做了几年Linux服务器的运维,但自己的博客却从来没有好好弄过。先前在学校,由于服务器自己在管,觉得数据不可能丢失或被删除,但现在已经离开学校了,难免时常担心博客数据的安全性问题。这些天专门在网上Google了一下,看到了不少实现方案,综合各自优点,于是一个适合自己的解决方案诞生了。

一个网站要备份的数据无非就是文件和数据,具体来讲,文件包括网站源码和用户上传两种,数据文件当然指的就是数据库了。我实现的方案总体来讲就是:文件(目录)打包压缩/数据导出压缩,Rsync同步。步骤很简单,只有三步。


  1. 数据打包:即文件(目录)打包并压缩,我采用的是最常用的tar zcf命令,压缩到tar.gz文件中,解压的时候使用tar zxf就行了,方便通用。数据压缩原理也很简单,使用数据库自带的数据导出工具输出数据,通过Linux管道命令使用gzip压缩数据到文件。博客采用的是MySQL数据库,于是我使用的是mysqldump这个工具。怎么样,简单吧,相信使学过Linux的同学对这些操作都不会陌生的。
  2. 数据同步:数据同步也是采用Linux上广泛使用的Rsync工具(http://rsync.samba.org/)。实话讲,我这里并没有完全利用好Rsync这个工具的优点,而且对于本文的实现Rsync的确是大材小用了。
  3. 定时执行:Linux自带的Crontab命令,使用Crontab -e添加修改系统的定时命令。这里要做的就是让上面两点在指定时间自动执行。

具体的实现是每天2:00自动执行网站文件和数据库备份脚本,生成文件名中带有当天日期的文件保存到本机的目录下,紧跟着执行同步命令将生成的备份文件同步到指定的远程服务器上。这里每天备份的文件名是不一样的,这样的坏处就是文件每天会添加,占用硬盘存储空间,但是为了数据的安全,我没有选择覆盖原来文件。

其他方案

Linux,OK,这个没法替代了,至少我是这么认为的;Shell脚本,可以用任何编程语言替代实现,比如Python就很不错。Crontab定时,也可以使用编程语言自己实现。tar命令和gzip命令,可以用其他打包、压缩命令替代,最好打包成单个文件,利于同步和保存。

重点要说的是Rsync的替代方案和Inotify的使用。其实Linux是有自带的文件传输命令的:scp(Secure Copy),而且它用在同步单个文件的需求上是刚好合适的,但是它有致命的一点:使用它要有远程主机的终端SSH权限,安全性得不到保障。Linux下还有一个rcp的文件传输命令,安全性验证要求比scp低,但个人确实没有使用过。

最后说说网上经常看到的Rsync+Inotify文件同步方案,这个方案本身确实不错,但不适用于网站数据备份。使用Inotify实时监控文件的变化,并触发同步文件到远程服务器,实现文件的及时备份。但经过实际使用,我觉得Inotify的监控文件改动太过了,创建一个文件会产生几个事件,导致了巨大的网络流量产生,同时也增加了服务器开销。最重要的,作为数据备份,无需追求实时。

好了,先写这些吧。

新生

作者:songerzhou 发布时间:August 31, 2011 分类:默认分类 No Comments

距离上次更新博客过去了几个月,这几个月不是没东西可说,恰恰相反,这段时间是发生事情最多的几个月,连说话都没时间。

出于各种原因,我一直准备弃用原来的博客,于是原来博客一直没再更新。

我不是一个习惯抛弃过去的人,但我觉得告别过去才能让人更好地着眼于未来。

明天就是9月1号,新生开学的日子,作为一个刚入社会的新生,我要努力地学习,适应这个社会,生存下去。

带着怀念的心情告别过去,让自己获得新生。

欢迎使用Typecho

作者:songerzhou 发布时间:August 31, 2011 分类:默认分类 1 Comment

如果您看到这篇文章,表示您的blog已经安装成功.