mythbuntu-dev team mailing list archive
-
mythbuntu-dev team
-
Mailing list archive
-
Message #00064
[Merge] lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-common
Thomas Mashos has proposed merging lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-common.
Requested reviews:
mythbuntu-dev (mythbuntu-dev)
For more details, see:
https://code.launchpad.net/~tgm4883/mythbuntu/mythbuntu-common/+merge/70659
Moved -bare into 2 separate packages. Made it a recommends and suggests of -common
--
https://code.launchpad.net/~tgm4883/mythbuntu/mythbuntu-common/+merge/70659
Your team mythbuntu-dev is requested to review the proposed merge of lp:~tgm4883/mythbuntu/mythbuntu-common into lp:~mythbuntu-dev/mythbuntu/mythbuntu-common.
=== removed directory 'bare'
=== removed file 'bare/backup-task.py'
--- bare/backup-task.py 2011-04-17 19:07:22 +0000
+++ bare/backup-task.py 1970-01-01 00:00:00 +0000
@@ -1,27 +0,0 @@
-#!/usr/bin/env python
-
-from mythbackup import Backup
-import ConfigParser
-
-CONFIGFILENAME = "mythbuntu-bare-client.conf"
-CONFIGPATH = "/etc/default/"
-CONFIGFILE = CONFIGPATH+CONFIGFILENAME
-
-## Read config file
-config = ConfigParser.ConfigParser()
-config.read(CONFIGFILE)
-
-## Check if managed and if so, then update
-managed = config.get("General", "managed")
-if managed:
- pipe = subprocess.Popen(["/usr/share/mythbuntu-bare/update-task.py"], stdout=subprocess.PIPE).communicate()
-
-## Reread config file in case it was updated
-config.read(CONFIGFILE)
-DB = config.get("Backup", "database")
-storagedir = config.get("Backup", "storagedir")
-
-## Run backup job
-Backup().backup_job(DB, storagedir)
-
-
=== removed file 'bare/mythbackup.py'
--- bare/mythbackup.py 2011-05-19 02:16:18 +0000
+++ bare/mythbackup.py 1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import tarfile
-import time
-import shutil
-import subprocess
-import platform
-
-class Backup():
-
- def backup_job(self, BackupDB=True, Location="/var/lib/mythtv/bare"):
- """Backup all the files"""
- ## Check backup directory exists
- if not os.path.exists(Location):
- os.makedirs(Location)
- ## Array of files to Backup
- BACKUPFILES = [
- "/etc/mythtv/config.xml",
- "/etc/mythtv/mysql.txt",
- "/etc/lirc/lircd.conf",
- "/etc/lirc/hardware.conf",
- "/etc/hostname",
- "/etc/hosts",
- ]
- USER=os.getenv("HOME")
- BACKUPFILES.append(USER+"/.lirc")
- ## Set up backup location
- TMPDIR="/tmp/mythbuntu-bare"
- if not os.path.exists(TMPDIR):
- os.makedirs(TMPDIR)
- BACKUPFILES.append(TMPDIR)
- ## Set status file
- STATUSFILE="/tmp/mythbuntu-bare-status"
- if os.path.isfile(STATUSFILE):
- os.remove(STATUSFILE)
- timestamp=time.strftime("%Y%m%d-%H%M", time.localtime())
- ## Backup database only if told to do so
- DBB=""
- MBE=""
- if os.path.isdir("/usr/share/doc/mythtv-backend-master"):
- MBE="_MBE"
- DBB="_NODB"
- if BackupDB == True:
- #Run DB Backup
- os.system("echo '20\nBacking up database (this could take a few minutes)'>"+STATUSFILE)
- backupscript="/usr/share/mythtv/mythconverg_backup.pl"
- pipe = subprocess.Popen([backupscript, '--directory', TMPDIR], stdout=subprocess.PIPE).communicate()
- DBB="_YESDB"
- ## Setup for final tar file
- hostname = platform.node()
- tarfilename=Location+'/mythbuntu-system-backup_'+hostname+'_'+timestamp+MBE+DBB+'.tar.gz'
- TF=tarfile.open(tarfilename,mode='w:gz')
- os.system("echo '90\nZipping up files'>"+STATUSFILE)
- ## Add files to tarball
- for item in BACKUPFILES:
- if os.path.exists(item):
- TF.add(item)
- TF.close()
- ## Remove tmp Backup directory and status file
- if os.path.exists(TMPDIR):
- shutil.rmtree(TMPDIR)
- if os.path.isfile(STATUSFILE):
- os.remove(STATUSFILE)
-
=== removed file 'bare/mythbareupdate.py'
--- bare/mythbareupdate.py 2011-04-17 19:07:22 +0000
+++ bare/mythbareupdate.py 1970-01-01 00:00:00 +0000
@@ -1,100 +0,0 @@
-#!/usr/bin/env python
-
-import ConfigParser
-import os
-import shutil
-import hashlib
-
-CONFIGFILENAME = "mythbuntu-bare-client.conf"
-CONFIGPATH = "/etc/default/"
-
-CHECKSUMFILE = "/tmp/CHECKSUM"
-CONFIGFILE = CONFIGPATH+CONFIGFILENAME
-TMPCONFIGFILE = "/tmp/"+CONFIGFILENAME
-
-class Update():
-
- def update_job(self, ServerIP=None):
- if os.path.isfile(CONFIGFILE):
- NEW = False
- config = ConfigParser.ConfigParser()
- config.read(CONFIGFILE)
- self.Revision = config.get("General", "Revision")
- ServerIP = config.get("General", "ServerIP")
- ServerURL = "http://"+ServerIP+"/mythbuntu-bare/"
- else:
- NEW = True
- self.Revision = 0
- ServerURL = "http://"+ServerIP+"/mythbuntu-bare/"
-
- ## Check tmp dir for update file
- if os.path.isfile(TMPCONFIGFILE):
- NEW = False
- self.process_updates()
- os.remove(TMPCONFIGFILE)
-
- ## Download update file from server
- download_successful=False
- try:
- self.check_server(CONFIGFILENAME,ServerURL)
- self.check_server("CHECKSUM",ServerURL)
- download_successful=True
- except:
- print "ERROR: Couldn't update files from server"
-
- ## If files downloaded from server, get revision and process them
- if download_successful:
- if NEW == False:
- config = ConfigParser.ConfigParser()
- config.read(CONFIGFILE)
- Revision = config.get("General", "Revision")
- else:
- NEW = False
- Revision = 0
- self.process_updates()
-
- ## Remove temp files
- if os.path.isfile(TMPCONFIGFILE):
- os.remove(TMPCONFIGFILE)
- if os.path.isfile("/tmp/CHECKSUM"):
- os.remove("/tmp/CHECKSUM")
-
- def check_server(self,file_name,base_url):
- from urllib2 import Request, urlopen, URLError, HTTPError
- #create the url and the request
- url = base_url + file_name
- req = Request(url)
- # Open the url
- f = urlopen(req)
- # Open our local file for writing
- local_file = open("/tmp/"+file_name, "w")
- #Write to our local file
- local_file.write(f.read())
- local_file.close()
-
- def process_updates(self):
- ## Get revision
- tempconfig = ConfigParser.ConfigParser()
- tempconfig.read(TMPCONFIGFILE)
- tempRevision = tempconfig.get("General", "Revision")
- ## If revision is newer, process.
- if int(self.Revision) < int(tempRevision):
- ## Calculate checksum
- m = hashlib.md5()
- f = open(TMPCONFIGFILE)
- for line in f:
- m.update(line)
- calcsum = m.hexdigest()
- f.close()
- chksumconfig = ConfigParser.ConfigParser()
- chksumconfig.read(CHECKSUMFILE)
- checksum = chksumconfig.get("Checksum", "md5")
- if calcsum == checksum:
- ## If checksums match, copy file into dir
- shutil.copyfile(TMPCONFIGFILE, CONFIGFILE)
- else:
- print "Error: Checksum failed"
-
-#Update().update_job("192.168.0.41")
-
-
=== removed file 'bare/mythrestore.py'
--- bare/mythrestore.py 2011-04-17 18:47:52 +0000
+++ bare/mythrestore.py 1970-01-01 00:00:00 +0000
@@ -1,41 +0,0 @@
-#!/usr/bin/env python
-
-import shutil
-import os
-import time
-import tarfile
-
-class Restore():
-
- def restore_job(self, Location, RestoreDB):
- USER=os.getenv("HOME")
- ## Set temp directory and status file
- TMPDIR="/tmp/mythbuntu-bare/"
- STATUSFILE="/tmp/mythbuntu-bare-status"
- ##Remove temp DB dir and statusfile first in case it already exists
- if os.path.exists(STATUSFILE):
- os.remove(STATUSFILE)
- if os.path.exists(TMPDIR):
- shutil.rmtree(TMPDIR)
- ## Open and Extract tarfile
- os.system("echo '30\nRestoring configuration files'>"+STATUSFILE)
- TF=tarfile.open(Location,mode='r')
- TF.extractall(path="/", members=None)
- TF.close()
- ## Update mythtv db password with backed up password
- os.system("DEBIAN_FRONTEND=noninteractive dpkg-reconfigure mythtv-database")
- if os.path.isfile("/usr/share/doc/mythtv-backend-master"):
- if RestoreDB == True:
- print "Yes we are restoring the database!"
- os.system("echo '40\nRestoring database (this could take a few minutes)'>"+STATUSFILE)
- ##TODO
- restorescript="/usr/share/mythtv/mythconverg_restore.pl"
- pipe = subprocess.Popen([restorescript, '--drop_database', '--create_database', '--directory', TMPDIR], stdout=subprocess.PIPE).communicate()
- ## Remove Temp directory and status file
- os.system("echo '90\nCleaning up temp files'>"+STATUSFILE)
- time.sleep(1)
- if os.path.exists(TMPDIR):
- shutil.rmtree(TMPDIR)
- if os.path.exists(STATUSFILE):
- os.remove(STATUSFILE)
-
=== removed file 'bare/update-task.py'
--- bare/update-task.py 2011-02-24 01:44:06 +0000
+++ bare/update-task.py 1970-01-01 00:00:00 +0000
@@ -1,7 +0,0 @@
-#!/usr/bin/env python
-
-from mythbareupdate import Update
-
-## Update from server. Managed is checked in other file
-Update().update_job()
-
=== removed file 'bare/updater.py'
--- bare/updater.py 2011-04-17 19:07:22 +0000
+++ bare/updater.py 1970-01-01 00:00:00 +0000
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-
-
-
-class CronUpdater():
-
- def generate_cron_schedule(self):
- import ConfigParser
- config = ConfigParser.ConfigParser()
- config.read("/etc/default/mythbuntu-bare-client.conf")
- managed = config.get("General", "managed")
- schedule = config.get("Backup", "schedule")
- day = config.get("Backup", "day")
- hour = config.get("Backup", "hour")
- minute = config.get("Backup", "minute")
- weekday = config.get("Backup", "weekday")
- f = open("/etc/cron.d/mythbuntu-bare","w")
- if not schedule == "disabled":
- f.write(minute+" "+hour+" "+day+" "+"*"+" "+weekday+" root /usr/share/mythbuntu-bare/backup-task.py\n")
- if managed == True:
- f.write("41 * * * * root /usr/share/mythbuntu-bare/update-task.py\n")
- f.close()
=== modified file 'debian/changelog'
--- debian/changelog 2011-05-19 02:37:08 +0000
+++ debian/changelog 2011-08-07 00:31:33 +0000
@@ -1,3 +1,9 @@
+mythbuntu-common (0.59-0ubuntu3) UNRELEASED; urgency=low
+
+ * Removed Mythbuntu-bare, now in a separate package
+
+ -- Thomas Mashos <thomas@xxxxxxxxxx> Wed, 29 Jun 2011 12:20:27 -0700
+
mythbuntu-common (0.59-0ubuntu2) UNRELEASED; urgency=low
* Fix database backup not backing up when selected
=== modified file 'debian/control'
--- debian/control 2011-02-24 02:58:34 +0000
+++ debian/control 2011-08-07 00:31:33 +0000
@@ -21,7 +21,8 @@
software-properties-gtk,
libdvdread4
XB-Python-Version: ${python:Versions}
-Recommends: nvidia-common
+Recommends: nvidia-common, mythbuntu-bare-client
+Suggests: mythbuntu-bare-console
Description: Mythbuntu application support functions
This library is used by multiple mythbuntu applications to provide a common
interface for several very commonly used functions.
=== modified file 'debian/install'
--- debian/install 2011-02-24 02:24:58 +0000
+++ debian/install 2011-08-07 00:31:33 +0000
@@ -1,2 +1,1 @@
debian/mythbuntu.make usr/share/mythbuntu
-bare usr/share/mythbuntu
=== removed file 'plugins/python/mythbuntu-bare.py'
--- plugins/python/mythbuntu-bare.py 2011-05-19 02:37:08 +0000
+++ plugins/python/mythbuntu-bare.py 1970-01-01 00:00:00 +0000
@@ -1,551 +0,0 @@
-## -*- coding: utf-8 -*-
-#
-# «mythbuntu-bare» - A Plugin to assist in backing up and restoring the mythtv DB
-#
-# Copyright (C) 2010, Thomas Mashos, for Mythbuntu
-#
-#
-# Mythbuntu is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this application; if not, write to the Free Software Foundation, Inc., 51
-# Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-##################################################################################
-
-from MythbuntuControlCentre.plugin import MCCPlugin
-import gtk
-import time
-import os
-import tarfile
-import shutil
-import subprocess
-from threading import Thread
-import sys
-import ConfigParser
-sys.path.append("/usr/share/mythbuntu/bare")
-from mythbackup import Backup
-from mythrestore import Restore
-
-
-class MythbuntuBaRePlugin(MCCPlugin):
- """A Plugin to assist in backing up and restoring the mythtv DB"""
- #
- #Load GUI & Calculate Changes
- #
- CONFIGFILE = "/etc/default/mythbuntu-bare-client.conf"
-
- USER=os.getenv("HOME")
-
- BACKUPFILES = [
- "/etc/mythtv/config.xml",
- "/etc/mythtv/mysql.txt",
- "/etc/lirc/lircd.conf",
- "/etc/lirc/hardware.conf",
- "/etc/udev/rules.d"
- ]
-
- BACKUPFILES.append(USER+"/.lirc")
-
- BACKUP_LOCATION = USER
- BACKUP_DB=False
- restore_file = '/tmp'
-
- IsTarFile = False
- ValidNewConf = False
-
- def __init__(self):
- #Initialize parent class
- information = {}
- information["name"] = "Backup and Restore"
- information["icon"] = "revert"
- information["ui"] = "tab_mythbuntu-bare"
- MCCPlugin.__init__(self,information)
- import ConfigParser
- self.config = ConfigParser.ConfigParser()
-
- def captureState(self):
- """Determines the state of the items on managed by this plugin
- and stores it into the plugin's own internal structures"""
- import os
- self.changes = {}
- try:
- self.config.read(self.CONFIGFILE)
- self.changes['serverip'] = self.config.get("General", "serverip")
- self.changes['managed'] = self.config.get("General", "managed")
- if str.lower(self.changes['managed']) == "true":
- self.managed_label.set_text("This machine is current in managed mode")
- self.radio_convert.set_sensitive(False)
- self.backup_schedule.set_sensitive(False)
- self.changes['BackupLocation'] = self.config.get("Backup", "storagedir")
- self.changes['backup_db'] = self.config.get("Backup", "db")
- self.changes['backup_schedule'] = self.config.get("Backup", "schedule")
- self.changes['backup_schedule_day'] = self.config.get("Backup", "day")
- self.changes['backup_schedule_hour'] = self.config.get("Backup", "hour")
- self.changes['backup_schedule_minute'] = self.config.get("Backup", "minute")
- self.changes['backup_schedule_weekday'] = self.config.get("Backup", "weekday")
- self.db_backup_checkbutton.set_active(int(self.config.get("Backup", "db")))
- except:
- self.changes['serverip'] = "127.0.0.1"
- self.changes['managed'] = "False"
- self.changes['BackupLocation'] = "/var/lib/mythtv/bare/"
- self.changes['backup_db'] = False
- self.changes['backup_schedule'] = "disabled"
- self.changes['backup_schedule_day'] = "*"
- self.changes['backup_schedule_hour'] = "0"
- self.changes['backup_schedule_minute'] = "00"
- self.changes['backup_schedule_weekday'] = "*"
- if not self.query_installed('mythtv-backend-master'):
- self.backup_db_label.set_text("Database can only be backed up from master backend")
- self.db_backup_checkbutton.set_sensitive(False)
- self.db_backup_checkbutton.set_active(False)
-
- def applyStateToGUI(self):
- """Takes the current state information and sets the GUI
- for this plugin"""
- self.button_box.hide()
- self.hide_tabs()
- self.vbox_start.show()
-# self.vbox_backup.hide()
- self.vbox_restore.hide()
- self.vbox_choices.hide()
- self.radio_backup.set_active(False)
- ## Set radio buttons to default (off)
- self.radio_backup_default_off.set_active(True)
- self.radio_backup_default_off.hide()
- self.radio_schedule_default_off.set_active(True)
- self.radio_schedule_default_off.hide()
- self.backup_schedule_off.set_active(True)
- self.backup_schedule_off.hide()
- self.radio_restore.set_active(False)
- self.backup_now.set_active(False)
- self.backup_dir_button.set_active(False)
-# self.on_radio_backup_toggled(None)
- self.on_backup_dir_button_toggled(None)
-# self.on_backup_schedule_toggled(None)
- if self.changes['backup_schedule'] == "disabled":
- self.scheduled_label.set_text("Disabled")
- self.schedule_disabled_button.set_active(True)
- elif self.changes['backup_schedule'] == "daily":
- self.schedule_daily_button.set_active(True)
- elif self.changes['backup_schedule'] == "weekly":
- self.schedule_weekly_button.set_active(True)
- wday = int(self.changes['backup_schedule_weekday'])
- self.weekly_combobox.set_active(wday)
- self.hbox_schedule_weekly.show()
- elif self.changes['backup_schedule'] == "monthly":
- self.schedule_monthly_button.set_active(True)
- md = int(self.changes['backup_schedule_day'])
- mday = md-1
- self.monthly_combobox.set_active(mday)
- self.hbox_schedule_monthly.show()
- if not self.changes['backup_schedule'] == "disabled":
- shour = self.changes['backup_schedule_hour']
- self.schedule_hour_combobox.set_active(int(shour))
- smin = int(self.changes['backup_schedule_minute'])/5
- self.schedule_minute_combobox.set_active(int(smin))
- self.restore_label_isfile.hide()
- self.managed_label_isfile.hide()
- ## Filter only tar.gz files for restore
- filter = gtk.FileFilter()
- filter.set_name("Backup Files")
- filter.add_pattern("*.tar.gz")
- self.restore_file.add_filter(filter)
- self.restore_file.unselect_all()
- conffilter = gtk.FileFilter()
- conffilter.set_name("Config Files")
- conffilter.add_pattern("*.conf")
- self.managedfilechooser.add_filter(conffilter)
- self.managedfilechooser.unselect_all()
- self.backup_location.unselect_all()
- ## Disable non-implemented items
- self.backup_u1_button.hide()
- self.backup_dropbox_button.hide()
- self.backup_dir_button.hide() ## Only disabled since no other locations are available
-
- def compareState(self):
- """Determines what items have been modified on this plugin"""
- MCCPlugin.clearParentState(self)
- if self.radio_backup.get_active():
- if self.backup_dir_button.get_active():
- self.BACKUP_LOCATION=self.backup_location.get_filename()
- self.BACKUP_DB = self.db_backup_checkbutton.get_active()
- if self.backup_now.get_active():
- self._markReconfigureUser('Backup Now',self.BACKUP_LOCATION)
- elif self.backup_schedule.get_active():
- #TODO
- if self.schedule_disabled_button.get_active():
- self._markReconfigureRoot('Backup Schedule', False)
- else:
- self._markReconfigureRoot('Backup Schedule', True)
- self._markReconfigureRoot('Backup Hour', self.schedule_hour_combobox.get_active_text())
- self._markReconfigureRoot('Backup Minute', self.schedule_minute_combobox.get_active_text())
- self._markReconfigureRoot('Backup Location', self.BACKUP_LOCATION)
- self._markReconfigureRoot('Backup Database', self.db_backup_checkbutton.get_active())
- if self.schedule_daily_button.get_active():
- self._markReconfigureRoot('Backup Daily', True)
- elif self.schedule_weekly_button.get_active():
- self._markReconfigureRoot('Backup Weekly', self.weekly_combobox.get_active())
- elif self.schedule_monthly_button.get_active():
- self._markReconfigureRoot('Backup Monthly', self.monthly_combobox.get_active_text())
- if self.radio_restore.get_active():
- self._markReconfigureRoot('restore',self.restore_file.get_filename())
- if self.restore_db.get_active():
- self._markReconfigureRoot('restore_db',True)
- if self.radio_convert.get_active():
- self._markReconfigureRoot('convert',self.managedfilechooser.get_filename())
-
- #
- # Callbacks
- #
-
- def on_restore_file_selection_changed(self,widget,data=None):
- if self.restore_file.get_filename():
- tarfilename=self.restore_file.get_filename()
- if tarfile.is_tarfile(tarfilename):
- TF=tarfile.open(tarfilename,mode='r:gz')
- for line in TF.getnames():
- if line.endswith('sql.gz'):
- self.RESTORE_DB_EXISTS=True
- break
- else:
- self.RESTORE_DB_EXISTS=False
- self.restore_db.set_active(False)
- TF.close()
- self.IsTarFile=True
- self.restore_label_isfile.hide()
- else:
- self.restore_label_isfile.show()
-
- def on_managedfilechooser_selection_changed(self,widget,data=None):
- if self.managedfilechooser.get_filename():
- newconfigfilename=self.managedfilechooser.get_filename()
- try:
- self.newconfig = ConfigParser.ConfigParser()
- self.newconfig.read(newconfigfilename)
- self.changes['serverip'] = newconfig.get("General", "serverip")
- self.changes['managed'] = newconfig.get("General", "managed")
- self.changes['BackupLocation'] = newconfig.get("Backup", "storagedir")
- self.changes['backup_db'] = newconfig.get("Backup", "db")
- self.changes['backup_schedule_day'] = newconfig.get("Backup", "day")
- self.changes['backup_schedule_hour'] = newconfig.get("Backup", "hour")
- self.changes['backup_schedule_minute'] = newconfig.get("Backup", "minute")
- self.changes['backup_schedule_weekday'] = newconfig.get("Backup", "weekday")
- self.changes['backup_schedule'] = newconfig.get("Backup", "schedule")
- self.ValidNewConf = True
- self.managed_label_isfile.hide()
- except:
- self.ValidNewConf = False
- self.managed_label_isfile.show()
-
- def on_button_started_clicked(self,widget,data=None):
- self.tab_history=[]
- self.CUR_TAB = "vbox_choices"
- self.tab_history.append("vbox_start")
- self.vbox_start.hide()
- self.vbox_choices.show()
- self.button_box.show()
- self.next_button.set_sensitive(True)
-
- def on_next_button_clicked(self,widget,data=None):
- self.change_tab(self.CUR_TAB,"next")
-
- def on_back_button_clicked(self,widget,data=None):
- self.hide_tabs()
- if self.CUR_TAB == "vbox_final":
- self.next_button.set_sensitive(True)
- self.CUR_TAB = self.tab_history.pop()
- f = getattr(self, self.CUR_TAB)
- f.show()
- if self.CUR_TAB == "vbox_start":
- self.button_box.hide()
-
- def change_tab(self,CURRENT,DIRECTION):
- """Monkee around to display the correct wizard page"""
- self.hide_tabs()
- if self.CUR_TAB == "vbox_choices":
- if self.radio_backup_default_off.get_active() == False:
- self.tab_history.append(self.CUR_TAB)
- if self.radio_backup.get_active():
- self.CUR_TAB = "vbox_backup_choice"
- self.vbox_backup_choice.show()
- elif self.radio_convert.get_active():
- self.CUR_TAB = "vbox_managed_convert"
- self.vbox_managed_convert.show()
- else:
- self.CUR_TAB = "vbox_restore"
- self.vbox_restore.show()
- else:
- self.vbox_choices.show()
- elif self.CUR_TAB == "vbox_backup_choice":
- self.tab_history.append(self.CUR_TAB)
- if self.backup_now.get_active():
- self.CUR_TAB = "vbox_backup_location"
- self.vbox_backup_location.show()
- self.backup_type = "now"
- elif self.backup_schedule.get_active():
- self.CUR_TAB = "vbox_set_schedule"
- self.vbox_set_schedule.show()
- self.backup_type = "scheduled"
- else:
- self.vbox_backup_choice.show()
- elif self.CUR_TAB == "vbox_restore":
- if self.IsTarFile == True:
- self.tab_history.append(self.CUR_TAB)
- if self.RESTORE_DB_EXISTS:
- self.CUR_TAB = "vbox_restore_db"
- self.vbox_restore_db.show()
- else:
- self.CUR_TAB = "vbox_final"
- self.vbox_final.show()
- self.next_button.set_sensitive(False)
- else:
- self.vbox_restore.show()
- elif self.CUR_TAB == "vbox_restore_db":
- self.tab_history.append(self.CUR_TAB)
- self.CUR_TAB = "vbox_final"
- self.vbox_final.show()
- self.next_button.set_sensitive(False)
- elif self.CUR_TAB == "vbox_backup_location":
- self.tab_history.append(self.CUR_TAB)
- self.CUR_TAB = "vbox_final"
- self.vbox_final.show()
- self.next_button.set_sensitive(False)
- elif self.CUR_TAB == "vbox_set_schedule":
- if self.schedule_daily_button.get_active() or (self.schedule_monthly_button.get_active() and not self.monthly_combobox.get_active_text() == None) or (self.schedule_weekly_button.get_active() and not self.weekly_combobox.get_active_text() == None):
- self.tab_history.append(self.CUR_TAB)
- self.CUR_TAB = "vbox_backup_location"
- self.vbox_backup_location.show()
- elif self.schedule_disabled_button.get_active():
- self.tab_history.append(self.CUR_TAB)
- self.CUR_TAB = "vbox_final"
- self.vbox_final.show()
- self.next_button.set_sensitive(False)
- elif self.CUR_TAB == "vbox_managed_convert":
- if self.ValidNewConf == True:
- self.tab_history.append(self.CUR_TAB)
- self.CUR_TAB = "vbox_final"
- self.vbox_final.show()
- self.next_button.set_sensitive(False)
- else:
- self.vbox_managed_convert.show()
-
- def backup_setter(self,widget,data=None):
- radio_convert = self.radio_convert.get_active()
- radio_restore = self.radio_restore.get_active()
- radio_backup = self.radio_backup.get_active()
- self.set_final_label()
-
- def schedule_setter(self,widget,data=None):
- self.hbox_schedule.hide()
- self.hbox_schedule_weekly.hide()
- self.hbox_schedule_monthly.hide()
- self.monthly_text_label.hide()
- self.monthly_the_label.hide()
- self.schedule_label_sent.hide()
- texthour = self.schedule_hour_combobox.get_active_text()
- textminute = self.schedule_minute_combobox.get_active_text()
- if self.schedule_weekly_button.get_active():
- self.schedule_label_sent.show()
- self.hbox_schedule.show()
- self.hbox_schedule_weekly.show()
- self.schedule_label_sent.set_text("Scheduled backup will be set to run weekly on "+str(self.weekly_combobox.get_active_text())+" at "+texthour+":"+textminute)
- elif self.schedule_monthly_button.get_active():
- self.schedule_label_sent.show()
- self.monthly_text_label.show()
- self.monthly_the_label.show()
- self.hbox_schedule.show()
- self.hbox_schedule_monthly.show()
- self.schedule_label_sent.set_text("Scheduled backup will be set to run monthly on the "+str(self.monthly_combobox.get_active_text())+" day at "+texthour+":"+textminute)
- elif self.schedule_daily_button.get_active():
- self.schedule_label_sent.show()
- self.schedule_label_sent.set_text("Scheduled backup will be set to run daily at "+texthour+":"+textminute)
- self.set_final_label()
-
- def set_final_label(self):
- if self.radio_convert.get_active():
- self.job_label.set_text("Please click apply to convert the machine to managed mode")
- if self.radio_restore.get_active():
- self.job_label.set_text("Please click apply to perform the restore procedure")
- if self.radio_backup.get_active():
- if self.backup_schedule.get_active():
- self.job_label.set_text("Please click apply to perform the specified scheduling changes")
- else:
- self.job_label.set_text("Please click apply to perform the backup procedure")
-
- def on_backup_dir_button_toggled(self,widget,data=None):
- """Prompt user for save location if needed"""
- self.hide_all()
- if self.backup_dir_button.get_active():
- self.backup_location.show()
- elif self.backup_u1_button.get_active():
- self.preconfigured_label.show()
- elif self.backup_dropbox_button.get_active():
- self.preconfigured_label.show()
- else:
- print "Error: Unknown option selected"
-
-# def on_backup_schedule_toggled(self,widget,data=None):
-# """Show backup schedule options if needed"""
-# if self.backup_schedule.get_active():
-# self.backup_schedule_status.show()
-# if self.changes['BackupLocation'] != "NOWHERE":
-# self.backup_location.set_filename(self.changes['BackupLocation'])
-# else:
-# self.backup_schedule_status.hide()
-
- def hide_tabs(self):
- self.vbox_start.hide()
- self.vbox_restore.hide()
- self.vbox_restore_db.hide()
- self.vbox_backup_schedule.hide()
- self.vbox_choices.hide()
- self.vbox_backup_choice.hide()
- self.vbox_backup_location.hide()
- self.vbox_final.hide()
- self.vbox_set_schedule.hide()
- self.vbox_managed_convert.hide()
-
- def hide_all(self):
- """Hide everything before showing what is needed"""
- self.preconfigured_label.hide()
- self.backup_location.hide()
- self.hbox_schedule.hide()
- self.hbox_schedule_weekly.hide()
- self.hbox_schedule_monthly.hide()
- self.monthly_text_label.hide()
- self.monthly_the_label.hide()
- self.schedule_label_sent.hide()
-
- #
- # Process selected activities
- #
-
- def root_scripted_changes(self,reconfigure):
- """System-wide changes that need root access to be applied.
- This function is ran by the dbus backend"""
- self.config.add_section("Backup")
- time.sleep(2)
- RESTORE_SET=False
- STATUSFILE = "/tmp/mythbuntu-bare-status"
- for item in reconfigure:
- if item == "Save Backup Location":
- self.BACKUP_LOCATION = reconfigure[item]
- for item in reconfigure:
- if item == "Backup Schedule":
- if reconfigure[item] == False:
- self.emit_progress("Removing scheduled job", 50)
- if os.path.isfile("/etc/cron.d/mythbuntu-bare"):
- os.remove("/etc/cron.d/mythbuntu-bare")
- elif reconfigure[item] == True:
- CONFIGFILE = "/etc/default/mythbuntu-bare-client.conf"
- import ConfigParser
- config = ConfigParser.ConfigParser()
- config.add_section('General')
- config.add_section('Backup')
- config.set('General', 'serverip', '127.0.0.1')
- config.set('General', 'managed', 'false')
- config.set('General', 'revision', '1')
- for subitem in reconfigure:
- if subitem == 'Backup Hour':
- config.set('Backup', 'hour', reconfigure[subitem])
- elif subitem == 'Backup Minute':
- config.set('Backup', 'minute', reconfigure[subitem])
- elif subitem == 'Backup Location':
- config.set('Backup', 'storagedir', reconfigure[subitem])
- elif subitem == 'Backup Database':
- config.set('Backup', 'db', reconfigure[subitem])
- elif subitem == 'Backup Daily':
- config.set('Backup', 'schedule', 'daily')
- config.set('Backup', 'day', '*')
- config.set('Backup', 'weekday', '*')
- elif subitem == 'Backup Weekly':
- config.set('Backup', 'schedule', 'weekly')
- config.set('Backup', 'day', '*')
- config.set('Backup', 'weekday', reconfigure[subitem])
- elif subitem == 'Backup Monthly':
- config.set('Backup', 'schedule', 'monthly')
- config.set('Backup', 'day', reconfigure[subitem])
- config.set('Backup', 'weekday', '*')
- with open(CONFIGFILE, 'wb') as conffile:
- config.write(conffile)
- sys.path.append("/usr/share/mythbuntu/bare")
- from updater import CronUpdater
- CronUpdater().generate_cron_schedule()
- elif item == "restore":
- RESTORE_LOCATION=reconfigure[item]
- RESTORE_SET=True
- elif item == "restore_db":
- RESTORE_DB=True
- elif item == "convert":
- PATH=reconfigure[item]
- try:
- shutil.move(PATH, "/etc/default/mythbuntu-bare-client.conf")
- except:
- print "Unable to import file"
- if RESTORE_SET == True and RESTORE_DB == True:
- #TODO
- rj = Thread(target=Restore().restore_job, args=(RESTORE_LOCATION,RESTORE_DB))
- rj.start()
- self.emit_progress("Restoring files", 20)
- time.sleep(2)
- status=20
- while rj.isAlive():
- f = open(STATUSFILE, 'r')
- ANS1 = f.readline().rstrip('\n')
- ANS2 = f.readline().rstrip('\n')
- status = int(ANS1)
- self.emit_progress(ANS2, status)
- f.close()
- while ANS2 == 'Restoring database (this could take a few minutes)':
- f = open(STATUSFILE, 'r')
- ANS1 = f.readline().rstrip('\n')
- ANS2 = f.readline().rstrip('\n')
- f.close()
- if status <= 90:
- status=status+0.1
- self.emit_progress(ANS2, status)
- time.sleep(0.1)
- time.sleep(0.1)
- self.emit_progress("Restore Job Complete", 100)
- time.sleep(2)
-
-
- def user_scripted_changes(self,reconfigure):
- """Local changes that can be performed by the user account.
- This function will be ran by the frontend"""
- time.sleep(0.5)
- for item in reconfigure:
- if item == "Backup Now":
- STATUSFILE = "/tmp/mythbuntu-bare-status"
- bj = Thread(target=Backup().backup_job, args=(self.BACKUP_DB,self.BACKUP_LOCATION))
- bj.start()
- self.emit_progress("Starting Backup", 10)
- time.sleep(2)
- status=10
- while bj.isAlive():
- f = open(STATUSFILE, 'r')
- ANS1 = f.readline().rstrip('\n')
- ANS2 = f.readline().rstrip('\n')
- status = int(ANS1)
- self.emit_progress(ANS2, status)
- f.close()
- while ANS2 == 'Backing up database (this could take a few minutes)':
- f = open(STATUSFILE, 'r')
- ANS1 = f.readline().rstrip('\n')
- ANS2 = f.readline().rstrip('\n')
- f.close()
- if status <= 85:
- status=status+0.1
- self.emit_progress(ANS2, status)
- time.sleep(0.1)
- time.sleep(0.1)
- self.emit_progress("Backup Finished", 100)
- time.sleep(2)
=== removed file 'plugins/ui/tab_mythbuntu-bare.ui'
--- plugins/ui/tab_mythbuntu-bare.ui 2011-02-24 01:44:06 +0000
+++ plugins/ui/tab_mythbuntu-bare.ui 1970-01-01 00:00:00 +0000
@@ -1,1477 +0,0 @@
-<?xml version="1.0"?>
-<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy toplevel-contextual -->
- <object class="GtkVBox" id="tab_mythbuntu-bare">
- <property name="visible">True</property>
- <property name="border_width">6</property>
- <child>
- <object class="GtkLabel" id="graphics_drivers_title">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes"><big><b>Backup and Restore</b></big></property>
- <property name="use_markup">True</property>
- <property name="single_line_mode">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHSeparator" id="hseparator6">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">6</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox11">
- <property name="height_request">400</property>
- <property name="visible">True</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkVBox" id="vbox_start">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment17">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Welcome to Mythbuntu Bare
- This utility is used to backup and restore essential MythTV
- files to your Mythbuntu system.</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment18">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkButton" id="button_started">
- <property name="label" translatable="yes">Get Started</property>
- <property name="width_request">200</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <signal name="clicked" handler="on_button_started_clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_choices">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment29">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">What would you like to do?</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment6">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment7">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <child>
- <object class="GtkRadioButton" id="radio_backup">
- <property name="label" translatable="yes">Backup</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="backup_setter"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment8">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">10</property>
- <child>
- <object class="GtkRadioButton" id="radio_restore">
- <property name="label" translatable="yes">Restore</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">radio_backup</property>
- <signal name="toggled" handler="backup_setter"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment42">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="radio_convert">
- <property name="label" translatable="yes">Convert to managed client</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">radio_backup</property>
- <signal name="toggled" handler="backup_setter"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="radio_backup_default_off">
- <property name="label" translatable="yes">Default OFF</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">radio_backup</property>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment50">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">50</property>
- <child>
- <object class="GtkLabel" id="managed_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">This machine is currently in unmanaged mode.</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_backup_choice">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment30">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Would you like to backup now?</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="top_padding">10</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment5">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="backup_now">
- <property name="label" translatable="yes">Backup now</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="backup_setter"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment4">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="left_padding">10</property>
- <child>
- <object class="GtkRadioButton" id="backup_schedule">
- <property name="label" translatable="yes">Configure scheduled backup</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">backup_now</property>
- <signal name="toggled" handler="backup_setter"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="radio_schedule_default_off">
- <property name="label" translatable="yes">Default OFF</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">backup_now</property>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_backup_schedule">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <child>
- <object class="GtkLabel" id="daily_backup_label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Do you want to enable or disable the scheduled daily backup?</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment15">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkLabel" id="scheduled_label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Scheduled backup is currrently: </property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment23">
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="scheduled_label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Disabled</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="underline" value="True"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment21">
- <property name="visible">True</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="enable_backup_schedule">
- <property name="label" translatable="yes">Enable Scheduled Backup</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="disable_backup_schedule">
- <property name="label" translatable="yes">Disable Scheduled Backup</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">enable_backup_schedule</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="backup_schedule_off">
- <property name="label" translatable="yes">Default OFF</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="relief">none</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">enable_backup_schedule</property>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_restore_db">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment25">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">A database was detected in the selected restore file. Would you like
- to restore the database?</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment27">
- <property name="visible">True</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkCheckButton" id="restore_db">
- <property name="label" translatable="yes">Yes, restore the database</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_restore">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment26">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Please choose the backup file to restore</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment24">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkFileChooserButton" id="restore_file">
- <property name="visible">True</property>
- <property name="create_folders">False</property>
- <property name="title" translatable="yes">Select A File To Restore</property>
- <property name="width_chars">20</property>
- <signal name="selection_changed" handler="on_restore_file_selection_changed"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment28">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="top_padding">10</property>
- <property name="bottom_padding">10</property>
- <property name="left_padding">10</property>
- <child>
- <object class="GtkLabel" id="restore_label_isfile">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Error: The file you selected is not a valid backup file or is corrupt.</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">5</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_backup_location">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment22">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <child>
- <object class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Where would you like to save the backup file?</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment11">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment12">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="backup_dir_button">
- <property name="label" translatable="yes">Directory</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="on_backup_dir_button_toggled"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment13">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="backup_u1_button">
- <property name="label" translatable="yes">Ubuntu One</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">backup_dir_button</property>
- <signal name="toggled" handler="on_backup_dir_button_toggled"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment14">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="backup_dropbox_button">
- <property name="label" translatable="yes">Dropbox</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">backup_dir_button</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment10">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkFileChooserButton" id="backup_location">
- <property name="visible">True</property>
- <property name="action">select-folder</property>
- <property name="title" translatable="yes">Select Storage Location</property>
- <property name="width_chars">20</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkLabel" id="preconfigured_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Save location preconfigured</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment16">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="top_padding">10</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkCheckButton" id="db_backup_checkbutton">
- <property name="label" translatable="yes">Yes, backup the database?</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment31">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="left_padding">60</property>
- <child>
- <object class="GtkLabel" id="backup_db_label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">( Master backend detected on this machine )</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">5</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">6</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_final">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment9">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkLabel" id="job_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Please click apply to perform the backup/restore procedure</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">7</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_set_schedule">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment32">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <child>
- <object class="GtkLabel" id="label9">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Please set your backup schedule below</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment33">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox6">
- <property name="visible">True</property>
- <child>
- <object class="GtkRadioButton" id="schedule_daily_button">
- <property name="label" translatable="yes">Daily</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="schedule_setter"/>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="schedule_weekly_button">
- <property name="label" translatable="yes">Weekly</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">schedule_daily_button</property>
- <signal name="toggled" handler="schedule_setter"/>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="schedule_monthly_button">
- <property name="label" translatable="yes">Monthly</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">schedule_daily_button</property>
- <signal name="toggled" handler="schedule_setter"/>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="schedule_disabled_button">
- <property name="label" translatable="yes">Disabled</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="relief">none</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">schedule_daily_button</property>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment38">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <child>
- <object class="GtkHBox" id="hbox7">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment37">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <property name="right_padding">10</property>
- <child>
- <object class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Time</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment36">
- <property name="visible">True</property>
- <child>
- <object class="GtkComboBox" id="schedule_hour_combobox">
- <property name="visible">True</property>
- <property name="model">liststore3</property>
- <property name="active">0</property>
- <signal name="changed" handler="schedule_setter"/>
- <child>
- <object class="GtkCellRendererText" id="renderer4"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">:</property>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment35">
- <property name="visible">True</property>
- <child>
- <object class="GtkComboBox" id="schedule_minute_combobox">
- <property name="visible">True</property>
- <property name="model">liststore4</property>
- <property name="active">0</property>
- <signal name="changed" handler="schedule_setter"/>
- <child>
- <object class="GtkCellRendererText" id="renderer3"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment39">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkHBox" id="hbox_schedule">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment34">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="right_padding">5</property>
- <child>
- <object class="GtkLabel" id="label12">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Backup on</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment46">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="right_padding">5</property>
- <child>
- <object class="GtkLabel" id="monthly_the_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">the</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox_schedule_weekly">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment40">
- <property name="visible">True</property>
- <child>
- <object class="GtkComboBox" id="weekly_combobox">
- <property name="visible">True</property>
- <property name="model">liststore1</property>
- <property name="active">0</property>
- <signal name="changed" handler="schedule_setter"/>
- <child>
- <object class="GtkCellRendererText" id="renderer1"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox_schedule_monthly">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment41">
- <property name="visible">True</property>
- <child>
- <object class="GtkComboBox" id="monthly_combobox">
- <property name="visible">True</property>
- <property name="model">liststore2</property>
- <property name="active">0</property>
- <signal name="changed" handler="schedule_setter"/>
- <child>
- <object class="GtkCellRendererText" id="renderer2"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment47">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">5</property>
- <child>
- <object class="GtkLabel" id="monthly_text_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">day of the month</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">4</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment48">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="top_padding">10</property>
- <property name="left_padding">15</property>
- <child>
- <object class="GtkLabel" id="schedule_label_sent">
- <property name="visible">True</property>
- <property name="label" translatable="yes">label</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">8</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox_managed_convert">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment43">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <child>
- <object class="GtkLabel" id="label30">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Select the server configuration file</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment44">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">25</property>
- <child>
- <object class="GtkFileChooserButton" id="managedfilechooser">
- <property name="visible">True</property>
- <property name="width_chars">20</property>
- <signal name="selection_changed" handler="on_managedfilechooser_selection_changed"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment45">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="top_padding">10</property>
- <property name="bottom_padding">10</property>
- <property name="left_padding">10</property>
- <child>
- <object class="GtkLabel" id="managed_label_isfile">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Error: The file you selected is not a valid configuration file or is corrupt.</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">9</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="padding">6</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment19">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">1</property>
- <property name="yscale">0</property>
- <child>
- <object class="GtkHBox" id="button_box">
- <property name="visible">True</property>
- <child>
- <object class="GtkAlignment" id="alignment20">
- <property name="visible">True</property>
- <child>
- <object class="GtkButton" id="back_button">
- <property name="label" translatable="yes">Back</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <signal name="clicked" handler="on_back_button_clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment49">
- <property name="visible">True</property>
- <child>
- <object class="GtkButton" id="next_button">
- <property name="label" translatable="yes">Next</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <signal name="clicked" handler="on_next_button_clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">end</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- <object class="GtkListStore" id="liststore1">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">Sunday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Monday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Tuesday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Wednesday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Thursday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Friday</col>
- </row>
- <row>
- <col id="0" translatable="yes">Saturday</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore2">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">1</col>
- </row>
- <row>
- <col id="0" translatable="yes">2</col>
- </row>
- <row>
- <col id="0" translatable="yes">3</col>
- </row>
- <row>
- <col id="0" translatable="yes">4</col>
- </row>
- <row>
- <col id="0" translatable="yes">5</col>
- </row>
- <row>
- <col id="0" translatable="yes">6</col>
- </row>
- <row>
- <col id="0" translatable="yes">7</col>
- </row>
- <row>
- <col id="0" translatable="yes">8</col>
- </row>
- <row>
- <col id="0" translatable="yes">9</col>
- </row>
- <row>
- <col id="0" translatable="yes">10</col>
- </row>
- <row>
- <col id="0" translatable="yes">11</col>
- </row>
- <row>
- <col id="0" translatable="yes">12</col>
- </row>
- <row>
- <col id="0" translatable="yes">13</col>
- </row>
- <row>
- <col id="0" translatable="yes">14</col>
- </row>
- <row>
- <col id="0" translatable="yes">15</col>
- </row>
- <row>
- <col id="0" translatable="yes">16</col>
- </row>
- <row>
- <col id="0" translatable="yes">17</col>
- </row>
- <row>
- <col id="0" translatable="yes">18</col>
- </row>
- <row>
- <col id="0" translatable="yes">19</col>
- </row>
- <row>
- <col id="0" translatable="yes">20</col>
- </row>
- <row>
- <col id="0" translatable="yes">21</col>
- </row>
- <row>
- <col id="0" translatable="yes">22</col>
- </row>
- <row>
- <col id="0" translatable="yes">23</col>
- </row>
- <row>
- <col id="0" translatable="yes">24</col>
- </row>
- <row>
- <col id="0" translatable="yes">25</col>
- </row>
- <row>
- <col id="0" translatable="yes">26</col>
- </row>
- <row>
- <col id="0" translatable="yes">27</col>
- </row>
- <row>
- <col id="0" translatable="yes">28</col>
- </row>
- <row>
- <col id="0" translatable="yes">29</col>
- </row>
- <row>
- <col id="0" translatable="yes">30</col>
- </row>
- <row>
- <col id="0" translatable="yes">31</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore3">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">0</col>
- </row>
- <row>
- <col id="0" translatable="yes">1</col>
- </row>
- <row>
- <col id="0" translatable="yes">2</col>
- </row>
- <row>
- <col id="0" translatable="yes">3</col>
- </row>
- <row>
- <col id="0" translatable="yes">4</col>
- </row>
- <row>
- <col id="0" translatable="yes">5</col>
- </row>
- <row>
- <col id="0" translatable="yes">6</col>
- </row>
- <row>
- <col id="0" translatable="yes">7</col>
- </row>
- <row>
- <col id="0" translatable="yes">8</col>
- </row>
- <row>
- <col id="0" translatable="yes">9</col>
- </row>
- <row>
- <col id="0" translatable="yes">10</col>
- </row>
- <row>
- <col id="0" translatable="yes">11</col>
- </row>
- <row>
- <col id="0" translatable="yes">12</col>
- </row>
- <row>
- <col id="0" translatable="yes">13</col>
- </row>
- <row>
- <col id="0" translatable="yes">14</col>
- </row>
- <row>
- <col id="0" translatable="yes">15</col>
- </row>
- <row>
- <col id="0" translatable="yes">16</col>
- </row>
- <row>
- <col id="0" translatable="yes">17</col>
- </row>
- <row>
- <col id="0" translatable="yes">18</col>
- </row>
- <row>
- <col id="0" translatable="yes">19</col>
- </row>
- <row>
- <col id="0" translatable="yes">20</col>
- </row>
- <row>
- <col id="0" translatable="yes">21</col>
- </row>
- <row>
- <col id="0" translatable="yes">22</col>
- </row>
- <row>
- <col id="0" translatable="yes">23</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore4">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">00</col>
- </row>
- <row>
- <col id="0" translatable="yes">05</col>
- </row>
- <row>
- <col id="0" translatable="yes">10</col>
- </row>
- <row>
- <col id="0" translatable="yes">15</col>
- </row>
- <row>
- <col id="0" translatable="yes">20</col>
- </row>
- <row>
- <col id="0" translatable="yes">25</col>
- </row>
- <row>
- <col id="0" translatable="yes">30</col>
- </row>
- <row>
- <col id="0" translatable="yes">35</col>
- </row>
- <row>
- <col id="0" translatable="yes">40</col>
- </row>
- <row>
- <col id="0" translatable="yes">45</col>
- </row>
- <row>
- <col id="0" translatable="yes">50</col>
- </row>
- <row>
- <col id="0" translatable="yes">55</col>
- </row>
- </data>
- </object>
-</interface>
Follow ups