views.py 23.5 KB
Newer Older
1 2
# -*- coding: utf-8 -*-

Łukasz Nowak's avatar
Łukasz Nowak committed
3
from flask import Flask, request, redirect, url_for, \
4
         render_template, g, flash, jsonify, session, abort, send_file
5
from utils import *
Łukasz Nowak's avatar
Łukasz Nowak committed
6 7
import os
import shutil
8
import md5
9
from gittools import cloneRepo, gitStatus, switchBranch, addBranch, getDiff, \
10
     gitPush, gitPull
Alain Takoudjou's avatar
Alain Takoudjou committed
11
from flaskext.auth import Auth, AuthUser, login_required, logout
12 13
from fileBrowser import fileBrowser
import urllib
Łukasz Nowak's avatar
Łukasz Nowak committed
14 15

app = Flask(__name__)
16
app.config['MAX_CONTENT_LENGTH'] = 20 * 1024 * 1024
17 18
auth = Auth(app, login_url_name='login')
auth.user_timeout = 0
19
file_request = fileBrowser(app.config)
20

Cédric de Saint Martin's avatar
Cédric de Saint Martin committed
21 22 23 24
# Setup default flask (werkzeug) parser
import logging
logger = logging.getLogger('werkzeug')

25 26
def login_redirect(*args, **kwargs):
  return redirect(url_for('login'))
Łukasz Nowak's avatar
Łukasz Nowak committed
27

28
#Access Control: Only static files and login pages are allowed to guest
29 30
@app.before_request
def before_request():
31 32 33
  if not request.path.startswith('/static'):
    account = getSession(app.config)
    if account:
34 35
      user = AuthUser(username=account[0])
      user.set_and_encrypt_password(account[1], "123400ZYX")
36
      session['title'] = getProjectTitle(app.config)
37
      g.users = {account[0]: user}
38 39
    else:
      session['title'] = "No account is defined"
40 41
      if request.path != "/setAccount" and request.path != "/configAccount":
        return redirect(url_for('setAccount'))
42

Łukasz Nowak's avatar
Łukasz Nowak committed
43
# general views
44
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
45 46 47
def home():
  return render_template('index.html')

48 49 50 51
@app.route("/login")
def login():
  return render_template('login.html')

52 53 54 55
@app.route("/setAccount")
def setAccount():
  account = getSession(app.config)
  if not account:
56
    return render_template('account.html')
57 58 59 60 61 62 63
  return redirect(url_for('login'))

@login_required()
def myAccount():
  account = getSession(app.config)
  return render_template('account.html', username=account[0],
          email=account[2], name=account[3].decode('utf-8'))
64

65 66 67
@app.route("/dologout")
def dologout():
  user_data = logout()
68 69
  return redirect(url_for('login'))

70
@login_required()
71 72
def configRepo():
  public_key = open(app.config['public_key'], 'r').read()
73
  account = getSession(app.config)
74
  return render_template('cloneRepository.html', workDir='workspace',
75 76
            public_key=public_key, name=account[3].decode('utf-8'),
            email=account[2])
77

78 79
@app.route("/doLogin", methods=['POST'])
def doLogin():
80 81 82 83 84 85
  username = request.form['clogin']
  if username in g.users:
    # Authenticate and log in!
    if g.users[username].authenticate(request.form['cpwd']):
      return jsonify(code=1, result="")
  return jsonify(code=0, result="Login or password is incorrect, please check it!")
86

Łukasz Nowak's avatar
Łukasz Nowak committed
87
# software views
88
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
89
def editSoftwareProfile():
90
  profile = getProfilePath(app.config['etc_dir'], app.config['software_profile'])
91 92
  if profile == "":
    flash('Error: can not open profile, please select your project first')
93 94
  return render_template('updateSoftwareProfile.html', workDir='workspace',
      profile=profile, projectList=getProjectList(app.config['workspace']))
Łukasz Nowak's avatar
Łukasz Nowak committed
95

96
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
97 98
def inspectSoftware():
  if not os.path.exists(app.config['software_root']):
99
    result = ""
Łukasz Nowak's avatar
Łukasz Nowak committed
100
  else:
101
    result = app.config['software_root']
102 103
  return render_template('runResult.html', softwareRoot='software_link/',
                         softwares=loadSoftwareRList(app.config))
Łukasz Nowak's avatar
Łukasz Nowak committed
104

Alain Takoudjou's avatar
Alain Takoudjou committed
105
#remove content of compiled software release
106
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
107
def removeSoftware():
108
  file_config = os.path.join(app.config['etc_dir'], ".softdata")
Łukasz Nowak's avatar
Łukasz Nowak committed
109 110
  if isSoftwareRunning(app.config) or isInstanceRunning(app.config):
    flash('Software installation or instantiation in progress, cannot remove')
111
  elif os.path.exists(file_config):
Łukasz Nowak's avatar
Łukasz Nowak committed
112 113
    svcStopAll(app.config)
    shutil.rmtree(app.config['software_root'])
114
    os.remove(file_config)
Łukasz Nowak's avatar
Łukasz Nowak committed
115 116 117
    flash('Software removed')
  return redirect(url_for('inspectSoftware'))

118
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
119 120
def runSoftwareProfile():
  if runSoftwareWithLock(app.config):
121
    return  jsonify(result = True)
Łukasz Nowak's avatar
Łukasz Nowak committed
122
  else:
123
    return  jsonify(result = False)
Łukasz Nowak's avatar
Łukasz Nowak committed
124

125
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
126 127
def viewSoftwareLog():
  if os.path.exists(app.config['software_log']):
128
    result = tail(open(app.config['software_log'], 'r'), lines=1500)
Łukasz Nowak's avatar
Łukasz Nowak committed
129 130
  else:
    result = 'Not found yet'
131
  return render_template('viewLog.html', type='software',
132
      result=result.encode("utf-8"))
Łukasz Nowak's avatar
Łukasz Nowak committed
133 134

# instance views
135
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
136
def editInstanceProfile():
137
  profile = getProfilePath(app.config['etc_dir'], app.config['instance_profile'])
138
  if profile == "":
139 140 141
    flash('Error: can not open instance profile for this Software Release')
  return render_template('updateInstanceProfile.html', workDir='workspace',
      profile=profile, projectList=getProjectList(app.config['workspace']))
Łukasz Nowak's avatar
Łukasz Nowak committed
142

Alain Takoudjou's avatar
Alain Takoudjou committed
143
# get status of all computer partitions and process state
144
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
145
def inspectInstance():
146 147
  file_content = ''
  result = ''
Łukasz Nowak's avatar
Łukasz Nowak committed
148
  if os.path.exists(app.config['instance_root']):
149
    file_content = 'instance_root'
150
    result = getSvcStatus(app.config)
151
    if len(result) == 0:
152
      result = []
Łukasz Nowak's avatar
Łukasz Nowak committed
153
  return render_template('instanceInspect.html',
154 155
      file_path=file_content, supervisor=result,
      slap_status=getSlapStatus(app.config),
156
      supervisore=result, partition_amount=app.config['partition_amount'])
Łukasz Nowak's avatar
Łukasz Nowak committed
157

Alain Takoudjou's avatar
Alain Takoudjou committed
158
#Reload instance process ans returns new value to ajax
159
@login_required()
160 161 162 163 164 165 166 167 168 169 170 171 172 173
def supervisordStatus():
  result = getSvcStatus(app.config)
  if not (result):
    return jsonify(code=0, result="")
  html = "<tr><th>Partition and Process name</th><th>Status</th><th>Process PID </th><th> UpTime</th><th></th></tr>"
  for item in result:
    html += "<tr>"
    html +="<td  class='first'><b><a href='" + url_for('tailProcess', process=item[0])+"'>"+item[0]+"</a></b></td>"
    html +="<td align='center'><a href='"+url_for('startStopProccess', process=item[0], action=item[1])+"'>"+item[1]+"</a></td>"
    html +="<td align='center'>"+item[3]+"</td><td>"+item[5]+"</td>"
    html +="<td align='center'><a href='"+url_for('startStopProccess', process=item[0], action='RESTART')+"'>Restart</a></td>"
    html +="</tr>"
  return jsonify(code=1, result=html)

174
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
175 176 177
def removeInstance():
  if isInstanceRunning(app.config):
    flash('Instantiation in progress, cannot remove')
178
  else:
179 180 181
    stopProxy(app.config)
    removeProxyDb(app.config)
    startProxy(app.config)
182
    removeInstanceRoot(app.config)
183
    param_path = os.path.join(app.config['etc_dir'], ".parameter.xml")
184 185
    if os.path.exists(param_path):
      os.remove(param_path)
Łukasz Nowak's avatar
Łukasz Nowak committed
186 187 188
    flash('Instance removed')
  return redirect(url_for('inspectInstance'))

189
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
190 191 192 193
def runInstanceProfile():
  if not os.path.exists(app.config['instance_root']):
    os.mkdir(app.config['instance_root'])
  if runInstanceWithLock(app.config):
194
    return  jsonify(result = True)
Łukasz Nowak's avatar
Łukasz Nowak committed
195
  else:
196
    return  jsonify(result = False)
Łukasz Nowak's avatar
Łukasz Nowak committed
197

198
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
199 200 201 202 203
def viewInstanceLog():
  if os.path.exists(app.config['instance_log']):
    result = open(app.config['instance_log'], 'r').read()
  else:
    result = 'Not found yet'
204
  return render_template('viewLog.html', type='instance',
205
      result=result.encode("utf-8"))
Łukasz Nowak's avatar
Łukasz Nowak committed
206

207
@login_required()
Łukasz Nowak's avatar
Łukasz Nowak committed
208 209 210
def stopAllPartition():
  svcStopAll(app.config)
  return redirect(url_for('inspectInstance'))
211

212
@login_required(login_redirect)
213 214 215 216
def tailProcess(process):
  return render_template('processTail.html',
      process_log=getSvcTailProcess(app.config, process), process=process)

217
@login_required(login_redirect)
218 219 220 221
def startStopProccess(process, action):
  svcStartStopProcess(app.config, process, action)
  return redirect(url_for('inspectInstance'))

222
@login_required(login_redirect)
223
def openProject(method):
224 225
  return render_template('projectFolder.html', method=method,
                         workDir='workspace')
226

227
@login_required()
228
def cloneRepository():
229 230 231
  path = realpath(app.config, request.form['name'], False)
  data = {"repo":request.form['repo'], "user":request.form['user'],
          "email":request.form['email'], "path":path}
232
  return cloneRepo(data)
233

234
@login_required()
235
def readFolder():
236
  return getFolderContent(app.config, request.form['dir'])
237

238
@login_required()
239
def openFolder():
240
  return getFolder(app.config, request.form['dir'])
241

242
@login_required()
243
def createSoftware():
244
  return newSoftware(request.form['folder'], app.config, session)
245

246
@login_required()
247 248 249
def checkFolder():
  return checkSoftwareFolder(request.form['path'], app.config)

250
@login_required()
251 252
def setCurrentProject():
  if configNewSR(app.config, request.form['path']):
253 254 255
    session['title'] = getProjectTitle(app.config)
    return jsonify(code=1, result="")
  else:
256
    return jsonify(code=0, result=("Can not setup this Software Release"))
257

258
@login_required()
259
def manageProject():
260
  return render_template('manageProject.html', workDir='workspace',
261 262
                         project=getProjectList(app.config['workspace']))

263
@login_required()
264
def getProjectStatus():
265 266 267 268 269
  path = realpath(app.config, request.form['project'])
  if path:
    return gitStatus(path)
  else:
    return jsonify(code=0, result="Can not read folder: Permission Denied")
270

Alain Takoudjou's avatar
Alain Takoudjou committed
271
#view for current software release files
272
@login_required()
273
def editCurrentProject():
274
  project = os.path.join(app.config['etc_dir'], ".project")
275
  if os.path.exists(project):
276 277 278
    return render_template('softwareFolder.html', workDir='workspace',
                           project=open(project).read(),
                           projectList=getProjectList(app.config['workspace']))
279 280
  return redirect(url_for('configRepo'))

Alain Takoudjou's avatar
Alain Takoudjou committed
281
#create file or directory
282
@login_required()
283
def createFile():
284 285 286 287
  path = realpath(app.config, request.form['file'], False)
  if not path:
    return jsonify(code=0, result="Error when creating your " + \
                   request.form['type'] + ": Permission Denied")
288 289
  try:
    if request.form['type'] == "file":
290
      f = open(path, 'w').write(" ")
291
    else:
292
      os.mkdir(path)
293 294 295 296
    return jsonify(code=1, result="")
  except Exception, e:
    return jsonify(code=0, result=str(e))

Alain Takoudjou's avatar
Alain Takoudjou committed
297
#remove file or directory
298
@login_required()
299 300 301 302 303 304 305 306 307
def removeFile():
  try:
    if request.form['type'] == "folder":
      shutil.rmtree(request.form['path'])
    else:
      os.remove(request.form['path'])
    return jsonify(code=1, result="")
  except Exception, e:
    return jsonify(code=0, result=str(e))
308

309
@login_required()
310
def removeSoftwareDir():
311
  try:
312 313
    data = removeSoftwareByName(app.config, request.form['md5'],
            request.form['title'])
314 315 316
    return jsonify(code=1, result=data)
  except Exception, e:
    return jsonify(code=0, result=str(e))
317

Alain Takoudjou's avatar
Alain Takoudjou committed
318
#read file and return content to ajax
319
@login_required()
320
def getFileContent():
321 322
  file_path = realpath(app.config, request.form['file'])
  if file_path:
323
    if not request.form.has_key('truncate'):
324
      return jsonify(code=1, result=open(file_path, 'r').read())
325
    else:
326
      content = tail(open(file_path, 'r'), int(request.form['truncate']))
327
      return jsonify(code=1, result=content)
328 329
  else:
    return jsonify(code=0, result="Error: No such file!")
330

331
@login_required()
332
def saveFileContent():
333 334
  file_path = realpath(app.config, request.form['file'])
  if file_path:
335
    open(file_path, 'w').write(request.form['content'].encode("utf-8"))
336 337
    return jsonify(code=1, result="")
  else:
338 339
    return jsonify(code=0, result="Error: No such file!")

340
@login_required()
341
def changeBranch():
342 343 344 345 346
  path = realpath(app.config, request.form['project'])
  if path:
    return switchBranch(path, request.form['name'])
  else:
    return jsonify(code=0, result="Can not read folder: Permission Denied")
347

348
@login_required()
349
def newBranch():
350 351 352 353 354 355 356 357
  path = realpath(app.config, request.form['project'])
  if path:
    if request.form['create'] == '1':
      return addBranch(path, request.form['name'])
    else:
      return addBranch(path, request.form['name'], True)
  else:
    return jsonify(code=0, result="Can not read folder: Permission Denied")
358

359
@login_required(login_redirect)
360 361 362 363 364
def getProjectDiff(project):
  path = os.path.join(app.config['workspace'], project)
  return render_template('projectDiff.html', project=project,
                           diff=getDiff(path))

365
@login_required()
366
def pushProjectFiles():
367 368 369 370 371
  path = realpath(app.config, request.form['project'])
  if path:
    return gitPush(path, request.form['msg'])
  else:
    return jsonify(code=0, result="Can not read folder: Permission Denied")
372

373
@login_required()
374
def pullProjectFiles():
375 376 377 378 379
  path = realpath(app.config, request.form['project'])
  if path:
    return gitPull(path)
  else:
    return jsonify(code=0, result="Can not read folder: Permission Denied")
380

381
@login_required()
382
def checkFileType():
383 384 385
  path = realpath(app.config, request.form['path'])
  if not path:
    return jsonify(code=0, result="Can not open file: Permission Denied!")
386 387 388
  if isText(path):
    return jsonify(code=1, result="text")
  else:
389
    return jsonify(code=0, result="Can not open a binary file, please select a text file!")
390

391
@login_required()
392
def getmd5sum():
393 394 395 396
  realfile = realpath(app.config, request.form['file'])
  if not realfile:
    return jsonify(code=0, result="Can not open file: Permission Denied!")
  md5 = md5sum(realfile)
397 398 399
  if md5:
    return jsonify(code=1, result=md5)
  else:
400 401
    return jsonify(code=0, result="Can not get md5sum for this file!")

Alain Takoudjou's avatar
Alain Takoudjou committed
402
#return informations about state of slapgrid process
403
@login_required()
404 405 406 407 408 409 410 411 412 413 414 415 416
def slapgridResult():
  software_state = isSoftwareRunning(app.config)
  instance_state = isInstanceRunning(app.config)
  log_result = {"content":"", "position":0}
  if request.form['log'] == "software"  or\
     request.form['log'] == "instance":
    log_file = request.form['log'] + "_log"
    if os.path.exists(app.config[log_file]):
      log_result = readFileFrom(open(app.config[log_file], 'r'),
                            int(request.form['position']))
  return  jsonify(software=software_state, instance=instance_state,
                  result=(instance_state or software_state), content=log_result)

417
@login_required()
418 419 420 421
def stopSlapgrid():
  result = killRunningSlapgrid(app.config, request.form['type'])
  return jsonify(result=result)

422
@login_required()
423 424 425 426 427 428 429 430 431 432 433 434 435 436
def getPath():
  files = request.form['file'].split('#')
  list = []
  for p in files:
    path = realpath(app.config, p)
    if not p:
      list = []
      break
    else:
      list.append(path)
  realfile = string.join(list, "#")
  if not realfile:
    return jsonify(code=0, result="Can not access to this file: Permission Denied!")
  else:
437 438
    return jsonify(code=1, result=realfile)

439
@login_required()
440
def saveParameterXml():
441 442 443
  """
  Update instance parameter into a local xml file.
  """
444
  project = os.path.join(app.config['etc_dir'], ".project")
445 446
  if not os.path.exists(project):
    return jsonify(code=0, result="Please first open a Software Release")
447
  content = request.form['parameter'].encode("utf-8")
448
  param_path = os.path.join(app.config['etc_dir'], ".parameter.xml")
449 450 451 452 453 454 455
  try:
    f = open(param_path, 'w')
    f.write(content)
    f.close()
    result = readParameters(param_path)
  except Exception, e:
      result = str(e)
456
  software_type = None
Cédric de Saint Martin's avatar
Cédric de Saint Martin committed
457
  if request.form['software_type']:
458
    software_type = request.form['software_type']
459
  if type(result) == type(''):
460
    return jsonify(code=0, result=result)
461
  else:
462
    try:
463 464 465
      updateInstanceParameter(app.config, software_type)
    except Exception, e:
      return jsonify(code=0, result="An error occurred while applying your settings!<br/>" + str(e))
466 467
    return jsonify(code=1, result="")

Alain Takoudjou's avatar
Alain Takoudjou committed
468
#read instance parameters into the local xml file and return a dict
469
@login_required()
470
def getParameterXml(request):
471
  param_path = os.path.join(app.config['etc_dir'], ".parameter.xml")
472 473 474 475 476 477 478 479 480 481
  if not os.path.exists(param_path):
    default = '<?xml version="1.0" encoding="utf-8"?>\n'
    default += '<instance>\n</instance>'
    return jsonify(code=1, result=default)
  if request == "xml":
    parameters = open(param_path, 'r').read()
  else:
    parameters = readParameters(param_path)
  if type(parameters) == type('') and request != "xml":
    return jsonify(code=0, result=parameters)
482
  else:
483 484 485
    return jsonify(code=1, result=parameters)

#update user account data
486
@login_required()
487 488 489 490 491 492
def updateAccount():
  account = []
  account.append(request.form['username'].strip())
  account.append(request.form['password'].strip())
  account.append(request.form['email'].strip())
  account.append(request.form['name'].strip())
493 494 495 496
  code = request.form['rcode'].strip()
  recovery_code = open(os.path.join(app.config['etc_dir'], ".rcode"), "r").read()
  if code != recovery_code:
    return jsonify(code=0, result="Your password recovery code is not valid!")
497
  result = saveSession(app.config, account)
498 499 500
  if type(result) == type(""):
    return jsonify(code=0, result=result)
  else:
501 502 503 504 505 506 507 508 509 510 511 512 513
    return jsonify(code=1, result="")

#update user account data
@app.route("/configAccount", methods=['POST'])
def configAccount():
  last_account = getSession(app.config)
  if not last_account:
    account = []
    account.append(request.form['username'].strip())
    account.append(request.form['password'].strip())
    account.append(request.form['email'].strip())
    account.append(request.form['name'].strip())
    code = request.form['rcode'].strip()
514 515
    recovery_code = open(os.path.join(app.config['etc_dir'], ".rcode"),
                        "r").read()
516 517 518 519 520 521 522 523 524
    if code != recovery_code:
      return jsonify(code=0, result="Your password recovery code is not valid!")
    result = saveSession(app.config, account)
    if type(result) == type(""):
      return jsonify(code=0, result=result)
    else:
      return jsonify(code=1, result="")
  return jsonify(code=0, result="Unable to respond to your request, permission denied.")

525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
#Global File Manager
@login_required()
def fileBrowser():
  if request.method == 'POST':
    filename = request.form.get('filename', '').encode('utf-8')
    dir = request.form['dir'].encode('utf-8')
    newfilename = request.form.get('newfilename', '').encode('utf-8')
    files = request.form.get('files', '').encode('utf-8')
    if not request.form.has_key('opt') or not request.form['opt']:
      opt = 1
    else:
      opt = int(request.form['opt'])
  else:
    opt = int(request.args.get('opt'))
  try:
    if opt == 1:
      #list files and directories
      result = file_request.listDirs(dir)
    elif opt == 2:
      #Create file
      result = file_request.makeFile(dir, filename)
    elif opt == 3:
      #Create directory
      result = file_request.makeDirectory(dir, filename)
    elif opt == 4:
      #Delete a list of files or/and directories
      result = file_request.deleteItem(dir, files)
    elif opt == 5:
      #copy a lis of files or/and directories
      result = file_request.copyItem(dir, files)
    elif opt == 6:
      #rename file or directory
      result = file_request.rename(dir, filename, newfilename)
    elif opt == 7:
      result = file_request.copyItem(dir, files, del_source=True)
    elif opt == 8:
      #donwload file
      filename = request.args.get('filename').encode('utf-8')
      result = file_request.downloadFile(request.args.get('dir').encode('utf-8'),
                filename)
      try:
        return send_file(result, attachment_filename=filename, as_attachment=True)
      except:
        abort(404)
    elif opt == 9:
      truncateTo = int(request.form.get('truncate', '0'))
      result = file_request.readFile(dir, filename)
    elif opt == 11:
      #Upload file
      result = file_request.uploadFile(dir, request.files)
    elif opt == 14:
      #Copy file or directory as ...
      result = file_request.copyAsFile(dir, filename, newfilename)
    elif opt == 16:
      #zip file
      result = file_request.zipFile(dir, filename, newfilename)
    elif opt == 17:
      #zip file
      result = file_request.unzipFile(dir, filename, newfilename)
    else:
      result = "ARGS PARSE ERROR: Bad option..."
  except Exception, e:
    return str(e)
  return result

@login_required()
def editFile():
  return render_template('editFile.html', workDir='workspace',
    profile=urllib.unquote(request.args.get('profile', '')),
    projectList=getProjectList(app.config['workspace']),
    filename=urllib.unquote(request.args.get('filename', '')))

597 598 599 600 601
#Setup List of URLs
app.add_url_rule('/', 'home', home)
app.add_url_rule('/editSoftwareProfile', 'editSoftwareProfile', editSoftwareProfile)
app.add_url_rule('/inspectSoftware', 'inspectSoftware', inspectSoftware)
app.add_url_rule('/removeSoftware', 'removeSoftware', removeSoftware)
Alain Takoudjou's avatar
Alain Takoudjou committed
602 603
app.add_url_rule('/runSoftwareProfile', 'runSoftwareProfile', runSoftwareProfile, methods=['POST'])
app.add_url_rule('/viewSoftwareLog', 'viewSoftwareLog', viewSoftwareLog, methods=['GET'])
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
app.add_url_rule('/editInstanceProfile', 'editInstanceProfile', editInstanceProfile)
app.add_url_rule('/inspectInstance', 'inspectInstance', inspectInstance, methods=['GET'])
app.add_url_rule('/supervisordStatus', 'supervisordStatus', supervisordStatus, methods=['GET'])
app.add_url_rule('/runInstanceProfile', 'runInstanceProfile', runInstanceProfile, methods=['POST'])
app.add_url_rule('/removeInstance', 'removeInstance', removeInstance)
app.add_url_rule('/viewInstanceLog', 'viewInstanceLog', viewInstanceLog, methods=['GET'])
app.add_url_rule('/stopAllPartition', 'stopAllPartition', stopAllPartition, methods=['GET'])
app.add_url_rule('/tailProcess/name/<process>', 'tailProcess', tailProcess, methods=['GET'])
app.add_url_rule('/startStopProccess/name/<process>/cmd/<action>', 'startStopProccess', startStopProccess, methods=['GET'])
app.add_url_rule("/getParameterXml/<request>", 'getParameterXml', getParameterXml, methods=['GET'])
app.add_url_rule("/stopSlapgrid", 'stopSlapgrid', stopSlapgrid, methods=['POST'])
app.add_url_rule("/slapgridResult", 'slapgridResult', slapgridResult, methods=['POST'])
app.add_url_rule("/getmd5sum", 'getmd5sum', getmd5sum, methods=['POST'])
app.add_url_rule("/checkFileType", 'checkFileType', checkFileType, methods=['POST'])
app.add_url_rule("/pullProjectFiles", 'pullProjectFiles', pullProjectFiles, methods=['POST'])
app.add_url_rule("/pushProjectFiles", 'pushProjectFiles', pushProjectFiles, methods=['POST'])
app.add_url_rule("/getProjectDiff/<project>", 'getProjectDiff', getProjectDiff, methods=['GET'])
app.add_url_rule("/newBranch", 'newBranch', newBranch, methods=['POST'])
app.add_url_rule("/changeBranch", 'changeBranch', changeBranch, methods=['POST'])
app.add_url_rule("/saveFileContent", 'saveFileContent', saveFileContent, methods=['POST'])
app.add_url_rule("/removeSoftwareDir", 'removeSoftwareDir', removeSoftwareDir, methods=['POST'])
app.add_url_rule("/getFileContent", 'getFileContent', getFileContent, methods=['POST'])
app.add_url_rule("/removeFile", 'removeFile', removeFile, methods=['POST'])
app.add_url_rule("/createFile", 'createFile', createFile, methods=['POST'])
app.add_url_rule("/editCurrentProject", 'editCurrentProject', editCurrentProject)
app.add_url_rule("/getProjectStatus", 'getProjectStatus', getProjectStatus, methods=['POST'])
app.add_url_rule('/openProject/<method>', 'openProject', openProject, methods=['GET'])
app.add_url_rule("/manageProject", 'manageProject', manageProject, methods=['GET'])
app.add_url_rule("/setCurrentProject", 'setCurrentProject', setCurrentProject, methods=['POST'])
app.add_url_rule("/checkFolder", 'checkFolder', checkFolder, methods=['POST'])
app.add_url_rule('/createSoftware', 'createSoftware', createSoftware, methods=['POST'])
app.add_url_rule('/cloneRepository', 'cloneRepository', cloneRepository, methods=['POST'])
app.add_url_rule('/openFolder', 'openFolder', openFolder, methods=['POST'])
app.add_url_rule('/readFolder', 'readFolder', readFolder, methods=['POST'])
app.add_url_rule('/configRepo', 'configRepo', configRepo)
app.add_url_rule("/saveParameterXml", 'saveParameterXml', saveParameterXml, methods=['POST'])
app.add_url_rule("/getPath", 'getPath', getPath, methods=['POST'])
app.add_url_rule("/myAccount", 'myAccount', myAccount)
642
app.add_url_rule("/updateAccount", 'updateAccount', updateAccount, methods=['POST'])
643 644
app.add_url_rule("/fileBrowser", 'fileBrowser', fileBrowser, methods=['GET', 'POST'])
app.add_url_rule("/editFile", 'editFile', editFile, methods=['GET'])