# 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 + ('