Statistics
| Revision:

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())