下面的两部分,分别设置了java及javadoc的编码为UTF-8
build.gradle
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
}
Learn and share.
下面的两部分,分别设置了java及javadoc的编码为UTF-8
build.gradle
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
}
前面做测试,生成了很多错误的review request。
但没有找到可以批量删除的工具,于是自己写了一个。
deleterequest.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
获取指定svn文件夹下,指定svn版本的注释
'''
import os
import sys
#获取指定svn版本的注释
def del_rb_request(rid1,rid2):
for rid in range(rid1,rid2):
cmd='curl -X DELETE --header "Authorization: token API_TOKEN" http://127.0.0.1/api/review-requests/'+str(rid)+'/'
print(cmd)
logs = os.popen(cmd.encode()).readlines()
for log in logs:
print(log)
#start here
del_rb_request(0,86)
接上一篇。
1、脚本写了没多久,但郁闷的是测通上面的脚本我花了很久,后来发现主要是字符集的问题。
我用的是Debian默认字符集为UTF8,python2.7默认字符集为ASCII。
后面,设置了python的字符集默认为UTF8,第一篇的脚本才测通了。
/usr/lib/python2.7/sitecustomize.py
# install the apport exception handler if available
import sys
sys.setdefaultencoding('UTF8')
try:
import apport_python_hook
except ImportError:
pass
else:
apport_python_hook.install()
2、然后发现RBT貌似不支持UTF8的中文参数,反正我没有测通,好吧,自己写了一个脚本将SVN上的中文注释更新到mysql中。
说明一下,RBT的这个问题,我已经向社区提交Bug了,亲测补丁有效,大家等待下一版本就好了。
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
用于更新rb的说明
'''
import sys
import datetime
import MySQLdb
import nsvnutils
#记录日志
def nlog(logpath,msg):
fo = open(logpath,'a+')
try:
fo.write(msg+'\n')
finally:
fo.close()
#更新rb的reviewrequest说明
def update_rb_comment():
#获取连接
try:
connection=MySQLdb.connect(user='user',passwd="passwd",host='127.0.0.1',port=3306,db='db',charset='utf8')
subconnection=MySQLdb.connect(user='user',passwd="passwd",host='127.0.0.1',port=3306,db='db',charset='utf8')
#print('mysql connection ok')
nlog('/mnt/rb/sql.log','mysql connection ok')
except Exception as ex:
#print(str(ex))
nlog('/mnt/rb/sql.log',str(ex))
return
#获取需要处理的数据
try:
cursor=connection.cursor()
subcursor=subconnection.cursor()
sql="select id,summary from reviews_reviewrequest r where r.description='' or r.description is null"
cursor.execute(sql)
#print('mysql select ok')
nlog('/mnt/rb/sql.log','mysql select ok')
for row in cursor.fetchall():
rid=str(row[0])
ss=row[1].split('_Rev')
if len(ss)==2:
nsvnutils.get_repo_name(ss[0])
comment=nsvnutils.get_svn_log(ss[1])
commiter=nsvnutils.get_svn_commiter(ss[1])
subsql="update reviews_reviewrequest r set r.description='"+commiter+"_"+comment+"' where r.id="+rid
#print(subsql)
nlog('/mnt/rb/sql.log',subsql)
subcursor.execute(subsql)
else:
#print('skiping id='+rid+' summary='+row[1])
nlog('/mnt/rb/sql.log','skiping id='+rid+' summary='+row[1])
subconnection.commit()
except Exception as ex:
#print(str(ex))
nlog('/mnt/rb/sql.log',str(ex))
return
finally:
cursor.close()
subcursor.close()
connection.close()
subconnection.close()
#start here
nlog("/mnt/rb/sql.log", 'Starting job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
update_rb_comment()
nlog("/mnt/rb/sql.log", 'Ending job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
3、建立定时任务,执行脚本
crontab -l #10分钟运行一次 */10 * * * * /home/neohope/scripts/updatedb.py
公司的SVN服务器是在Windows上的,ReviewBoard是在Linux虚拟服务器上的。
好吧,主要是历史原因了哦。。。
解决思路是,利用SVN的post-commit钩子,在提交后,将版本号存到一个文件中。
在Linux服务器中,定时去扫描这些文件,有变动的话,则利用RBTools提交请求。
1、Windows中用post-commit钩子获取版本号
post-commit.bat
@echo off SET REPOS=%1% SET REV=%2% SET RPATH=PATH_TO_STORE_FILE CALL :getfilename %REPOS% echo %REV% >> %RPATH%\%FNAME%.txt :success exit 0 :getfilename set FNAME=%~nx1
2、Linux中用python脚本扫描文件变动
runme.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
遍历监视文件夹下所有的txt文件
当文件多余两行时,对于每一行,调用rbt生成review请求
最后,只保留最后一行
'''
import os
import sys
import datetime
import nsvnutils
#记录日志
def nlog(logpath,msg):
fo = open(logpath,'a+')
try:
fo.write(msg)
finally:
fo.close()
#创建rbt命令,并调用命令
def create_rbt_command(repo, revision1, revision2, logpath):
title = repo+"_Rev"+revision1
comment = nsvnutils.get_svn_log(revision1)
commiter = nsvnutils.get_svn_commiter(revision1)
#rbt好像不支持utf8参数,因此用更新db的方式添加注释
cmd = 'rbt post -p --repository ' +repo+" --repository-type svn --server http://127.0.0.1 --api-token API_TOKEN --summary "+title+' '+revision1
fo = open(logpath,'a+')
try:
fo.write('adding rbt job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
fo.write('PWD is '+os.getcwd()+'\n')
fo.write('CMD is '+cmd+'\n')
logs = os.popen(cmd.encode('UTF8')).readlines()
for log in logs:
fo.write(log+'\n')
fo.write('\n')
finally:
fo.close()
#写回最后一行
def write_last_line(txtpath,line):
fo = open(txtpath,'w+')
try:
fo.write(line)
finally:
fo.close()
#遍历行
#多于两行则自动生成post review
def enum_line(txtpath,logpath,repo):
nlog('/mnt/rb/rb.log','Trying repositor '+repo+'\n')
fi = open(txtpath)
try:
lines=fi.readlines()
linesize=len(lines)
if linesize <= 1:
nlog('/mnt/rb/rb.log','Skiping repositor '+repo+'\n')
return
for i in range(0, linesize):
if i+1<linesize:
rbRepo = nsvnutils.get_repo_name(repo)
if len(rbRepo)==0 :
nlog('/mnt/rb/rb.log','Skiping repositor '+repo+'\n')
return
nlog('/mnt/rb/rb.log','Parsing repository '+rbRepo+'\n')
create_rbt_command(rbRepo,lines[i].replace('\n','').replace('\r',''),lines[i+1].replace('\n','').replace('\r',''),logpath)
except Exception as ex:
nlog('/mnt/rb/rb.log',str(ex))
finally:
fi.close()
write_last_line(txtpath,lines[linesize-1])
#递归遍历文件
def enum_file(targetdir,sufix,logpath):
for root, dirs, files in os.walk(targetdir, True):
for fname in files:
fsufix = os.path.splitext(fname)[1][1:]
repo = os.path.splitext(fname)[0]
if sufix == fsufix:
txtpath = root+"/"+fname
#txtpath = root+"\\"+fname
enum_line(txtpath,logpath,repo)
#start here
nlog("/mnt/rb/rb.log", 'Starting job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
enum_file("/mnt/rb","txt", "/mnt/rb/rb.log")
#enum_file("D:/MyProducts/Python/ReviewBoard/rb","txt", "D:/MyProducts/Python/ReviewBoard/rb/rb.log")
nlog("/mnt/rb/rb.log", 'Ending job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
nsvnutils.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
获取指定svn文件夹下,指定svn版本的注释
'''
import os
import sys
#切换路径,并获取repository名称
def get_repo_name(repo):
mydict = {'REPO1':'REPO1','REPO2':'REPO2'}
if not mydict.get(repo):
return ''
os.chdir('/home/neohope/repository/'+mydict.get(repo))
#os.chdir('D:/MyProducts/Python/ReviewBoard/repo/'+mydict(repo))
return mydict[repo]
#获取指定svn版本的注释
def get_svn_log(revision):
cmd = 'svn log -r '+revision
logs = os.popen(cmd).readlines()
#for log in logs:
# print(log)
if len(logs)>3:
print(logs[3].replace('\r','').replace('\n',''))
return logs[3].replace('\r','').replace('\n','')
else:
print('no svn comment')
return 'no svn comment'
#获取指定svn版本的提交者
def get_svn_commiter(revision):
cmd = 'svn log -r '+revision
logs = os.popen(cmd).readlines()
if len(logs)>2:
ss=logs[1].split('|')
if len(ss)>2:
print(ss[1].strip().replace('\r','').replace('\n',''))
return ss[1].strip().replace('\r','').replace('\n','')
else:
#print('no svn commiter')
return 'no svn commiter'
else:
#print('no svn commiter')
return 'no svn commiter'
#start here
#get_svn_log('193')
#get_svn_commiter('193')
3、建立定时任务,执行脚本
crontab -l #半小时运行一次 */30 * * * * /home/neohope/scripts/runme.py
比较麻烦的是,仍需要在Linux下面,先把SVN的repository检出才可以。
同时要注意,要做好SVN及ReviewBoard之间名称的映射。。。
1、常用命令
#列出全部虚拟机 VBoxManage list vms #列出全部运行中的虚拟机 VBoxManage list runningvms #列出虚拟机信息 VBoxManage showvminfo uuid|vmname #开启虚拟机 VBoxManage startvm uuid|vmname #开启虚拟机,无GUI模式 VBoxManage startvm uuid|vmname --type headless #暂停虚拟机 VBoxManage controlvm uuid|vmname pause #继续运行虚拟机 VBoxManage controlvm uuid|vmname resume #按下机箱重启按钮 VBoxManage controlvm uuid|vmname reset #断电 VBoxManage controlvm uuid|vmname poweroff #按下机箱电影按钮 VBoxManage controlvm uuid|vmname acpipowerbutton #按下机箱睡眠按钮 VBoxManage controlvm uuid|vmname acpisleepbutton
2、全部参数
Oracle VM VirtualBox Command Line Management Interface Version 4.3.10
(C) 2005-2014 Oracle Corporation
All rights reserved.
Usage:
VBoxManage [<general option>] <command>
General Options:
[-v|--version] print version number and exit
[-q|--nologo] suppress the logo
[--settingspw <pw>] provide the settings password
[--settingspwfile <file>] provide a file containing the settings password
Commands:
list [--long|-l] vms|runningvms|ostypes|hostdvds|hostfloppies|
intnets|bridgedifs|hostonlyifs|natnets|dhcpservers|
hostinfo|hostcpuids|hddbackends|hdds|dvds|floppies|
usbhost|usbfilters|systemproperties|extpacks|
groups|webcams
showvminfo <uuid|vmname> [--details]
[--machinereadable]
showvminfo <uuid|vmname> --log <idx>
registervm <filename>
unregistervm <uuid|vmname> [--delete]
createvm --name <name>
[--groups <group>, ...]
[--ostype <ostype>]
[--register]
[--basefolder <path>]
[--uuid <uuid>]
modifyvm <uuid|vmname>
[--name <name>]
[--groups <group>, ...]
[--ostype <ostype>]
[--iconfile <filename>]
[--memory <memorysize in MB>]
[--pagefusion on|off]
[--vram <vramsize in MB>]
[--acpi on|off]
[--pciattach 03:04.0]
[--pciattach 03:04.0@02:01.0]
[--pcidetach 03:04.0]
[--ioapic on|off]
[--hpet on|off]
[--triplefaultreset on|off]
[--hwvirtex on|off]
[--nestedpaging on|off]
[--largepages on|off]
[--vtxvpid on|off]
[--vtxux on|off]
[--pae on|off]
[--longmode on|off]
[--synthcpu on|off]
[--cpuidset <leaf> <eax> <ebx> <ecx> <edx>]
[--cpuidremove <leaf>]
[--cpuidremoveall]
[--hardwareuuid <uuid>]
[--cpus <number>]
[--cpuhotplug on|off]
[--plugcpu <id>]
[--unplugcpu <id>]
[--cpuexecutioncap <1-100>]
[--rtcuseutc on|off]
[--graphicscontroller none|vboxvga|vmsvga]
[--monitorcount <number>]
[--accelerate3d on|off]
[--accelerate2dvideo on|off]
[--firmware bios|efi|efi32|efi64]
[--chipset ich9|piix3]
[--bioslogofadein on|off]
[--bioslogofadeout on|off]
[--bioslogodisplaytime <msec>]
[--bioslogoimagepath <imagepath>]
[--biosbootmenu disabled|menuonly|messageandmenu]
[--biossystemtimeoffset <msec>]
[--biospxedebug on|off]
[--boot<1-4> none|floppy|dvd|disk|net>]
[--nic<1-N> none|null|nat|bridged|intnet|hostonly|
generic|natnetwork]
[--nictype<1-N> Am79C970A|Am79C973|
82540EM|82543GC|82545EM|
virtio]
[--cableconnected<1-N> on|off]
[--nictrace<1-N> on|off]
[--nictracefile<1-N> <filename>]
[--nicproperty<1-N> name=[value]]
[--nicspeed<1-N> <kbps>]
[--nicbootprio<1-N> <priority>]
[--nicpromisc<1-N> deny|allow-vms|allow-all]
[--nicbandwidthgroup<1-N> none|<name>]
[--bridgeadapter<1-N> none|<devicename>]
[--hostonlyadapter<1-N> none|<devicename>]
[--intnet<1-N> <network name>]
[--nat-network<1-N> <network name>]
[--nicgenericdrv<1-N> <driver>
[--natnet<1-N> <network>|default]
[--natsettings<1-N> [<mtu>],[<socksnd>],
[<sockrcv>],[<tcpsnd>],
[<tcprcv>]]
[--natpf<1-N> [<rulename>],tcp|udp,[<hostip>],
<hostport>,[<guestip>],<guestport>]
[--natpf<1-N> delete <rulename>]
[--nattftpprefix<1-N> <prefix>]
[--nattftpfile<1-N> <file>]
[--nattftpserver<1-N> <ip>]
[--natbindip<1-N> <ip>
[--natdnspassdomain<1-N> on|off]
[--natdnsproxy<1-N> on|off]
[--natdnshostresolver<1-N> on|off]
[--nataliasmode<1-N> default|[log],[proxyonly],
[sameports]]
[--macaddress<1-N> auto|<mac>]
[--mouse ps2|usb|usbtablet|usbmultitouch]
[--keyboard ps2|usb
[--uart<1-N> off|<I/O base> <IRQ>]
[--uartmode<1-N> disconnected|
server <pipe>|
client <pipe>|
file <file>|
<devicename>]
[--lpt<1-N> off|<I/O base> <IRQ>]
[--lptmode<1-N> <devicename>]
[--guestmemoryballoon <balloonsize in MB>]
[--audio none|null|dsound]
[--audiocontroller ac97|hda|sb16]
[--clipboard disabled|hosttoguest|guesttohost|
bidirectional]
[--draganddrop disabled|hosttoguest
[--vrde on|off]
[--vrdeextpack default|<name>
[--vrdeproperty <name=[value]>]
[--vrdeport <hostport>]
[--vrdeaddress <hostip>]
[--vrdeauthtype null|external|guest]
[--vrdeauthlibrary default|<name>
[--vrdemulticon on|off]
[--vrdereusecon on|off]
[--vrdevideochannel on|off]
[--vrdevideochannelquality <percent>]
[--usb on|off]
[--usbehci on|off]
[--snapshotfolder default|<path>]
[--teleporter on|off]
[--teleporterport <port>]
[--teleporteraddress <address|empty>
[--teleporterpassword <password>]
[--teleporterpasswordfile <file>|stdin]
[--tracing-enabled on|off]
[--tracing-config <config-string>]
[--tracing-allow-vm-access on|off]
[--usbcardreader on|off]
[--autostart-enabled on|off]
[--autostart-delay <seconds>]
[--vcpenabled on|off]
[--vcpscreens [<display>],...
[--vcpfile <filename>]
[--vcpwidth <width>]
[--vcpheight <height>]
[--vcprate <rate>]
[--vcpfps <fps>]
[--defaultfrontend default|<name>]
clonevm <uuid|vmname>
[--snapshot <uuid>|<name>]
[--mode machine|machineandchildren|all]
[--options link|keepallmacs|keepnatmacs|
keepdisknames]
[--name <name>]
[--groups <group>, ...]
[--basefolder <basefolder>]
[--uuid <uuid>]
[--register]
import <ovfname/ovaname>
[--dry-run|-n]
[--options keepallmacs|keepnatmacs]
[more options]
(run with -n to have options displayed
for a particular OVF)
export <machines> --output|-o <name>.<ovf/ova>
[--legacy09|--ovf09|--ovf10|--ovf20]
[--manifest]
[--iso]
[--options manifest|iso|nomacs|nomacsbutnat]
[--vsys <number of virtual system>]
[--product <product name>]
[--producturl <product url>]
[--vendor <vendor name>]
[--vendorurl <vendor url>]
[--version <version info>]
[--description <description info>]
[--eula <license text>]
[--eulafile <filename>]
startvm <uuid|vmname>...
[--type gui|sdl|headless]
controlvm <uuid|vmname>
pause|resume|reset|poweroff|savestate|
acpipowerbutton|acpisleepbutton|
keyboardputscancode <hex> [<hex> ...]|
setlinkstate<1-N> on|off |
nic<1-N> null|nat|bridged|intnet|hostonly|generic|
natnetwork [<devicename>] |
nictrace<1-N> on|off |
nictracefile<1-N> <filename> |
nicproperty<1-N> name=[value] |
nicpromisc<1-N> deny|allow-vms|allow-all |
natpf<1-N> [<rulename>],tcp|udp,[<hostip>],
<hostport>,[<guestip>],<guestport> |
natpf<1-N> delete <rulename> |
guestmemoryballoon <balloonsize in MB> |
usbattach <uuid>|<address> |
usbdetach <uuid>|<address> |
clipboard disabled|hosttoguest|guesttohost|
bidirectional |
draganddrop disabled|hosttoguest |
vrde on|off |
vrdeport <port> |
vrdeproperty <name=[value]> |
vrdevideochannelquality <percent> |
setvideomodehint <xres> <yres> <bpp>
[[<display>] [<enabled:yes|no> |
[<xorigin> <yorigin>]]] |
screenshotpng <file> [display] |
vcpenabled on|off |
vcpscreens all|none|<screen>,[<screen>...] |
setcredentials <username>
--passwordfile <file> | <password>
<domain>
[--allowlocallogon <yes|no>] |
teleport --host <name> --port <port>
[--maxdowntime <msec>]
[--passwordfile <file> |
--password <password>] |
plugcpu <id> |
unplugcpu <id> |
cpuexecutioncap <1-100>
webcam <attach [path [settings]]> | <detach [path]> | <list>
discardstate <uuid|vmname>
adoptstate <uuid|vmname> <state_file>
snapshot <uuid|vmname>
take <name> [--description <desc>] [--live] |
delete <uuid|snapname> |
restore <uuid|snapname> |
restorecurrent |
edit <uuid|snapname>|--current
[--name <name>]
[--description <desc>] |
list [--details|--machinereadable]
showvminfo <uuid|snapname>
closemedium disk|dvd|floppy <uuid|filename>
[--delete]
storageattach <uuid|vmname>
--storagectl <name>
[--port <number>]
[--device <number>]
[--type dvddrive|hdd|fdd]
[--medium none|emptydrive|additions|
<uuid|filename>|host:<drive>|iscsi]
[--mtype normal|writethrough|immutable|shareable|
readonly|multiattach]
[--comment <text>]
[--setuuid <uuid>]
[--setparentuuid <uuid>]
[--passthrough on|off]
[--tempeject on|off]
[--nonrotational on|off]
[--discard on|off]
[--bandwidthgroup <name>]
[--forceunmount]
[--server <name>|<ip>]
[--target <target>]
[--tport <port>]
[--lun <lun>]
[--encodedlun <lun>]
[--username <username>]
[--password <password>]
[--initiator <initiator>]
[--intnet]
storagectl <uuid|vmname>
--name <name>
[--add ide|sata|scsi|floppy|sas]
[--controller LSILogic|LSILogicSAS|BusLogic|
IntelAHCI|PIIX3|PIIX4|ICH6|I82078]
[--portcount <1-30>]
[--hostiocache on|off]
[--bootable on|off]
[--remove]
bandwidthctl <uuid|vmname>
add <name> --type disk|network
--limit <megabytes per second>[k|m|g|K|M|G] |
set <name>
--limit <megabytes per second>[k|m|g|K|M|G] |
remove <name> |
list [--machinereadable]
(limit units: k=kilobit, m=megabit, g=gigabit,
K=kilobyte, M=megabyte, G=gigabyte)
showhdinfo <uuid|filename>
createhd --filename <filename>
[--size <megabytes>|--sizebyte <bytes>]
[--diffparent <uuid>|<filename>
[--format VDI|VMDK|VHD] (default: VDI)
[--variant Standard,Fixed,Split2G,Stream,ESX]
modifyhd <uuid|filename>
[--type normal|writethrough|immutable|shareable|
readonly|multiattach]
[--autoreset on|off]
[--property <name=[value]>]
[--compact]
[--resize <megabytes>|--resizebyte <bytes>]
clonehd <uuid|inputfile> <uuid|outputfile>
[--format VDI|VMDK|VHD|RAW|<other>]
[--variant Standard,Fixed,Split2G,Stream,ESX]
[--existing]
convertfromraw <filename> <outputfile>
[--format VDI|VMDK|VHD]
[--variant Standard,Fixed,Split2G,Stream,ESX]
[--uuid <uuid>]
convertfromraw stdin <outputfile> <bytes>
[--format VDI|VMDK|VHD]
[--variant Standard,Fixed,Split2G,Stream,ESX]
[--uuid <uuid>]
getextradata global|<uuid|vmname>
<key>|enumerate
setextradata global|<uuid|vmname>
<key>
[<value>] (no value deletes key)
setproperty machinefolder default|<folder> |
hwvirtexclusive on|off |
vrdeauthlibrary default|<library> |
websrvauthlibrary default|null|<library> |
vrdeextpack null|<library> |
autostartdbpath null|<folder> |
loghistorycount <value>
defaultfrontend default|<name>
usbfilter add <index,0-N>
--target <uuid|vmname>|global
--name <string>
--action ignore|hold (global filters only)
[--active yes|no] (yes)
[--vendorid <XXXX>] (null)
[--productid <XXXX>] (null)
[--revision <IIFF>] (null)
[--manufacturer <string>] (null)
[--product <string>] (null)
[--remote yes|no] (null, VM filters only)
[--serialnumber <string>] (null)
[--maskedinterfaces <XXXXXXXX>]
usbfilter modify <index,0-N>
--target <uuid|vmname>|global
[--name <string>]
[--action ignore|hold] (global filters only)
[--active yes|no]
[--vendorid <XXXX>|""]
[--productid <XXXX>|""]
[--revision <IIFF>|""]
[--manufacturer <string>|""]
[--product <string>|""]
[--remote yes|no] (null, VM filters only)
[--serialnumber <string>|""]
[--maskedinterfaces <XXXXXXXX>]
usbfilter remove <index,0-N>
--target <uuid|vmname>|global
sharedfolder add <uuid|vmname>
--name <name> --hostpath <hostpath>
[--transient] [--readonly] [--automount]
sharedfolder remove <uuid|vmname>
--name <name> [--transient]
guestproperty get <uuid|vmname>
<property> [--verbose]
guestproperty set <uuid|vmname>
<property> [<value> [--flags <flags>]]
guestproperty delete|unset <uuid|vmname>
<property>
guestproperty enumerate <uuid|vmname>
[--patterns <patterns>]
guestproperty wait <uuid|vmname> <patterns>
[--timeout <msec>] [--fail-on-timeout]
guestcontrol <uuid|vmname>
exec[ute]
--image <path to program> --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose] [--timeout <msec>]
[--environment "<NAME>=<VALUE> [<NAME>=<VALUE>]"]
[--wait-exit] [--wait-stdout] [--wait-stderr]
[--dos2unix] [--unix2dos]
[-- [<argument1>] ... [<argumentN>]]
copyfrom
<guest source> <host dest> --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
[--dryrun] [--follow] [--recursive]
copyto|cp
<host source> <guest dest> --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
[--dryrun] [--follow] [--recursive]
createdir[ectory]|mkdir|md
<guest directory>... --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
[--parents] [--mode <mode>]
removedir[ectory]|rmdir
<guest directory>... --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
[--recursive|-R|-r]
removefile|rm
<guest file>... --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
ren[ame]|mv
<source>... <dest> --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
createtemp[orary]|mktemp
<template> --username <name>
[--passwordfile <file> | --password <password>]
[--directory] [--secure] [--tmpdir <directory>]
[--domain <domain>] [--mode <mode>] [--verbose]
list <all|sessions|processes|files> [--verbose]
process kill --session-id <ID>
| --session-name <name or pattern>
[--verbose]
<PID> ... <PID n>
[p[s]]kill --session-id <ID>
| --session-name <name or pattern>
[--verbose]
<PID> ... <PID n>
session close --session-id <ID>
| --session-name <name or pattern>
| --all
[--verbose]
stat
<file>... --username <name>
[--passwordfile <file> | --password <password>]
[--domain <domain>] [--verbose]
updateadditions
[--source <guest additions .ISO>] [--verbose]
[--wait-start]
[-- [<argument1>] ... [<argumentN>]]
watch [--verbose]
debugvm <uuid|vmname>
dumpguestcore --filename <name> |
info <item> [args] |
injectnmi |
log [--release|--debug] <settings> ...|
logdest [--release|--debug] <settings> ...|
logflags [--release|--debug] <settings> ...|
osdetect |
osinfo |
getregisters [--cpu <id>] <reg>|all ... |
setregisters [--cpu <id>] <reg>=<value> ... |
show [--human-readable|--sh-export|--sh-eval|
--cmd-set]
<logdbg-settings|logrel-settings>
[[opt] what ...] |
statistics [--reset] [--pattern <pattern>]
[--descriptions]
metrics list [*|host|<vmname> [<metric_list>]]
(comma-separated)
metrics setup
[--period <seconds>] (default: 1)
[--samples <count>] (default: 1)
[--list]
[*|host|<vmname> [<metric_list>]]
metrics query [*|host|<vmname> [<metric_list>]]
metrics enable
[--list]
[*|host|<vmname> [<metric_list>]]
metrics disable
[--list]
[*|host|<vmname> [<metric_list>]]
metrics collect
[--period <seconds>] (default: 1)
[--samples <count>] (default: 1)
[--list]
[--detach]
[*|host|<vmname> [<metric_list>]]
natnetwork add --netname <name>
--network <network>
[--enable|--disable]
[--dhcp on|off]
[--port-forward-4 <rule>]
[--loopback-4 <rule>]
[--ipv6 on|off]
[--port-forward-6 <rule>]
[--loopback-6 <rule>]
natnetwork remove --netname <name>
natnetwork modify --netname <name>
[--network <network>]
[--enable|--disable]
[--dhcp on|off]
[--port-forward-4 <rule>]
[--loopback-4 <rule>]
[--ipv6 on|off]
[--port-forward-6 <rule>]
[--loopback-6 <rule>]
natnetwork start --netname <name>
natnetwork stop --netname <name>
hostonlyif ipconfig <name>
[--dhcp |
--ip<ipv4> [--netmask<ipv4> (def: 255.255.255.0)] |
--ipv6<ipv6> [--netmasklengthv6<length> (def: 64)]]
create |
remove <name>
dhcpserver add|modify --netname <network_name> |
--ifname <hostonly_if_name>
[--ip <ip_address>
--netmask <network_mask>
--lowerip <lower_ip>
--upperip <upper_ip>]
[--enable | --disable]
dhcpserver remove --netname <network_name> |
--ifname <hostonly_if_name>
extpack install [--replace] <tarball> |
uninstall [--force] <name> |
cleanup
1、安装需要的软件及软件包
#更新apt软件列表 apt-get update #安装mysql apt-get install mysql-server #安装apache2 apt-get install apache2 #安装mod_wsgi apt-get install libapache2-mod-wsgi #安装memcached apt-get install memcached #安装patch apt-get install patch #安排subversion apt-get install subversion
2、配置MySQL
#修改配置文件 vi /etc/mysql/my.cnf #添加下面内容 [client] default-character-set=utf8 [mysqld] character-set-server=utf8 #重启mysql /etc/init.d/mysql restart #新建数据库、用户并授权 mysql -u root -p mysql> CREATE DATABASE reviewboard CHARACTER SET utf8; mysql> CREATE USER 'reviewboard'@'localhost' IDENTIFIED BY 'reviewboard'; mysql> GRANT ALL PRIVILEGES ON reviewboard.* to 'reviewboard'@'localhost';
3、配置svn(我的svn和reviewboard不是在一台机器上的,不需要重新配置)
4、配置Python2.7环境
#安装python-setuptools apt-get install python-setuptools #安装python-dev apt-get install python-dev #安装python-mysqldb apt-get install python-mysqldb #替代方案 #easy_install mysql-python #安装python-svn apt-get install python-svn #安装 libffi-dev apt-get install libffi-dev #安装ReviewBoard easy_install ReviewBoard #你可以用pip安装 #eays_install pip #pip install pipdeptree #pip install ReviewBoard
5、安装网站
#这句话会报错,因为依赖的Django版本冲突所导致的
rb-site install /var/www/reviewboard
#查看插件依赖
pipdeptree
#可以看到
#ReviewBoard依赖Django [required: <1.7,>=1.6.11, installed: 1.8]
#django-haystack依赖Django [required: >=1.8, installed: 1.8]
argparse==1.2.1
chardet==2.3.0
lxml==3.4.0
MySQL-python==1.2.3
numpy==1.8.2
pycups==1.9.63
pycurl==7.19.5
pygobject==3.14.0
pysmbc==1.0.15.3
python-apt==0.9.3.11
python-debian==0.1.27
- six [required: None, installed: 1.8.0]
python-debianbts==1.11
pyxdg==0.25
reportbug==6.6.3
ReviewBoard==2.5.1
- Django [required: <1.7,>=1.6.11, installed: 1.8]
- django-evolution [required: <=0.7.999,>=0.7.5, installed: 0.7.6]
- Django [required: <1.7.0,>=1.4.10, installed: 1.8]
- django-haystack [required: >=2.3.1, installed: 2.5.0]
- Django [required: >=1.8, installed: 1.8]
- Django [required: <1.10, installed: 1.8]
- django-multiselectfield [required: None, installed: 0.1.4]
- django [required: >=1.4, installed: 1.8]
- Djblets [required: <=0.9.999,>=0.9, installed: 0.9.3]
- Django [required: >=1.6.11,<1.8.999, installed: 1.8]
- django-pipeline [required: <1.3.9999,>=1.3.23, installed: 1.3.27]
- futures [required: >=2.1.3, installed: 3.0.5]
- feedparser [required: >=5.1.2, installed: 5.2.1]
- pillowfight [required: None, installed: 0.2]
- Pillow [required: None, installed: 2.6.1]
- pytz [required: None, installed: 2016.7]
- docutils [required: None, installed: 0.12]
- markdown [required: <2.4.999,>=2.4.0, installed: 2.4.1]
- mimeparse [required: >=0.1.3, installed: 0.1.3]
- paramiko [required: >=1.12, installed: 2.0.2]
- cryptography [required: >=1.1, installed: 1.5.2]
- cffi [required: >=1.4.1, installed: 1.8.3]
- pycparser [required: None, installed: 2.14]
- enum34 [required: None, installed: 1.1.6]
- idna [required: >=2.0, installed: 2.1]
- ipaddress [required: None, installed: 1.0.17]
- pyasn1 [required: >=0.1.8, installed: 0.1.9]
- setuptools [required: >=11.3, installed: 28.6.0]
- six [required: >=1.4.1, installed: 1.8.0]
- pyasn1 [required: >=0.1.7, installed: 0.1.9]
- pycrypto [required: >=2.6, installed: 2.6.1]
- Pygments [required: >=1.6, installed: 2.0.1]
- python-dateutil [required: ==1.5, installed: 1.5]
- python-memcached [required: None, installed: 1.58]
- six [required: >=1.4.0, installed: 1.8.0]
- pytz [required: None, installed: 2016.7]
- recaptcha-client [required: None, installed: 1.0.6]
- Whoosh [required: >=2.6, installed: 2.7.4]
roman==2.0.0
SOAPpy==0.12.22
- defusedxml [required: None, installed: 0.4.1]
- wstools [required: None, installed: 0.4.3]
- docutils [required: None, installed: 0.12]
wsgiref==0.1.2
#所以降级django-haystack就好了
easy_install -m django
easy_install -m django-haystack
easy_install django-haystack==2.3.1
easy_install reviewboard
6、安装网站,并修改网站权限
#安装网站,按提示输入 rb-site install /var/www/reviewboard chown -R www-data /var/www/reviewboard/htdocs/media/uploaded chown -R www-data /var/www/reviewboard/data chown -R www-data /var/www/reviewboard/logs chown -R www-data /var/www/reviewboard/htdocs/media/ext chown -R www-data /var/www/reviewboard/htdocs/static/ext
7、配置访问权限
#配置访问权限 vi /var/www/reviewboard/conf/settings_local.py #修改下面一行,这是不限制任何访问 ALLOW_HOSTS=['*']
8、配置apache2虚拟目录
cp /var/www/reviewboard/conf/apache-wsgi.conf /etc/apache2/sites-available/reviewboard.conf #按实际需要的部署情况,编辑reviewboard.conf cd /etc/apache2/sites-enabled ln -s ../sites-avaiable/reviewboard.conf
9、重启apache2
/etc/init.d/apache2 restart
10、打开浏览器就可以登录啦
11、另外,我是在虚拟机中部署的reviewboard,我尝试了用nginx反向代理reviewboard,但没有成功。
用firebug看到,json中的ip地址没有改写,最后发现是因为django没有正确的处理absolute_path。
好像增加一些django的配置就好了,但实在是没时间处理了。
最后用bridege方式将虚拟机映射出来,完成部署。
前两天公司一哥们遇到了这个问题,记录一下解决方法:
ASP.NET 2.0
方案一:将aspx文件中的page项添加ValidateRequest=”false”
<%@ Page ValidateRequest="false" Language="C#" AutoEventWireup="true" CodeFile="xxx.aspx.cs" Inherits="xxx.xxx" %>
方案二:修改web.config配置文件(全局有效,慎用)
<system.web>
<pages validateRequest="false"></pages>
</system.web>
ASP.NET 4.0
方案一:修改web.config配置文件(全局有效,慎用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"></pages>
</system.web>
ASP.NET MVC
方案一:修改web.config配置文件(全局有效,慎用)
修改web.config配置文件(全局有效,慎用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
然后修改控制器
[HttpPost]
[ValidateInput(false)]
public ActionResult XXX(xxx xxx)
{
}
<%@ page language="java" import="java.util.*, java.lang.management.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>系统参数输出</title>
<style type="text/css">
table
{
border-collapse:collapse;
}
td
{
border:1px solid #427BD6;
}
</style>
</head>
<body style="background-color:#f2f2f2;">
<h1>环境变量</h1>
<table>
<%
Map<String, String> map = System.getenv();
//RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
//Map<String, String> map = runtimeMxBean.getSystemProperties();
for(String key : map.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(key);
out.println("</td>");
out.println("<td>");
out.println(map.get(key));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>JVM参数</h1>
<table>
<%
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getVmVendor()+" || "+runtimeMxBean.getVmName() +" || "+ runtimeMxBean.getVmVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getSpecVendor()+" || "+runtimeMxBean.getSpecName() +" || "+ runtimeMxBean.getSpecVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getName()+" || "+runtimeMxBean.getStartTime() +" || "+ runtimeMxBean.getUptime());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println("MaxMemory="+Runtime.getRuntime().maxMemory()/1024/1024 + "m ");
out.println("TotalMemory="+Runtime.getRuntime().totalMemory()/1024/1024 + "m ");
out.println("FreeMemory="+Runtime.getRuntime().freeMemory()/1024/1024 + "m ");
out.println("</td>");
out.println("</tr>");
List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean bean : memoryPoolMXBeans)
{
out.println("<tr>");
out.println("<td>");
out.println(bean.getName()+" || "+bean.getType()+" || Init="+bean.getUsage().getInit()/1024/1024+
"m Max="+bean.getUsage().getMax()/1024/1024+"m Used="+bean.getUsage().getUsed()/1024/1024+
"m Committed="+bean.getUsage().getCommitted()/1024/1024+"m ");
out.println("</td>");
out.println("</tr>");
}
List<String> arguments = runtimeMxBean.getInputArguments();
for(String arg:arguments)
{
out.println("<tr>");
out.println("<td>");
out.println(arg);
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>系统参数</h1>
<table>
<%
Properties props = System.getProperties();
for(Object o:props.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(o);
out.println("</td>");
out.println("<td>");
out.println(props.get(o));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
</body>
</html>
最常用的方法,就是使用SVN提供的pre-commit钩子。
具体做法是,在对应的repository下的hooks文件夹下中,新建对于的pre-commit脚本,来禁止提交。
1.windows下pre-commit.bat
@echo off setlocal set REPOS=%1 set TXN=%2 rem 保证输入8个字符 svnlook log %REPOS% -t %TXN% | findstr "........" > nul if %errorlevel% gtr 0 goto :err_action rem 过滤空格字符 svnlook log %REPOS% -t %TXN% | findstr /ic:" " > nul if %errorlevel% gtr 0 goto :success :err_action echo 备注信息验证失败。 >&2 echo 提交代码时,必须填写备注信息。 >&2 echo 备注信息不少于8个字符(或4个汉字)。>&2 goto :err_exit :err_exit exit 1 :success exit 0
2.linux下pre-commit.sh
#!/bin/sh REPOS="$1" TXN="$2" SVNLOOK=/usr/local/bin/svnlook LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c` #要求注释不能少于8个字符,您可自定义 if ["$LOGMSG" -lt 8]; then echo -e "\n备注信息验证失败。\n提交代码时,必须填写备注信息。\n备注信息不少于8个字符(或4个汉字)。" 1>&2 exit 1 fi exit 0