root / branches / v2_0_0_prep / build / buildman / bin / bmplugins / DepManDeployPlugIn.py @ 28403
History | View | Annotate | Download (7.66 KB)
1 |
#depman create plugin
|
---|---|
2 |
|
3 |
from bmbase.IPlugIn import IPlugIn |
4 |
from bmbase.PlugInManager import PlugInManager |
5 |
from bmcore.BMUtil import * |
6 |
from bmcore.ftpslib import * |
7 |
from xml.dom import minidom |
8 |
import string |
9 |
import shutil |
10 |
import os |
11 |
import sys |
12 |
import subprocess |
13 |
|
14 |
from urlparse import urlparse |
15 |
|
16 |
class Server: |
17 |
def __init__(self): |
18 |
self._repository_id = "gvsig-ftp-repository" |
19 |
self._repository_url = "downloads.gvsig.org" |
20 |
self._repository_proto = "ftp" |
21 |
self._repository_login = "maven" |
22 |
self._repository_path = "/anon/pub/gvSIG-desktop/buildman-repository" |
23 |
self._repository_passwd = "" |
24 |
|
25 |
class DepManDeployPlugIn(IPlugIn): |
26 |
|
27 |
def __init__(self): |
28 |
IPlugIn.__init__(self)
|
29 |
|
30 |
self._is_Interactive = False |
31 |
self._dependency = None |
32 |
self._server = Server()
|
33 |
self._servers = []
|
34 |
|
35 |
self._xmlConfigFile = "settings.xml" |
36 |
|
37 |
def setDependency(self, dependency): |
38 |
self._dependency = dependency
|
39 |
|
40 |
def init(self): |
41 |
self.addGoal("deploy", "deploys an artifact") |
42 |
self.addGoalOption("deploy", "--interactive", "ask for server or artifact deployment configuration") |
43 |
self.addPreGoal("deploy", "create") |
44 |
self._dmplugin = PlugInManager().getPlugInInstance("DepManPlugIn") |
45 |
self._dmcreateplugin = PlugInManager().getPlugInInstance("DepManCreatePlugIn") |
46 |
|
47 |
|
48 |
if self._dmplugin == None: |
49 |
self.reportError("PlugIn `depman` not found") |
50 |
return False |
51 |
|
52 |
if self._arguments.read("deploy"): |
53 |
self.setExecute(True) |
54 |
|
55 |
|
56 |
if self._arguments.read("--interactive"): |
57 |
self._is_Interactive = True |
58 |
|
59 |
|
60 |
def initFromXML(self, node): |
61 |
distrNodes = node.getElementsByTagName("distributionManagement")
|
62 |
if distrNodes != None: |
63 |
for n in distrNodes: |
64 |
if n.localName == "distributionManagement": |
65 |
for p in n.childNodes: |
66 |
if p.localName == "repository": |
67 |
repoName = None
|
68 |
repoUrl = None
|
69 |
for k in p.childNodes: |
70 |
if k.localName == "id": |
71 |
self.server._repository_id = k.childNodes[0].nodeValue |
72 |
if k.localName == "name": |
73 |
repoName = k.childNodes[0].nodeValue
|
74 |
if k.localName == "url": |
75 |
repoUrl = urlparse(k.childNodes[0].nodeValue)
|
76 |
|
77 |
self.server._repository_url = repo.netloc
|
78 |
self.server._repository_path = repoUrl.path
|
79 |
self.server._repository_proto = repoUrl.scheme
|
80 |
print self.server._repository_proto + "://" + self.server._repository_url + "/" + self.server._repository_path |
81 |
settingsNodes = node.getElementsByTagName("servers")
|
82 |
if settingsNodes != None: |
83 |
for n in settingsNodes: |
84 |
if n.localName == "servers": |
85 |
self._servers = []
|
86 |
for p in n.childNodes: |
87 |
if p.localName == "server": |
88 |
server = Server() |
89 |
for k in p.childNodes: |
90 |
if k.localName == "id": |
91 |
server._repository_id = k.childNodes[0].nodeValue
|
92 |
if k.localName == "username": |
93 |
server._repository_login = k.childNodes[0].nodeValue
|
94 |
if k.localName == "password": |
95 |
server._repository_passwd = k.childNodes[0].nodeValue
|
96 |
|
97 |
self._servers.append(server)
|
98 |
print self._servers |
99 |
|
100 |
def uploadFTPFile(self, url, user, pwd, destdir, path, orig_file, filename): |
101 |
#print url, user, pwd, destdir, path, orig_file, filename
|
102 |
ftp = FTP_TLS(url) |
103 |
#ftp.set_debuglevel( 1 )
|
104 |
ftp.auth_tls(); ftp.prot_p() |
105 |
ftp.login(user, pwd) |
106 |
ftp.set_pasv(1)
|
107 |
#ftp.retrlines('LIST')
|
108 |
ftp.cwd(destdir) |
109 |
dirs = string.split(path, os.path.sep) |
110 |
for dir in dirs: |
111 |
#print dir
|
112 |
try:
|
113 |
ftp.mkd(dir)
|
114 |
except:
|
115 |
pass
|
116 |
try:
|
117 |
ftp.cwd(dir)
|
118 |
except:
|
119 |
pass
|
120 |
f = open(orig_file, "rb") |
121 |
ftp.storbinary("STOR " + filename, f)
|
122 |
f.close() |
123 |
ftp.quit() |
124 |
|
125 |
|
126 |
def execute(self): |
127 |
self.initFromXML(self._dmplugin.getNode()) |
128 |
print self._dmplugin.getMavenPath() + os.path.sep + self._xmlConfigFile |
129 |
self.loadXMLFile(self._dmplugin.getMavenPath() + os.path.sep + self._xmlConfigFile) |
130 |
|
131 |
file_name = self._dependency.getDepManFileName()
|
132 |
file_path = self._dependency.getDepManUrlPath()
|
133 |
|
134 |
tarname = file_name + ".tar.gz"
|
135 |
md5name = tarname + ".md5"
|
136 |
dmfile = file_name + ".xml"
|
137 |
|
138 |
dmutil = BMUtil() |
139 |
surl = self._server._repository_proto + "://" + self._server._repository_url + "/" + self._server._repository_path; |
140 |
url = self._server._repository_url
|
141 |
destdir = self._server._repository_path
|
142 |
login = self._server._repository_login
|
143 |
pwd = self._server._repository_passwd
|
144 |
|
145 |
if self._is_Interactive: |
146 |
tmstr = "URL [*]:"
|
147 |
surl = raw_input(string.replace(tmstr, "*", url)) |
148 |
if len(surl) == 0: |
149 |
surl = self._server._repository_url
|
150 |
repoURL = urlparse(surl) |
151 |
self._server._repository_url = repo.netloc
|
152 |
self._server._repository_path = repoUrl.path
|
153 |
self._server._repository_proto = repoUrl.scheme
|
154 |
url = self._server._repository_url
|
155 |
|
156 |
tmstr = "Login [*]:"
|
157 |
login = raw_input(string.replace(tmstr, "*", login)) |
158 |
if len(login) == 0: |
159 |
login = self._server._repository_login
|
160 |
import getpass |
161 |
pwd = getpass.getpass() |
162 |
else:
|
163 |
for s in self._servers: |
164 |
if s._repository_id == self._server._repository_id: |
165 |
login = self._server._repository_login = s._repository_login
|
166 |
pwd = self._server._repository_passwd = s._repository_passwd
|
167 |
|
168 |
#tmpdir = self._dmplugin.getDepManPath() + os.path.sep + ".cache" + os.path.sep + file_path
|
169 |
tmpdir = self._dmplugin.getMavenPath()+os.path.sep+"repository"+os.path.sep+file_path |
170 |
|
171 |
if self._server._repository_proto == "ssh": |
172 |
dmutil.rmdir(".dmn_tmp") # Prevent for uploading bad previous compilations! |
173 |
sshtmpdir = ".dmn_tmp" + os.path.sep + file_path
|
174 |
dmutil.mkdir(sshtmpdir) |
175 |
shutil.copyfile(tmpdir + os.path.sep + tarname, sshtmpdir + os.path.sep + tarname) |
176 |
shutil.copyfile(tmpdir + os.path.sep + md5name, sshtmpdir + os.path.sep + md5name) |
177 |
if self._xmlfile != "": |
178 |
shutil.copyfile(tmpdir + os.path.sep + dmfile, sshtmpdir + os.path.sep + dmfile) |
179 |
|
180 |
#scp
|
181 |
base_ssh = destdir |
182 |
url_ssh = url |
183 |
scpcommand = "scp"
|
184 |
pscppath = ""
|
185 |
if sys.platform == "win32": |
186 |
scpcommand = self._dmplugin.getDepManDataPath() + os.path.sep + "win32" + os.path.sep + "pscp.exe" |
187 |
scpcommand = '"' + os.path.normpath(scpcommand) + '"' |
188 |
cmdstr = scpcommand + " -r " + ".dmn_tmp" + os.path.sep + "*" + " " + login + "@" + url_ssh + ":" + base_ssh |
189 |
|
190 |
print cmdstr
|
191 |
os.system(cmdstr) |
192 |
dmutil.rmdir(".dmn_tmp")
|
193 |
|
194 |
elif self._server._repository_proto == "ftp": |
195 |
#ftp
|
196 |
print "* Uploading ", tarname |
197 |
self.uploadFTPFile(url, login, pwd, destdir, os.path.sep + file_path, tmpdir + os.path.sep + tarname, tarname)
|
198 |
print "* Uploading ", md5name |
199 |
self.uploadFTPFile(url, login, pwd, destdir, os.path.sep + file_path, tmpdir + os.path.sep + md5name, md5name)
|
200 |
if not self._is_Interactive: |
201 |
print "* Uploading ", dmfile |
202 |
self.uploadFTPFile(url, login, pwd, destdir, os.path.sep + file_path, tmpdir + os.path.sep + dmfile, dmfile)
|
203 |
|
204 |
return True |
205 |
|
206 |
PlugInManager().registerPlugIn("DepManDeployPlugIn", DepManDeployPlugIn())
|