存档

2013年12月 的存档

使用svnsync实现已有svn版本库的镜像

2013年12月16日 没有评论

转自:http://zengrong.net/post/1598.htm

svn不支持分布式开发,所以把svn版本库保存在一台服务器上是不安全的。制作一个镜像svn版本库有多种方式,我采用subversion自带的svnsync程序。

 

此教程基于Archlinux。windows用户请注意路径表示法。

源版本库路径:http://192.168.16.10/svn/project1
镜像版本库路径:/var/svn/project1

一、建立镜像版本库

 


 

二、初始化镜像库

 


 

然后按照提示输入密码,提示信息可能如下:

认证领域: http://192.168.16.10 Subversion Repositories
“zrong”的密码:
认证领域: http://192.168.16.10 Subversion Repositories
用户名: zrong
“zrong”的密码:xxxx
复制版本 0 的属性。

三、同步

 


 

如果系统提示要保存明文密码,输入yes就可以了。这里我没有研究如何对密码进行加密。

接下来进入同步流程,同步的提示可能如下:

已提交版本 1。
复制版本 1 的属性。
传输文件数据………………………………
已提交版本 1。

这个时间可能会很长,具体要看网速和原始版本库的大小。如果版本库中有带的的二进制文件,则进度会更慢。在svnsync同步的过程中,应该保证原始的svn数据库不要进行提交操作,否则可能会造成同步失败,同步失败会引起镜像版本库的锁定。下面会讲解如何解锁。

四、解锁

如果在同步的时候遇到下面的提示,可能是由于原始版本库同时正在提交:

从目标版本库获得锁失败,当前被“xxxxx”持有

如果是在svn中,可以使用svn cleanup来解除锁定。但是svnsync并没有这个功能。我们可以使用下面的代码来解除锁定:

 


 

五、修改原始版本库的地址

如果原始版本库的地址改变了(比如说换了域名或者IP地址),在svn中可以使用 svn relocate 来实现,但在svnsync中,就必须用propset来实现了,具体代码如下:

 


 

参考文章:

分类: svn 标签:

javascript判断用户表单输入内容不能为空

2013年12月10日 没有评论

简单的判断输入是否为空

<html><body>

<form action=”test.asp” method=”POST” name=”form1″ id=”form1″ >
 <p>用户名:<input type=”text” name=”username” /></p>
 <p>密&nbsp;&nbsp;码:<input type=”password” name=”password” /></p>
 <p>提示问题:<input type=”text” name=”question” /> </p>
 <p>答&nbsp;&nbsp;案:<input type=”text” name=”answer” /></p>
 <p>博客地址:<input type=”text” name=”blog” /> </p>
 <p><input type=”submit” name=”Submit” value=”提交” onClick=”return CheckForm()”/>

     <input type=”reset” name=”Submit2″ value=”重置” /> </p>

  </form>
</body>
</html>
<script language=”javascript”>
function CheckForm()
{
  if (document.form1.username.value.length==0)
     {
  alert (“请输入用户名”);
  document.form1.username.focus();
  return false;
  }
  if (document.form1.password.value.length==0)
     {
         alert (“请输入密码!”);
   document.form1.password.focus(); 
   return false; 
  }   
       return true;
}
</script>

 

带正则匹配(判断ip和域名)

<html>

<head>

<script language=”javascript” type=”text/javascript”>

/*判断IP的函数*/

function checkip(form)
{
var pattern=/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/;
flag_ip=pattern.test(form.ipv.value);
if(!flag_ip)
{
alert(“错误的ip!”);

return false;
}

}

/*判断域名的函数*/

function checkdomain(form)
{
var doname = /^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(info)|(cc)|(com\.cn)|(net\.cn)|(org\.cn)|(name)|(biz)|(tv)|(cn)|(mobi)|(name)|(sh)|(ac)|   (io)|(tw)|(com\.tw)|(hk)|(com\.hk)|(ws)|(travel)|(us)|(tm)|(la)|(me\.uk)|(org\.uk)|(ltd\.uk)|(plc\.uk)|(in)|(eu)|(it)|(jp))$/;
var flag_domain = doname.test(form.domainv.value);
if(!flag_domain){
alert(“不是正确的域名”);
form.domainv.focus();
return false;
}
}

</script >

</head>

<body>

<form name=”ip” method=”get” onsubmit=”return checkip(this)”>
<input size=”50″ type=”text” name=”ipv” value=”ip地址” style=”color:#999999;padding-top: 2px;”/><input type=”submit” value=”查IP” name=”ip_submit”/>
</form>

<form name=”domain” method=”get” onsubmit=”return checkdomain(this)”>
<input size=”50″ type=”text” name=”domainv” value=”域名”style=”color:#999999;padding-top: 2px;”/><input type=”submit” value=”域名” name=”domain_submit”/>
</form>

</body>

</html>

}

分类: html 标签:

python os.path模块学习

2013年12月9日 1 条评论

os.path.abspath(path)

返回path规范化的绝对路径。

>>> os.path.abspath(‘test.csv’)

‘C:\\Python25\\test.csv’

>>> os.path.abspath(‘c:\\test.csv’)

‘c:\\test.csv’

>>> os.path.abspath(‘../csv\\test.csv’)

‘C:\\csv\\test.csv’

os.path.split(path)

将path分割成目录和文件名二元组返回。

>>> os.path.split(‘c:\\csv\\test.csv’)

(‘c:\\csv’, ‘test.csv’)

>>> os.path.split(‘c:\\csv\\’)

(‘c:\\csv’, ”)

 

os.path.dirname(path)

返回path的目录。其实就是os.path.split(path)的第一个元素。

>>> os.path.dirname(‘c:\\csv\test.csv’)

‘c:\\’

>>> os.path.dirname(‘c:\\csv’)

‘c:\\’

os.path.basename(path)

返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。

>>> os.path.basename(‘c:\\test.csv’)

‘test.csv’

>>> os.path.basename(‘c:\\csv’)

‘csv’ (这里csv被当作文件名处理了)

>>> os.path.basename(‘c:\\csv\\’)

os.path.commonprefix(list)

返回list中,所有path共有的最长的路径。

如:

>>> os.path.commonprefix([‘/home/td’,’/home/td/ff’,’/home/td/fff’])

‘/home/td’

 

os.path.exists(path)

如果path存在,返回True;如果path不存在,返回False。

>>> os.path.exists(‘c:\\’)

True

>>> os.path.exists(‘c:\\csv\\test.csv’)

False

os.path.isabs(path)

如果path是绝对路径,返回True。

 

os.path.isfile(path)

如果path是一个存在的文件,返回True。否则返回False。

>>> os.path.isfile(‘c:\\boot.ini’)

True

>>> os.path.isfile(‘c:\\csv\\test.csv’)

False

>>> os.path.isfile(‘c:\\csv\\’)

False

 

os.path.isdir(path)

如果path是一个存在的目录,则返回True。否则返回False。

>>> os.path.isdir(‘c:\\’)

True

>>> os.path.isdir(‘c:\\csv\\’)

False

>>> os.path.isdir(‘c:\\windows\\test.csv’)

False

 

os.path.join(path1[, path2[, …]])

将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。

>>> os.path.join(‘c:\\’, ‘csv’, ‘test.csv’)

‘c:\\csv\\test.csv’

>>> os.path.join(‘windows\temp’, ‘c:\\’, ‘csv’, ‘test.csv’)

‘c:\\csv\\test.csv’

>>> os.path.join(‘/home/aa’,’/home/aa/bb’,’/home/aa/bb/c’)

‘/home/aa/bb/c’

 

os.path.normcase(path)

在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。

>>> os.path.normcase(‘c:/windows\\system32\\’)

‘c:\\windows\\system32\\’

os.path.normpath(path)

规范化路径。

>>> os.path.normpath(‘c://windows\\System32\\../Temp/’)

‘c:\\windows\\Temp’

 

os.path.splitdrive(path)

>>> os.path.splitdrive(‘c:\\windows’)

(‘c:’, ‘\\windows’)

os.path.splitext(path)

>>> os.path.splitext(‘c:\\csv\\test.csv’)

(‘c:\\csv\\test’, ‘.csv’)

 

os.path.getsize(path)
返回path的文件的大小(字节)。
>>> os.path.getsize(‘c:\\boot.ini’)
299L

分类: python 标签:

[转]Git服务器Gitosis架设指南

2013年12月6日 没有评论

转自:http://www.jiangmiao.org/blog/1600.html

昨天弄了个git,用来发布我们内部运维工具代码,发现这边文章写的最靠谱。备忘下。

Git是非常著名的分布式版本控制系统。
Gitosis则是方便通过Git与ssh架设中央服务器的软件。这篇文章的安装流程写得很明了,但使用中还是遇到了些许问题,本文算是该流程的补充。如果打算通过Gitosis架设服务器通过本文或许可以少走不少弯路。

一、架设步骤

1. 下载并安装python setuptools

sudo apt-get install python-setuptools

2. 下载并安装gitosis

cd ~/src
git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install

3. 添加用户git

4. 生成本机密钥

切换到个人机,如果已有~/.ssh/id_rsa.pub略过此步
ssh-keygen -t rsa

5. 上传密钥到服务器临时目录

scp ~/.ssh/id_rsa.pub 用户名@主机:/tmp

6. 初使化gitosis

切回到服务器
sudo -H -u git gitosis-init < /tmp/id_rsa.pub

7. 修改post-update权限

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

8. clone gitosis管理平台

git clone git@主机名:gitosis-admin.git
cd gitosis-admin

9. 安装完成

通过修改gitosis-admin管理gitosis用户权限
添加公密到keydir,添加用户
修改完后commit,push到中服务器即可完成仓库权限的相关操作。

二、实例

目标:添加用户 john 和仓库 foo 到gitosis,并和管理员miao合作管理

1. 用户john添加并发送id_rsa.pub给miao

john:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/john/.ssh/id_rsa):
Created directory ‘/home/john/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/john/.ssh/id_rsa.
Your public key has been saved in /home/john/.ssh/id_rsa.pub.
john:~$ cp /home/john/.ssh/id_rsa.pub /tmp

2. gitosis管理员miao分配john权限

miao:~$ cd ~/projects
git clone git@192.168.1.115:gitosis-admin
cd gitosis-admin
cat gitosis.conf
ls keydir/
miao@u32-192-168-1-110.pub
cp /tmp/id_rsa.pub keydir/john.pub
vi gitosis.conf
git add .
git commit -am “add member john and project foo”
git push

3. 用户 miao 添加项目foo

miao:~$ cd ~/projects
mkdir foo
cd foo
git init
touch hello.txt
git add hello.txt
git commit -am ‘first commit’
git remote add origin git@192.168.1.115:foo.git
git push origin master

4. 用户 john clone Foo并修改hello.txt

john:~$ git clone git@192.168.1.115:foo.git
cd foo
ls
date > hello.txt
git commit -am ‘add time to hello.txt’ && git push

5. 用户 miao pull Foo

miao:~/projects/foo$ vi .git/config
git pull

三、常见问题

首先确定 /home/git/repositories/gitosis-admin.git/hooks/post-update 为可执行即属性为 0755

1. git操作需要输入密码

原因
公密未找到
解决
上传id_pub.rsa到keydir并改为’gitosis帐号.pub’形式,如miao.pub。扩展名.pub不可省略

2. ERROR:gitosis.serve.main:Repository read access denied

原因
gitosis.conf中的members与keydir中的用户名不一致,如gitosis中的members = foo@bar,但keydir中的公密名却叫foo.pub
解决
使keydir的名称与gitosis中members所指的名称一致。
改为members = foo 或 公密名称改为foo@bar.pub
分类: git 标签: ,

不同编程语言中获取现在的Unix时间戳

2013年12月3日 没有评论
如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?
Java time
JavaScript Math.round(new Date().getTime()/1000)
getTime()返回数值的单位是毫秒
Microsoft .NET / C# epoch = (DateTime.Now.ToUniversalTime().Ticks – 621355968000000000) / 10000000
MySQL SELECT unix_timestamp(now())
Perl time
PHP time()
PostgreSQL SELECT extract(epoch FROM now())
Python 先 import time 然后 time.time()
Ruby 获取Unix时间戳:Time.now 或 Time.new
显示Unix时间戳:Time.now.to_i
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, GETUTCDATE())
Unix / Linux date +%s
VBScript / ASP DateDiff(“s”, “01/01/1970 00:00:00”, Now())
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print time”
如何在不同编程语言中实现Unix时间戳(Unix timestamp) → 普通时间?
Java String date = new java.text.SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).format(new java.util.Date(Unix timestamp * 1000))
JavaScript 先 var unixTimestamp = new Date(Unix timestamp * 1000) 然后commonTime = unixTimestamp.toLocaleString()
Linux date -d @Unix timestamp
MySQL from_unixtime(Unix timestamp)
Perl 先 my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]
PHP date(‘r’, Unix timestamp)
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE ‘epoch’ + Unix timestamp) * INTERVAL ‘1 second’;
Python 先 import time 然后 time.gmtime(Unix timestamp)
Ruby Time.at(Unix timestamp)
SQL Server DATEADD(s, Unix timestamp, ‘1970-01-01 00:00:00’)
VBScript / ASP DateAdd(“s”, Unix timestamp, “01/01/1970 00:00:00”)
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print scalar(localtime(Unix timestamp))”
如何在不同编程语言中实现普通时间 → Unix时间戳(Unix timestamp)?
Java long epoch = new java.text.SimpleDateFormat(“dd/MM/yyyy HH:mm:ss“).parse(“01/01/1970 01:00:00”);
JavaScript var commonTime = new Date(Date.UTC(yearmonth – 1, dayhour,minutesecond))
MySQL SELECT unix_timestamp(time)
时间格式: YYYY-MM-DD HH:MM:SS 或 YYMMDD 或 YYYYMMDD
Perl 先 use Time::Local 然后 my $time = timelocal($sec, $min, $hour, $day, $month, $year);
PHP mktime(hourminuteseconddaymonthyear)
PostgreSQL SELECT extract(epoch FROM date(‘YYYY-MM-DD HH:MM:SS‘));
Python 先 import time 然后 int(time.mktime(time.strptime(‘YYYY-MM-DD HH:MM:SS‘, ‘%Y-%m-%d %H:%M:%S’)))
Ruby Time.local(yearmonthdayhourminutesecond)
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, time)
Unix / Linux date +%s -d”Jan 1, 1970 00:00:01″
VBScript / ASP DateDiff(“s”, “01/01/1970 00:00:00”, time)
分类: life 标签:

Openstack Error:fetching floating ips:

2013年12月2日 没有评论

Error: The server has either erred or is incapable of performing the requested operation. (HTTP 500)

Error: An error occurred. Please try again.
Error: Error fetching floating ips: The server has either erred or is incapable of performing the requested operation. (HTTP 500)

 

Openstack强制删除instance,可能会导致上述错误出现,在操作dashboard时报出。

现象是操作dashboard,点击floating ip http 500,同时创建instance也会提示错误。

通常暴力删除instance,我们会在数据库操作:security_group_instance_association、instance_info_caches 、instances这3个表。

现在需要同时,把floating_ips 表中的相关instance的 fixed_ip_id项置为NULL,解决上述错误。

openstack强制删除僵死实例

2013年12月2日 没有评论

在我们创建实例的过程中,由于种种错误的操作,会产生了大量状态为 ERROR 或 BUILD 或delete的僵尸实例,其主要原因出现在 RabbitMQ 服务,中途有很多连接都 timeout 了。这些僵尸实例创建不成功或者根本就没有运行,只是在 nova 数据库里有纪录而已,直接用 nova delete 命令无法删除,那么如何进行强制删除instance呢?

清理 nova 数据库,你可以直接登陆数据库后手动删除纪录,具体的操作方法网上有很多。不过这是常见操作,最好还是保存成一个脚本,便于你以后再次使用数据库。方法如下:

# nano deletevm.sh
#!/bin/bash
mysql -uroot -ppassword<< EOF
use nova;
DELETE a FROM nova.security_group_instance_association
AS a INNER JOIN nova.instances AS b
ON a.instance_id=b.id where b.uuid=’$1′;
DELETE FROM nova.instance_info_caches WHERE instance_id=’$1′;
DELETE FROM nova.instances WHERE uuid=’$1′;
EOF

 

# chmod +x deletevm.sh
运行脚本,比如删除 ID 为 2465ed7c-17d0-441c-82f6-de866aa720d4 的实例:
# ./deletevm.sh 2465ed7c-17d0-441c-82f6-de866aa720d4

可以看到id为2465ed7c-17d0-441c-82f6-de866aa720d4 已经被删除了。

这个只是在数据库中删除了记录,实际的镜像文件还在服务器上,可以进服务器目录删掉,可以在openstack控制台看到该虚拟机在哪台节点上,然后进节点目录删掉节点文件,文件在 /var/lib/nova/instances

最后还要将数据库中floating_ips 表中,将刚刚删除那个实例的fixed_ip_id字段改为null,否则在dashboard,点击floating ip http 500,同时创建instance也会提示错误。

参考:http://54im.com/%E4%BA%91%E8%AE%A1%E7%AE%97/openstack/openstack-errorfetching-floating-ips.html

分类: openstack 标签:

wordpress更换域名后,图片地址修改

2013年12月2日 没有评论

由于blog换了域名,之前博客里面发的图片链接还是老的域名地址,现在在数据库中替换下老的域名为新的域名。

  • 表wp_posts里面的post_content (文章内容)
  • 表wp_posts里面的guid (WordPress默认链接结构)
  • 表wp_posts里面的pinged (ping内容)
  • 表wp_comments里面的comment_author_url (留言作者URL地址 )

注意 blog_posts blog_options 这些是我的表名,当初安装的时候指定的,每个blog数据库表前缀可能都不一样,根据自己的实际情况修改。

网上还有其他修改php文件的方案,可以自己试验下,我觉得修改数据库方式最优,最原始。

———————————— 修改文件方式 ———————–

一、修改 wp-config.php 文件

在wp-config.php中,添加以下内容(www.newdomain.com为新域名):

  1. define(‘WP_HOME’,’http://www.newdomain.com’);
  2. define(‘WP_SITEURL’,’http://www.newdomain.com’);

登录后台,在 “常规 -> 设置”填入新域名 HOME 和 SITEURL,然后删除上面添加的内容。

二、修改 functions.php 文件

是主题目录下的 functions.php 文件。在functions.php中,添加以下内容:

  1. update_option(‘siteurl’,’http://www.newdomain.com’);
  2. update_option(‘home’,’http://www.newdomain.com’);

登录后台,在 “常规 -> 设置”填入新域名 HOME 和 SITEURL,然后删除上面添加的内容。