# emacs-mode: -*- python-*-
from BaseConfigHandler import BaseConfigHandler
import OCWException
import published
import DocumentTemplate
from HTMLComponents import HTMLDirectoryTree, HTMLTable
from string import replace, find, split, strip, join, index
import re
import os
import cStringIO
import cPickle
import select
import stat
import sys
import tempfile
import pdb
import string
import ensimapplpath
import cmdlnpopen
import logging
import wpidn
import posixpath
from serverman.current.networkmgr import NetworkManager
from time import time, localtime, strftime
import urllib
from BaseFormChecker import BaseFormChecker
from vh3 import virthost
from vh3.modules import vhbackup as vhbackuputils
import sessionman
import traceback
from vh3.errors.vhbackup import *
from base.services.vhbackup.vhbackup_error import VhbackupError
from ftplib import FTP, error_perm
import egv
XML_ENCODING_DEFAULTS = '/etc/appliance/backup_xml.conf'
XML_ENCODING_CUSTOM = '/etc/appliance/customization/backup_xml.conf'
_waitpids = []
class execRestoreException(Exception):
__module__ = __name__
def __init__(self, err):
self.err = err
class BackupFormChecker(BaseFormChecker):
__module__ = __name__
def valid_user_selection(self, input):
return ('\n if ( (elemdict["%s"] == "user") && (elemdict["%s"] == "") ) {\n alert ("%s");\n return false;\n }\n ' % (input['data_type_name'],
input['data_user_name'],
self.T_('You have not selected any valid user!')))
def _garbage_collect_waitpids():
global _waitpids
print ('waitpids: %s' % str(_waitpids))
newpids = []
for curr_pid in _waitpids:
try:
(pid, sts,) = os.waitpid(curr_pid, os.WNOHANG)
except:
continue
if os.WIFEXITED(sts):
print ('killed waitpid %d' % curr_pid)
continue
newpids.append(curr_pid)
_waitpids = newpids
class vhbackupConfigHandler(BaseConfigHandler):
__module__ = __name__
def license_is_pro(self):
return egv.is_pro()
def _menuitems(self):
return [('form_backup',
'Backup')]
_toolbar_tmpl = published.HTMLFile('base/common/view_menu', globals())
_backup_schedules = {}
_ftplist = []
def getHelpList(self):
raise 'subclass must implement this'
def getHelpRole(self):
raise 'subclass must implement this'
def getHelpURL(self, selection):
raise 'subclass must implement this'
def default_ftpuser(self):
return 'vhbackup'
def _toolbar_html(self, REQUEST, **kw):
m = self._menuitems()
m2 = []
for i in m:
m2.append((('%s/%s' % (self.absolute_url(),
i[0])),
i[1]))
kw['menuitems'] = m2
kw['helpList'] = self.getHelpList()
kw['helpRole'] = self.getHelpRole()
kw['helpURL'] = self.getHelpURL(kw['selecteditem'])
return apply(self._toolbar_tmpl, [self,
REQUEST], kw)
_statusbar_html = published.HTMLFile('base/common/statusbar', globals())
def _bk_properties(self, REQUEST):
prop = self._bk_type_properties(REQUEST)
return prop
def _bk_email_properties(self, REQUEST):
backup_prop = []
admin_email = self._get_admin_email()
email = {'check': 'email_IDN',
'lencheck': 1,
'strict': 1,
'type': 'text',
'label': 'Email',
'name': 'email',
'value': admin_email}
backup_prop.append(email)
return backup_prop
def _res_select_properties(self, REQUEST):
""" this function returns a list of property dictionaries that can be
passed onto base/common/form in order to draw the list of files
on the ftp server, so that you can choose which file to restore
When the final HTML is drawn, it looks like:
[filename1]
[filename2]
[filename1, filename2] are stored in the session in the file_list
variable. When the form is actually posted, we find out which
file was selected by examining the checkboxes that were clicked,
and then using that, we index into the file_list session variable
and find out the actual file name
"""
prop = []
session = sessionman.getSession(REQUEST)
file_list = session['file_list']
if file_list:
index = 0
for data in file_list:
prop.append({'type': 'checkbox1',
'name': ('file%d' % index),
'value': str(index),
'label': self.beautify_restore_filename(data)})
index += 1
prop.append({'type': 'label',
'value': self.T_('Select Options'),
'label': ''})
prop.append({'type': 'checkbox1',
'name': 'recurse',
'value': 'on',
'label': self.T_('Enable Recurse')})
else:
prop.append({'type': 'label',
'value': 'No tar files found',
'label': ''})
return prop
def _bk_ftp_properties(self):
backup_prop = []
ftp_server = {'type': 'text',
'name': 'ftp_server',
'value': 'localhost',
'label': 'FTP Server',
'size': '20',
'check': 'string_IDN',
'lencheck': 1}
ftp_username = {'type': 'text',
'name': 'ftp_username',
'value': self.default_ftpuser(),
'label': 'FTP Login',
'size': '20',
'check': 'ftpuser'}
ftp_password = {'type': 'password',
'name': 'ftp_password',
'value': '',
'label': 'FTP Password',
'size': '8',
'check': 'password'}
ftp_location = {'type': 'text',
'name': 'ftp_location',
'value': '',
'label': 'FTP Location',
'size': '20'}
backup_prop.append(ftp_server)
backup_prop.append(ftp_username)
backup_prop.append(ftp_password)
backup_prop.append(ftp_location)
backup_prop.append({'check': 'string_IDN',
'label': 'FTP server',
'name': 'ftp_server'})
backup_prop.append({'check': 'length',
'label': 'FTP Login',
'name': 'ftp_username'})
backup_prop.append({'check': 'length',
'label': 'Passwords',
'name': 'ftp_password'})
return backup_prop
def _get_dropdownbox(self, list):
dropdown = []
for list_value in list:
name = list_value[0]
id = list_value[1]
dropdown.append({'label': name,
'value': id,
'selected': 0})
return dropdown
def _set_form_value(self, prop, key, value):
flag = 0
for entry in prop:
if (entry.has_key('name') and (entry['name'] == key)):
flag = 1
break
if (flag == 0):
return
if ((entry['type'] == 'radio') or (entry['type'] == 'select')):
for option in entry['options']:
if (str(option['value']) == str(value)):
option['selected'] = 1
else:
option['selected'] = 0
return
if entry.has_key('value'):
entry['value'] = value
def getlist_for_dropdown(self, start, end, editdata):
list = ''
for each_val in range(start, (end + 1)):
if ((editdata != None) and (int(editdata) == each_val)):
list = (list + ('