mythbuntu-common/0000775000000000000000000000000012704027634011300 5ustar mythbuntu-common/repos.db0000664000000000000000000000155212700535147012741 0ustar MYTHTV_RELEASE 0.28 TRUNKPASS YouMustBeThisTallToRide URL http://people.ubuntu.com/~tgm4883/repos.db karmic fixes-0.21 jaunty fixes-0.21 intrepid fixes-0.21 hardy fixes-0.21 lucid trunk-0.22 karmic trunk-0.22 jaunty trunk-0.22 intrepid trunk-0.22 lucid 0.23 karmic 0.23 maverick 0.23.1 lucid 0.23.1 karmic 0.23.1 oneiric 0.24 natty 0.24 maverick 0.24 lucid 0.24 quantal 0.25 nadia 0.25 precise 0.25 maya 0.25 oneiric 0.25 natty 0.25 lucid 0.25 raring 0.26 olivia 0.26 quantal 0.26 nadia 0.26 precise 0.26 maya 0.26 xenial 0.27 wily 0.27 vivid 0.27 utopic 0.27 trusty 0.27 qiana 0.27 rosa 0.27 rafaela 0.27 rebecca 0.27 saucy 0.27 petra 0.27 raring 0.27 olivia 0.27 precise 0.27 maya 0.27 xenial 0.28 wily 0.28 vivid 0.28 utopic 0.28 trusty 0.28 qiana 0.28 rosa 0.28 rafaela 0.28 rebecca 0.28 xenial 0.29 wily 0.29 trusty 0.29 qiana 0.29 rosa 0.29 rafaela 0.29 rebecca 0.29 mythbuntu-common/debian/0000775000000000000000000000000012704067423012522 5ustar mythbuntu-common/debian/templates0000664000000000000000000000031612664343134014444 0ustar Template: mythbuntu/repos Type: boolean Default: false Description: Enable the MythTV Updates Repository? (Recommended) The MythTV Updates repo contains fixes updates for the installed version of MythTV. mythbuntu-common/debian/control0000664000000000000000000000203712664343134014130 0ustar Source: mythbuntu-common Section: x11 Priority: optional Maintainer: Ubuntu MythTV Team Build-Depends: debhelper (>=9), python3-all, python3-distutils-extra XS-Vcs-Bzr: http://bazaar.launchpad.net/~mythbuntu-dev/mythbuntu/mythbuntu-common XS-Vcs-Browser: http://codebrowse.launchpad.net/~mythbuntu-dev/mythbuntu/mythbuntu-common XS-Python-Version: current Standards-Version: 3.9.5 Package: mythbuntu-common Architecture: all Depends: ${python3:Depends}, ${misc:Depends}, python3-xkit, lsb-release, software-properties-gtk, libdvdread4, Recommends: nvidia-common, mythbuntu-bare-client Suggests: mythbuntu-bare-console Conflicts: mythbuntu-repos Replaces: mythbuntu-repos Description: Mythbuntu application support functions This library is used by multiple mythbuntu applications to provide a common interface for several very commonly used functions. . Depending upon the usage, this application may also be useful by other projects needing to accomplish similar tasks. mythbuntu-common/debian/copyright0000664000000000000000000000511212664343134014455 0ustar This package was debianized by Mario Limonciello on Tue, 3 Jan 2008 16:41:23 -0500 This original source for this package was obtained via the upstream bzr branch at http://bazaar.launchpad.net/~mythbuntu/mythbuntu/mythbuntu-common You can grab the version currently in use by this revision by running 'debian/rules get-orig-source'. Author & Copyright: © 2010 John Baab © 2007-2008 Mario Limonciello License: This Package 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 3 of the License, or (at your option) any later version. This package 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian & Ubuntu systems, a complete copy of the GPL can be found under /usr/share/common-licenses/GPL ----- d3des: D3DES is licensed under the MIT license. It was obtained from: https://github.com/maizy/vnc-me/blob/master/src/d3des.py The MIT License (MIT) Copyright (c) 2013 Nikita Kovaliov, maizy.ru Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- The Debian packaging is © 2008, Mario Limonciello and is also licensed under the GPL. mythbuntu-common/debian/initial-setup.sh0000775000000000000000000000345212704067040015647 0ustar #!/bin/sh # Mario Limonciello, April 2016 set -e #source our dialog functions . /usr/share/mythtv/dialog_functions.sh #get database info getXmlParam() { perl -e ' use XML::Simple; use Data::Dumper; $xml = new XML::Simple; $data = $xml->XMLin("/etc/mythtv/config.xml"); print "$data->{Database}->{$ARGV[0]}\n"; ' -- "$1" } DBHost="$(getXmlParam Host)" DBUserName="$(getXmlParam UserName)" DBPassword="$(getXmlParam Password)" DBName="$(getXmlParam DatabaseName)" #get mythfilldatabase arguments mbargs=$(mysql -N \ --host="$DBHost" \ --user="$DBUserName" \ --password="$DBPassword" \ "$DBName" \ --execute="SELECT data FROM settings WHERE value = 'MythFillDatabaseArgs';" \ ) #find the session, dialog and su manager we will be using for display find_session find_dialog find_su xterm -title "MythTV Setup Terminal" -e taskset -c 0 /usr/bin/mythtv-setup.real --syslog local7 -w -geometry 800x600 "$@" $SU_TYPE systemctl reset-failed mythtv-backend --message "Please enter your current login password to stop mythtv-backend." $SU_TYPE systemctl start mythtv-backend --message "Please enter your current login password to start mythtv-backend." dialog_question "Fill Database?" "Would you like to run mythfilldatabase?" DATABASE_NOT=$? if [ "$DATABASE_NOT" = "0" ]; then xterm -title "Running mythfilldatabase" -e "unset DISPLAY && unset SESSION_MANAGER && mythfilldatabase $mbargs; sleep 3" fi #don't autorun again rm -f /home/$USER/.config/autostart/initial-setup.desktop rm -f /home/$USER/Desktop/initial-setup.desktop rm -f /home/$USER/Desktop/setup-instructions.desktop #autostart mythfrontend? if which mythfrontend; then rm -f /home/$USER/.config/autostart/mythtv.desktop ln -s /usr/share/applications/mythtv.desktop /home/$USER/.config/autostart/mythtv.desktop mythfrontend --service fi mythbuntu-common/debian/config0000664000000000000000000000015312664343134013712 0ustar #!/bin/sh -e . /usr/share/debconf/confmodule db_input high mythbuntu/repos || true db_go || true mythbuntu-common/debian/rules0000775000000000000000000000074712700535100013576 0ustar #!/usr/bin/make -f %: dh $@ --with=python3 override_dh_auto_clean: set -ex; for python in $(shell py3versions -r); do \ $$python setup.py clean; \ done; rm -f po/*.pot rm -rf build override_dh_auto_build: set -ex; for python in $(shell py3versions -r); do \ $$python setup.py build; \ done; override_dh_auto_install: set -ex; for python in $(shell py3versions -r); do \ $$python setup.py install --root=$(CURDIR)/debian/mythbuntu-common --install-layout=deb; \ done; mythbuntu-common/debian/compat0000664000000000000000000000000212664343134013721 0ustar 9 mythbuntu-common/debian/setup-instructions.desktop0000664000000000000000000000040512700535100020002 0ustar [Desktop Entry] Name=MythTV Setup Instructions Comment=instructions for setting up GenericName=Setup Instructions Exec=xdg-open https://www.mythtv.org/wiki/Configuring_MythTV Type=Application Icon=chromium-browser Categories=GTK;System;Settings; NoDisplay=true mythbuntu-common/debian/postinst0000775000000000000000000000057112700535100014322 0ustar #!/bin/sh -e . /usr/share/debconf/confmodule case "$1" in configure) db_get mythbuntu/repos if [ "$RET" = "true" ]; then /usr/bin/apt-add-repository -y ppa:mythbuntu/0.28 fi ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 mythbuntu-common/debian/initial-setup.desktop0000664000000000000000000000034012704067040016674 0ustar [Desktop Entry] Name=Initial Setup Comment=First boot configuration GenericName=First boot configuration Exec=/usr/share/mythbuntu/initial-setup.sh Type=Application Icon=mythtv Categories=GTK;System;Settings; NoDisplay=true mythbuntu-common/debian/mythbuntu.make0000664000000000000000000000145312664343134015424 0ustar #Common Mythbuntu makefile ifneq (,$(wildcard /usr/bin/dh_python2)) py2=python2, endif ifneq (,$(wildcard /usr/bin/dh_python3sdfsf)) py3=python3 endif DEB_SOURCE_PACKAGE+=$(shell egrep '^Source: ' debian/control | cut -f2 -d ' ') DEB_UPSTREAM_VERSION+=$(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ' | cut -d: -f2- | sed 's/-[^-]*$$//') BZR_BRANCH+=http://bazaar.launchpad.net/~mythbuntu-dev/mythbuntu/$(DEB_SOURCE_PACKAGE) TARFILE+=$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.tar.gz get-orig-source: bzr export -r $(BZR_REVISION) $(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) $(BZR_BRANCH) tar czf $(CURDIR)/../$(TARFILE) $(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) --exclude debian rm -rf $(CURDIR)/$(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) %: dh $@ --with=$(py2)$(py3) mythbuntu-common/debian/prerm0000775000000000000000000000122412664343134013575 0ustar #!/bin/sh case "$1" in remove|purge) release=$(lsb_release -c -s) RMBLDS="`cat /usr/share/mythbuntu/plugins/mythbuntu-repos.db | grep $release | cut -f 2`" for version in $RMBLDS do ## Fixes for 0.21 and 0.22 PPA's if [ "$version" = "0.21" ]; then version="fixes-0.21" elif [ "$version" = "0.22" ]; then version="trunk-0.22" elif [ "$version" = "0.24.x" ]; then version="0.24" fi apt-add-repository -r -y ppa:mythbuntu/$version || true done apt-add-repository -r -y ppa:mythbuntu/testing || true apt-add-repository -r -y ppa:mythbuntu/xmltv || true ;; esac #DEBHELPER# mythbuntu-common/debian/changelog0000664000000000000000000006631312704067413014404 0ustar mythbuntu-common (0.78.2) xenial; urgency=medium * Update repos.db download URL. Fixes (LP:#1570690) -- Thomas Mashos Thu, 14 Apr 2016 21:29:33 -0700 mythbuntu-common (0.78) xenial; urgency=medium [ Mario Limonciello ] * don't install .desktop files executable. * include first boot initial setup scripts. [ Thomas Mashos ] * Update repos.db -- Mario Limonciello Sun, 10 Apr 2016 22:27:50 -0500 mythbuntu-common (0.77.1) xenial; urgency=medium * Set correct repos.db URL. Fixes (LP: #1570690) -- Thomas Mashos Thu, 14 Apr 2016 21:09:17 -0700 mythbuntu-common (0.77) xenial; urgency=medium * Disable mythexport plugin. It will be removed in this release. * Update repos.db to match releases in xenial. * Include a .desktop file pointing to setup instructions. * Update postinst for mythtv 0.28 version * Remove build/ on clean. -- Mario Limonciello Sun, 03 Apr 2016 16:31:22 -0500 mythbuntu-common (0.76.1) xenial; urgency=medium * Ask and enable update repo during install -- Thomas Mashos Tue, 16 Feb 2016 20:04:41 -0800 mythbuntu-common (0.75) trusty; urgency=medium * Fix Mythexport for Python 3 (LP: #1365090) -- Thomas Mashos Wed, 03 Sep 2014 10:47:37 -0700 mythbuntu-common (0.74) trusty-proposed; urgency=medium [ Mario Limonciello ] * Actually clean in the clean target. [ Thomas Mashos ] * Fix services plugin for VNC crashing (LP: #1309553) * Fix mysql plugin crashing (LP: #1316905) -- Thomas Mashos Thu, 08 May 2014 14:06:34 -0700 mythbuntu-common (0.73) trusty; urgency=medium * Fix installer drivers page crash (LP: #1309119) -- Mario Limonciello Thu, 17 Apr 2014 13:41:08 -0500 mythbuntu-common (0.72) trusty; urgency=medium * drop system updates plugin. the only real purpose for it was to change update notifier behavior which can no longer be modified. * drop some broken mysql code that didn't get ported to python3 in time. * update to standards 3.9.5. -- Mario Limonciello Thu, 10 Apr 2014 11:14:31 -0500 mythbuntu-common (0.71) trusty; urgency=medium * Make mythbuntu.make call dh_python2/dh_python3, if available. -- Dimitri John Ledkov Mon, 27 Jan 2014 12:09:22 +0000 mythbuntu-common (0.70) trusty; urgency=low * Drop some string.split() calls. * Sort remotes and blasters in reverse so WMC remotes end up at the top. * Drop the graphics drivers tab. Jockey is gone and those other apps should be present in the menus. * Use software center rather than synaptic. * Fix the spacing problems that happened from expand/fill in GTK3. * Drop automatic login configuration. No GUI tool for this. Might want to revisit later with something else, scripting lightdm-set-defaults or something similar. * Bump lintian version and compat. -- Mario Limonciello Tue, 12 Nov 2013 22:05:19 -0600 mythbuntu-common (0.69) trusty; urgency=low [ Thomas Mashos ] * Added tool tips to plugins tab (LP: #869325) * Added progress bars to -repos * Added Quantal info (LP: #1063086) * Have -repos pull from download.mythbuntu.org instead of bzr (LP: #1227831) * Fix -repos for python3 [ Mario Limonciello ] * update to python3. - currently VNC and Mysql plugins are broken. - Need new solution for pexepct and mysqldb. - bzrlib broke - gconf broke. * update to python GI introspection. * Add d3des from https://github.com/maizy/vnc-me/blob/master/src/d3des.py * drop vnc dependencies. create vnc password in pure python. * drop mysql.txt integration. use xml only now for current mythtv. -- Mario Limonciello Tue, 12 Nov 2013 01:16:37 -0600 mythbuntu-common (0.67) precise; urgency=low [ John Baab ] * Drop theme tab (installable from mythtv itself) * Removed obsolete plugins from dictionary. [ Mario Limonciello ] * Drop mythvideos and mythmovies plugin checkboxes (gone in 0.25) * Update precise in repos.db. -- John Baab Mon, 09 Apr 2012 11:38:09 -0500 mythbuntu-common (0.66) precise; urgency=low * fix repos.db to use tabs (as mcc expects them) -- Mario Limonciello Tue, 17 Jan 2012 11:12:38 -0600 mythbuntu-common (0.65) precise; urgency=low [ Mario Limonciello ] * Make sure the repos database is installed. * Rename the repos database to repos.db instead (mythbuntu is implied by dir) [ Thomas Mashos ] * Make the repos page more readable * Don't let the repos page fail if the db in ~ got corrupted. -- Mario Limonciello Thu, 08 Dec 2011 23:34:55 -0600 mythbuntu-common (0.64) precise; urgency=low [ Thomas Mashos ] * Merged mythbuntu-repos into this package [ Mario Limonciello ] * debian/control: bump standards version. * debian/prerm: add missing debhelper token. -- Mario Limonciello Wed, 07 Dec 2011 10:23:17 -0600 mythbuntu-common (0.63) oneiric; urgency=low * Fix hang in installer plugin myth-drivers. (LP: #867856) -- Mario Limonciello Wed, 05 Oct 2011 00:11:38 -0500 mythbuntu-common (0.62) oneiric; urgency=low * Disable encouraging fglrx in the installer. * Fix cut off text in themes tab. -- Mario Limonciello Fri, 09 Sep 2011 16:09:10 -0500 mythbuntu-common (0.61) oneiric; urgency=low * Convert installer plugin to pygi/gtk3. * Make into a native package version instead. -- Mario Limonciello Sun, 28 Aug 2011 22:02:06 -0500 mythbuntu-common (0.60-0ubuntu1) oneiric; urgency=low [ Thomas Mashos ] * Removed Mythbuntu-bare, now in a separate package * Fix database backup not backing up when selected * Fix restore_db notifying user when not restoring db -- Mario Limonciello Mon, 08 Aug 2011 12:15:22 -0500 mythbuntu-common (0.59-0ubuntu1) natty; urgency=low * Fix some spacing problems in bare. * Fix bare restore (LP: #761189) * Store bare configuration in /etc/default not /etc/mythbuntu-bare. -- Mario Limonciello Sun, 17 Apr 2011 16:24:58 -0500 mythbuntu-common (0.58-0ubuntu1) natty; urgency=low [ Thomas Mashos ] * Fixed MCC bare plugin crash when no config file detected * Fixed MCC bare plugin to show final wizard page if schedule is disabled -- Mario Limonciello Fri, 18 Mar 2011 02:22:43 -0500 mythbuntu-common (0.57-0ubuntu1) natty; urgency=low [ Thomas Mashos ] * Added ability to schedule backups using the Bare MCC plugin * Separated backup and restore scripts from Bare plugin code * Relocated python scripts to a separate Bare directory * Added checkin functionality to Bare plugin to look for config changes [ Dave Walker (Daviey) ] * debian/control: Bump to Standards-Version 3.9.1 (no changes needed). -- Thomas Mashos Wed, 23 Feb 2011 17:43:23 -0800 mythbuntu-common (0.56-0ubuntu1) natty; urgency=low * Add basic support for QR codes to install Android or iOS apps for remote. -- Mario Limonciello Tue, 08 Feb 2011 02:31:23 -0600 mythbuntu-common (0.55-0ubuntu1) natty; urgency=low * Fix the logic for modifying the security pin (LP: #647367) * Fix the security pin check to support 0.24 backends. * Rebuild for python 2.7 transition. (LP: #712021) -- Mario Limonciello Wed, 02 Feb 2011 17:55:26 -0600 mythbuntu-common (0.54-0ubuntu1) maverick; urgency=low * Fixed backup now screen doesn't let you pass without selecting it * Clarify text in GUI for user * Include udev rules in backup. -- Thomas Mashos Tue, 14 Sep 2010 08:52:59 -0700 mythbuntu-common (0.53-0ubuntu1) maverick; urgency=low * Check files exist before backing up * Check restore file is a valid tarfile * Check backup directory exists * Fixed issue with plugin not resetting to default values -- Thomas Mashos Wed, 08 Sep 2010 17:50:52 -0700 mythbuntu-common (0.52-0ubuntu1) maverick; urgency=low [ Thomas Mashos ] * Finished adding restore functionality * Disabled scheduling options (Deferred) [ Mario Limonciello ] * Fix themes page text. * Fix spacing on the remotes page. -- Mario Limonciello Tue, 31 Aug 2010 10:30:17 -0500 mythbuntu-common (0.51-0ubuntu2) maverick; urgency=low [ Mario Limonciello ] * Remove architecture specificities from recommends. -- Mario Limonciello Sat, 14 Aug 2010 02:35:02 -0500 mythbuntu-common (0.51-0ubuntu1) maverick; urgency=low [ Thomas Mashos ] * Add the mythbuntu-bare backup/restore plugin. [ Mario Limonciello ] * Shuffle the UI for the remote control page around a little bit for ubiquity. -- Mario Limonciello Thu, 12 Aug 2010 13:14:56 -0500 mythbuntu-common (0.50-0ubuntu1) lucid; urgency=low * Added PATH to proprietary codecs plugin (LP: #565769) -- Thomas Mashos Sun, 18 Apr 2010 16:42:31 -0700 mythbuntu-common (0.49-0ubuntu2) lucid; urgency=low * debian/control: - Depends on vnc4server instead since vnc4-common has been removed from the archive. -- Mario Limonciello Sat, 03 Apr 2010 19:23:02 -0500 mythbuntu-common (0.49-0ubuntu1) lucid; urgency=low * debian/control: - Update branches to pull from ~mythbuntu-dev * debian/mythbuntu.make: - Set packages to pull from ~mythbuntu-dev -- Mario Limonciello Sat, 03 Apr 2010 17:41:54 -0500 mythbuntu-common (0.48-0ubuntu1) lucid; urgency=low [ Marc Randolph ] * Remove MythFlix (LP: #544521) * Clean up plugins section of MCC (use just one alignment rather than 7) [ Mario Limonciello ] * Clarify what the themes actually are to reflect what we ship today. * debian/control: - Bump standards version. -- Mario Limonciello Sun, 28 Mar 2010 00:57:40 -0500 mythbuntu-common (0.47-0ubuntu1) lucid; urgency=low * Return errors on do_connection_test if there are any, None if not. (LP: #527342) * Fix alignment of the plugins plugin. -- Mario Limonciello Sat, 06 Mar 2010 16:25:12 -0600 mythbuntu-common (0.46-0ubuntu1) lucid; urgency=low * Use SecurityKey rather than the different variables for mysql.txt throughout the mysql pieces. -- Mario Limonciello Sun, 21 Feb 2010 20:25:42 -0600 mythbuntu-common (0.45-0ubuntu1) lucid; urgency=low * debian/control: - Drop depends on mythtv-common. * Add mythnetvision to plugins dictionary as it was introduced with 0.23. * Drop unused debconftalk class. * Write out a config.xml as well as mysql.txt. -- Mario Limonciello Sun, 21 Feb 2010 20:25:09 -0600 mythbuntu-common (0.44-0ubuntu1) lucid; urgency=low * remote: - Added enable frontend restart checkbox * debian/control: - fixed lintian warnings -- John Baab Wed, 17 Feb 2010 14:16:10 -0500 mythbuntu-common (0.43-0ubuntu1) lucid; urgency=low * debian/control: - Drop nvidia-common to recommends. (LP: #396334) * mythbuntu_common/dictionaries.py: - Don't fail on an import error for the nvidia detection. * Convert the package to dh7. -- Mario Limonciello Tue, 16 Feb 2010 00:51:30 -0600 mythbuntu-common (0.42-0ubuntu1) lucid; urgency=low * Remove Medibuntu support, use install-css.sh instead * Added libdvdread4 dependency for install-css.sh (LP: #505706) -- Thomas Mashos Wed, 03 Feb 2010 23:03:51 -0800 mythbuntu-common (0.41-0ubuntu1) lucid; urgency=low [ Thomas Mashos ] * Fix mythexport issue (LP: #505713) [ Mario Limonciello ] * Remove references to usplash since it's no longer used in Lucid and later. * Add support to write out a config.xml in the mysql handler. * Add a ubiquity module that includes functions used by many ubiquity pages. * Remove references to w32codecs and w64codecs. We're eventually gonna be dropping medibuntu support, so we'll only need to expose DVD support in the UI. -- Mario Limonciello Tue, 26 Jan 2010 03:29:11 -0600 mythbuntu-common (0.40-0ubuntu1) karmic; urgency=low * remote: - Correct a *very* small typo that prevented only the last remote from functioning. * lirc: - Sort the device list because we might be injecting multiple hwdb's. - Filter out IR Blaster from remote types. -- Mario Limonciello Fri, 16 Oct 2009 22:52:22 -0500 mythbuntu-common (0.39-0ubuntu1) karmic; urgency=low * remote: - Default lirc_vbox to true so that it can still be changed in the installer. * system_roles: - Disable the diskless plugin. It wasn't fully finished and ready to go in time for 9.10, so it's better to not offer it to avoid bug reports about it. -- Mario Limonciello Fri, 16 Oct 2009 01:29:20 -0500 mythbuntu-common (0.38-0ubuntu1) karmic; urgency=low * themes: - Upstream decided not to support themes/ or oldthemes/ today, so we're not going to either. -- Mario Limonciello Wed, 14 Oct 2009 21:08:50 -0500 mythbuntu-common (0.37-0ubuntu1) karmic; urgency=low * proprietary_codecs: - Request a package list update while installing the medibuntu keyring to prevent errors from aptdaemon about unauthenticated packages. * remote: - Make this plugin optional, by being able to install/remove lirc and mythbuntu-lirc-generator. * debian/control: - Drop lirc and mythbuntu-lirc-generator as Depends or Recommends. They're seeded in the desktop package, and entirely optional/installable from within MCC anyway. (LP: #133634) -- Mario Limonciello Wed, 14 Oct 2009 20:38:27 -0500 mythbuntu-common (0.36-0ubuntu1) karmic; urgency=low * lirc: - Source the new locations of remotes on our list. -- Mario Limonciello Tue, 13 Oct 2009 23:42:45 -0500 mythbuntu-common (0.35-0ubuntu1) karmic; urgency=low * themes: - Rearrange list of themes and make sure the mappings are correct. * plugins: - Fix mythweb password support. (LP: #445998) -- Mario Limonciello Tue, 13 Oct 2009 01:54:13 -0500 mythbuntu-common (0.34-0ubuntu1) karmic; urgency=low * lirc: - Use the full path for dpkg-reconfigure to prevent a crash. * plugins: - Set Expand property for MythNews. - If mythweb isn't installed, explicitly disable sensitivity of mythweb password hbox. * themes: - Update text to better reflect what the metas represent. * properietary_codecs: - Request a package list update after enabling the repo. - Add support to install the keyring. - Allow the keyring package to be installed. (LP: #415969) -- Mario Limonciello Sun, 04 Oct 2009 04:00:52 -0500 mythbuntu-common (0.33-0ubuntu1) karmic; urgency=low [ Nick Fox ] * Removed Apple Trailers and MythStream Support [ John Baab ] * Enable the mythexport plugin. [ Mario Limonciello ] * Shorten the error message for the mysql plugin when mysql.txt is not accessible. * mysql: - Update the location of the optimize_mythdb.pl script. * plugins: - Drop Mythcontrols and Mythphone. (LP: #428683) - Add back in Mythbrowser. * debian/control: - Only depends on nvidia-common for i386 or amd64. (LP: #396334) - Build depends on python-distutils-extra * startup_behavior: - Rely on calling the external gdmsetup for configuration of automatic login rather than our own scripting. (LP: #422238) * themes: - Drop gtk theme from here since we're not using it anymore. - Only reference meta packages in themes section. (LP: #438999) * Add some basic support for translation templates. (LP: #348178) -- Mario Limonciello Sat, 03 Oct 2009 18:51:34 -0500 mythbuntu-common (0.32-0ubuntu1) karmic; urgency=low [ Mario Limonciello ] * mythbuntu_common/mysql: - Use the full path for invoke-rc.d as /usr/sbin/ isn't in PATH when ran dbus activated. * mythbuntu_common/dictionaries: - Add an argument to the services dictionary so that a different object can be specified for mysql-server. * Convert from glade to gtkbuilder (LP: #403542) * Remove dummy_window top level parent window from all widgets. In gtk.Builder, we don't need a top level parent. * services: - Ignore any items in the dictionary that are None. * remote: - Reference builder objects rather than xml objects. - Add list store objects that weren't automatically created. - Add CellRenderer objects that weren't automatically created. * roles: - Drop references to unused 'toggled' function. - Drop references to unused diskless toggle function. - Hide the Appliance Frontend option since it has no code to back it currently. (LP: #413008) - Set diskless to be sensitive again. * mysql_configuration: - Drop reference to unused 'toggled' function. - Remove references to 'has_default' that were causing warnings about no gtk.Window object that they are within. * plugins: - Change the mythweb password section to be a 3 way selector for en/dis/reconfigure - Don't try to read the old password or username - Write out the new md5 and what not. - This may or may not be complete. It will need some experimentation with 0.22 and how it interacts with dpkg-reconfigure mythweb. [ Michael Haas ] * Remove plugins/ui/tab_diskless.ui as it'll be shipped in an external package [ John Baab ] * Added MythExport Plugin. -- John Baab Thu, 27 Aug 2009 02:29:06 -0400 mythbuntu-common (0.31-0ubuntu1) karmic; urgency=low * startup_behavior: - Adjust for changes that have happened in GDM 2.26. Unfortunately this means startup_behavior won't work on Ubuntu 9.04 and earlier anymore. (LP: #403290) -- Mario Limonciello Thu, 23 Jul 2009 01:48:39 -0500 mythbuntu-common (0.30-0ubuntu1) karmic; urgency=low * plugins: - Check that we can actually read mythweb-digest before proceeding. * mythbuntu_common/vnc.py: - Wait until we get a pexpect.EOF so that fast machines don't kill the pexpect too early. (Race condition problem) * mythbuntu_common/mysql.py: - Make sure that we don't make a new file when making mcc changes. Write the changes to the old file so perms remain. (LP: #343204) - Add a run_mysql_commands function for executing mysql commands using the system mysql.txt. * mythbuntu_common/logging.py: - We should really just use python's logging module instead. Drop. -- Mario Limonciello Thu, 18 Jun 2009 01:39:26 -0500 mythbuntu-common (0.29-0ubuntu1) karmic; urgency=low * startup_behavior: - If only one user is avaialable(generally [DISABLED]), don't mark the plugin as incomplete. This is the case for the live CD, meaning MCC isn't usable on the live CD before this change. -- Mario Limonciello Wed, 10 Jun 2009 11:55:34 -0500 mythbuntu-common (0.28-0ubuntu1) karmic; urgency=low * debian/control: - Clean up depends for what's part of the new plugins. * mythbuntu_common/vnc.py: - Create the vnc password as a user instead of root. * mythbuntu_common/dictionaries.py: - Drop MySQL from services dictionary. We're moving it elsewhere. - Drop XFS tweak for now. We should hopefully be in ext4 during karmic. - Merge official and community theme dictionaries. * glade/tab_themes.glade: - Clean up a few strings to be more clear. - Merge in the artwork glade page to this one. - Combine the sections for community and official themes. No need to show a distinction if they all work. * mythbuntu_common/lirc.py: - Temporarily disable custom remote/transmitter support until we can ensure it keeps ubiquity and/or mcc and/or mcc-revamp stable. * Move all glade into standard plugins/glade directory * Install everything into /usr/share/mythbuntu instead of /usr/share/mythbuntu-common. This will be our new Standard place. * Add in all currently known mcc plugins from the mcc-revamp branch. Unfortunately legacy version history isn't included since there wasn't easy to bring into this branch. It can be viewed by looking through the logs of the mythbuntu-control-centre or mcc-revamp bzr branches. * Update README to explain better what this package provides. * Don't include the logo in this package. It will come in mds. -- Mario Limonciello Tue, 09 Jun 2009 00:39:07 -0500 mythbuntu-common (0.27-0ubuntu1) karmic; urgency=low [ Mario Limonciello ] * debian/control: - Drop depends on expect - Add depends on python-pexpect * scripts/create_vnc_passwd: - Drop, now unnecessary. [ Mike ( szczys@hotmail.com ) ] * vnc.py: - Use python-pexpect instead to prevent errors from passwords that need to be escaped. (LP: #363153) -- Mario Limonciello Tue, 05 May 2009 01:25:27 -0500 mythbuntu-common (0.26-0ubuntu1) jaunty; urgency=low [ Nick Fox ] * Fix dictionary for optimize_mythdb changes (LP: #290781) -- Mario Limonciello Fri, 17 Apr 2009 01:56:34 -0500 mythbuntu-common (0.25-0ubuntu1) jaunty; urgency=low [ Mario Limonciello ] * Remove mythbrowser from list of plugins (LP: #353736) [ Nick Fox ] * Add script for VNC PassWD in user HOME (LP: #336274) -- Nick Fox Fri, 10 Apr 2009 00:57:33 -0500 mythbuntu-common (0.24-0ubuntu1) jaunty; urgency=low * Added CustomLogging class -- Nick Fox Thu, 12 Mar 2009 21:12:50 -0500 mythbuntu-common (0.23-0ubuntu2) jaunty; urgency=low * No change rebuild for python 2.6. -- Mario Limonciello Sat, 28 Feb 2009 09:51:10 -0600 mythbuntu-common (0.23-0ubuntu1) jaunty; urgency=low * Include sample configuration files for samba and nfs. -- Mario Limonciello Sat, 14 Feb 2009 13:37:07 -0600 mythbuntu-common (0.22-0ubuntu1) jaunty; urgency=low * Dynamically detect AMD/ATI or NVIDIA graphics drivers for different drivers offered. * debian/control: - Depends on nvidia-common -- Mario Limonciello Thu, 12 Feb 2009 19:30:48 -0600 mythbuntu-common (0.21-0ubuntu1) jaunty; urgency=low * GUI tweaks to IR glade file. * Add in a new dictionary to query the system's roles. * Add missing import to mysql handler * Default the meta checkboxes on themes pages to off. * Add an artwork dictionary. * Add an advanced tweak dictionary. -- Mario Limonciello Fri, 30 Jan 2009 00:47:03 -0600 mythbuntu-common (0.20-0ubuntu1) jaunty; urgency=low * Now that nvidia 180 is stable, add support for installing it from live disks. -- Mario Limonciello Thu, 08 Jan 2009 15:25:39 -0600 mythbuntu-common (0.19-0ubuntu1) intrepid; urgency=low * Update graphics driver dictionary. - Enable fglrx. It's been fixed now. -- Mario Limonciello Tue, 14 Oct 2008 18:27:43 -0500 mythbuntu-common (0.18-0ubuntu2) intrepid; urgency=low * Correct theme typo. -- Mario Limonciello Sun, 14 Sep 2008 14:11:04 -0500 mythbuntu-common (0.18-0ubuntu2) intrepid; urgency=low * Add missing themes that were in the archive: - Metallurgy-wide - Metallurgy-osd -- Mario Limonciello Sun, 12 Sep 2008 14:11:04 -0500 mythbuntu-common (0.17-0ubuntu1) intrepid; urgency=low * Update graphics driver dictionary. - Disable NVIDIA 77 (it's broke) - Disable NVIDIA 96 (it's broke) - Disable Fglrx (it's broke) -- Mario Limonciello Fri, 05 Sep 2008 10:07:21 -0500 mythbuntu-common (0.16-0ubuntu1) intrepid; urgency=low [ Mario Limonciello ] * Include a graphics driver dictionary. * debian/control: - Drop guidance-backends dependency. - Add python-xkit dependency. [ Alberto Milone ] * Update vnc.py to use x-kit instead. -- Mario Limonciello Tue, 26 Aug 2008 10:39:50 -0500 mythbuntu-common (0.15-0ubuntu1) intrepid; urgency=low * debian/control: - Add guidance-backends dependency (LP: #228961) -- Mario Limonciello Sun, 27 Jul 2008 11:00:40 -0500 mythbuntu-common (0.14-0ubuntu1) intrepid; urgency=low [ Mario Limonciello ] * Clean up tabbing/spacing. * debian/control: - Update standards version. [ Nick Fox ] * Add Mythbuntu Apple Trailers support -- Mario Limonciello Sun, 06 Jul 2008 01:31:04 -0500 mythbuntu-common (0.13-0ubuntu1) hardy; urgency=low [ Mario Limonciello ] * Bump logo to new logo. [Michael Haas] * Update diskless dictionary -- Mario Limonciello Wed, 09 Apr 2008 09:55:36 -0500 mythbuntu-common (0.12-0ubuntu1) hardy; urgency=low * Catch exceptions related to debconftalk. (LP: #201682) -- Mario Limonciello Fri, 21 Mar 2008 23:57:34 -0500 mythbuntu-common (0.11-0ubuntu1) hardy; urgency=low * Add diskless dictionary. -- Mario Limonciello Sat, 08 Mar 2008 00:44:10 -0600 mythbuntu-common (0.10-0ubuntu1) hardy; urgency=low * Make new vnc passwords readable by anyone. -- Mario Limonciello Sun, 02 Mar 2008 15:12:37 -0600 mythbuntu-common (0.9-0ubuntu1) hardy; urgency=low * Change vnc4server key to be x11vnc. * Drop mythappearance from dictionary. -- Mario Limonciello Mon, 25 Feb 2008 21:46:31 -0600 mythbuntu-common (0.8-0ubuntu1) hardy; urgency=low * Add new plugins that are available in trunk to list. -- Mario Limonciello Wed, 30 Jan 2008 20:13:18 -0600 mythbuntu-common (0.7-0ubuntu1) hardy; urgency=low * Default to having all themes enabled on glade page. They are properly enabled/disabled upon install or via mcc. -- Mario Limonciello Sun, 27 Jan 2008 10:55:09 -0600 mythbuntu-common (0.6-0ubuntu1) hardy; urgency=low * Move themes glade file into package. -- Mario Limonciello Mon, 21 Jan 2008 09:54:43 -0600 mythbuntu-common (0.5-0ubuntu1) hardy; urgency=low * Allow permission changing to be optional for lircrc generation. -- Mario Limonciello Mon, 14 Jan 2008 22:49:36 -0600 mythbuntu-common (0.4-0ubuntu1) hardy; urgency=low * Correct minor typo in debconftalk. -- Mario Limonciello Sat, 12 Jan 2008 13:24:27 -0600 mythbuntu-common (0.3-0ubuntu1) hardy; urgency=low * Add glade file or infrared devices. -- Mario Limonciello Sat, 12 Jan 2008 09:51:31 -0600 mythbuntu-common (0.2-0ubuntu1) hardy; urgency=low * debian/control: - Depend upon mythbuntu-lirc-generator. * lirc.py: - Revamp support for Hardy's LIRC which handles remotes and transmitters independently. -- Mario Limonciello Sat, 29 Dec 2007 18:58:28 -0600 mythbuntu-common (0.1-0ubuntu1) hardy; urgency=low * Initial Release. -- Mario Limonciello Thu, 27 Dec 2007 01:40:58 -0600 mythbuntu-common/debian/install0000664000000000000000000000030012704067040014077 0ustar debian/mythbuntu.make usr/share/mythbuntu debian/setup-instructions.desktop /usr/share/mythbuntu debian/initial-setup.desktop /usr/share/mythbuntu debian/initial-setup.sh /usr/share/mythbuntu mythbuntu-common/setup.py0000775000000000000000000000336212664343134013022 0ustar #!/usr/bin/python3 # mythbuntu-common install script # Copyright (C) 2007-2009, Mario Limonciello # # # This program 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 3 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 program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from distutils.core import setup from DistUtilsExtra.command import * import glob, os.path setup( name="mythbuntu-common", author="Mario Limonciello", author_email="superm1@mythbuntu.org", maintainer="Ubuntu MythTV Team", maintainer_email="ubuntu-mythtv@lists.ubuntu.com", url="http://www.mythbuntu.org", license="gpl", description="commonly used mythbuntu functions", packages=['mythbuntu_common'], data_files=[("share/mythbuntu/examples", glob.glob("examples/*")), ("share/mythbuntu/plugins/python", glob.glob("plugins/python/*")), ("share/mythbuntu/qr", glob.glob("qr/*")), ("share/mythbuntu/", glob.glob("*.db")), ("share/mythbuntu/plugins/ui", glob.glob("plugins/ui/*"))], scripts=[], cmdclass = { "build" : build_extra.build_extra, "build_i18n" : build_i18n.build_i18n, "clean" : clean_i18n.clean_i18n } ) mythbuntu-common/mythbuntu_common/0000775000000000000000000000000012664343134014710 5ustar mythbuntu-common/mythbuntu_common/installer.py0000664000000000000000000000722512664343134017265 0ustar # -*- coding: utf-8 -*- # # installer - Functions for use in Mythbuntu ubiquity plugins # # Copyright (C) 2010, Mario Limonciello, 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 3 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 ubiquity.plugin import * from ubiquity.misc import create_bool from gi.repository import Gtk class MythPageGtk(PluginUI): def __init__(self, controller, *args, **kwargs): def add_widget(plugin, widget): """Make a widget callable by a plugin.""" if not isinstance(widget, Gtk.Widget): return widget.set_name(Gtk.Buildable.get_name(widget)) setattr(plugin, widget.get_name(), widget) if isinstance(widget, Gtk.Label): widget.set_property('can-focus', False) self.controller=controller try: builder = Gtk.Builder() builder.add_from_file('/usr/share/ubiquity/gtk/%s.ui' % self.ui_file) builder.connect_signals(self) for widget in builder.get_objects(): add_widget(self, widget) self.plugin_widgets = builder.get_object(self.ui_file) self.controller.add_builder(builder) except Exception as e: self.debug('Could not create mythbuntu page: %s', e) self.plugin_widgets = None def preseed_list(lists,names,value): """Helper function for preseeding dictionary based lists""" new_value = create_bool(value) for list in lists: for item in list: for name in names.split(): if item == name: #be careful what type of item we are dealing with if type(list[item]) == Gtk.CheckButton: list[item].set_active(new_value) elif type(list[item]) == Gtk.Entry: list[item].set_text(new_value) elif type(list[item]) == Gtk.ComboBox: model = list[item].get_model() for iteration in range(len(list[item]),0): list[item].set_active(iteration) iterator = list[item].get_active_iter() active = model.get_value(iterator, 0) if active == new_value: break else: list[item].set_active_text(new_value) def build_static_list(lists): """Creates a flat list""" total_list= {} for list in lists: for item in list: if type(list[item]) == str: total_list[item]=list[item] elif type(list[item]) == Gtk.CheckButton: total_list[item]=list[item].get_active() elif type(list[item]) == Gtk.Entry: total_list[item]=list[item].get_text() else: model = list[item].get_model() iterator = model.get_iter_first() active = model.get_value(iterator, 0) total_list[item]=active return total_list mythbuntu-common/mythbuntu_common/__init__.py0000664000000000000000000000000012664343134017007 0ustar mythbuntu-common/mythbuntu_common/d3des.py0000664000000000000000000003225212664343134016270 0ustar #!/usr/bin/env python ## ## d3des.py - DES implementation ## ## Copyright (c) 2009 by Yusuke Shinyama ## Ported to python3: (c) 2013 by Nikita Kovaliov ## # This is a Python rewrite of d3des.c by Richard Outerbridge. # # I referred to the original VNC viewer code for the changes that # is necessary to maintain the exact behavior of the VNC protocol. # Two constants and two functions were added to the original d3des # code. These added parts were written in Python and marked # below. I believe that the added parts do not make this program # a "derivative work" of the VNC viewer (which is GPL'ed and # written in C), but if there's any problem, let me know. # # Yusuke Shinyama (yusuke at cs dot nyu dot edu) # D3DES (V5.09) - # # A portable, public domain, version of the Data Encryption Standard. # # Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge. # Thanks to: Dan Hoey for his excellent Initial and Inverse permutation # code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis # Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau, # for humouring me on. # # Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge. # (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992. # from struct import pack, unpack ################################################### ### ### start: changes made for VNC. ### # This constant was taken from vncviewer/rfb/vncauth.c: vnckey = [23, 82, 107, 6, 35, 78, 88, 7] # This is a departure from the original code. #bytebit = [ 0200, 0100, 040, 020, 010, 04, 02, 01 ] # original bytebit = [0o01, 0o02, 0o04, 0o010, 0o020, 0o040, 0o0100, 0o0200] # VNC version # two password functions for VNC protocol. def decrypt_passwd(data): dk = deskey(pack('8B', *vnckey), True) return desfunc(data, dk) def generate_response(passwd, challange): ek = deskey((passwd + b'\x00' * 8)[:8], False) return desfunc(challange[:8], ek) + desfunc(challange[8:], ek) ### ### end: changes made for VNC. ### ################################################### bigbyte = [0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 0x8000, 0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1] # Use the key schedule specified in the Standard (ANSI X3.92-1981). pc1 = [ 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 ] totrot = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28] pc2 = [ 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 ] def deskey(key, decrypt): # Thanks to James Gillogly & Phil Karn! key = unpack('8B', key) pc1m = [0] * 56 pcr = [0] * 56 kn = [0] * 32 for j in range(56): l = pc1[j] m = l & 0o07 if key[l >> 3] & bytebit[m]: pc1m[j] = 1 else: pc1m[j] = 0 for i in range(16): if decrypt: m = (15 - i) << 1 else: m = i << 1 n = m + 1 kn[m] = kn[n] = 0 for j in range(28): l = j + totrot[i] if l < 28: pcr[j] = pc1m[l] else: pcr[j] = pc1m[l - 28] for j in range(28, 56): l = j + totrot[i] if l < 56: pcr[j] = pc1m[l] else: pcr[j] = pc1m[l - 28] for j in range(24): if pcr[pc2[j]]: kn[m] |= bigbyte[j] if pcr[pc2[j + 24]]: kn[n] |= bigbyte[j] return cookey(kn) def cookey(raw): key = [] for i in range(0, 32, 2): (raw0, raw1) = (raw[i], raw[i + 1]) k = (raw0 & 0x00fc0000) << 6 k |= (raw0 & 0x00000fc0) << 10 k |= (raw1 & 0x00fc0000) >> 10 k |= (raw1 & 0x00000fc0) >> 6 key.append(k) k = (raw0 & 0x0003f000) << 12 k |= (raw0 & 0x0000003f) << 16 k |= (raw1 & 0x0003f000) >> 4 k |= (raw1 & 0x0000003f) key.append(k) return key SP1 = [ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 ] SP2 = [ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 ] SP3 = [ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 ] SP4 = [ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 ] SP5 = [ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 ] SP6 = [ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 ] SP7 = [ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 ] SP8 = [ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 ] def desfunc(block, keys): (leftt, right) = unpack('>II', block) work = ((leftt >> 4) ^ right) & 0x0f0f0f0f right ^= work leftt ^= (work << 4) work = ((leftt >> 16) ^ right) & 0x0000ffff right ^= work leftt ^= (work << 16) work = ((right >> 2) ^ leftt) & 0x33333333 leftt ^= work right ^= (work << 2) work = ((right >> 8) ^ leftt) & 0x00ff00ff leftt ^= work right ^= (work << 8) right = ((right << 1) | ((right >> 31) & 1)) & 0xffffffff work = (leftt ^ right) & 0xaaaaaaaa leftt ^= work right ^= work leftt = ((leftt << 1) | ((leftt >> 31) & 1)) & 0xffffffff for i in range(0, 32, 4): work = (right << 28) | (right >> 4) work ^= keys[i] fval = SP7[work & 0x3f] fval |= SP5[(work >> 8) & 0x3f] fval |= SP3[(work >> 16) & 0x3f] fval |= SP1[(work >> 24) & 0x3f] work = right ^ keys[i + 1] fval |= SP8[work & 0x3f] fval |= SP6[(work >> 8) & 0x3f] fval |= SP4[(work >> 16) & 0x3f] fval |= SP2[(work >> 24) & 0x3f] leftt ^= fval work = (leftt << 28) | (leftt >> 4) work ^= keys[i + 2] fval = SP7[work & 0x3f] fval |= SP5[(work >> 8) & 0x3f] fval |= SP3[(work >> 16) & 0x3f] fval |= SP1[(work >> 24) & 0x3f] work = leftt ^ keys[i + 3] fval |= SP8[work & 0x3f] fval |= SP6[(work >> 8) & 0x3f] fval |= SP4[(work >> 16) & 0x3f] fval |= SP2[(work >> 24) & 0x3f] right ^= fval right = (right << 31) | (right >> 1) work = (leftt ^ right) & 0xaaaaaaaa leftt ^= work right ^= work leftt = (leftt << 31) | (leftt >> 1) work = ((leftt >> 8) ^ right) & 0x00ff00ff right ^= work leftt ^= (work << 8) work = ((leftt >> 2) ^ right) & 0x33333333 right ^= work leftt ^= (work << 2) work = ((right >> 16) ^ leftt) & 0x0000ffff leftt ^= work right ^= (work << 16) work = ((right >> 4) ^ leftt) & 0x0f0f0f0f leftt ^= work right ^= (work << 4) leftt &= 0xffffffff right &= 0xffffffff return pack('>II', right, leftt) # test if __name__ == '__main__': key = bytes.fromhex('0123456789abcdef') plain = bytes.fromhex('0123456789abcdef') cipher = bytes.fromhex('6e09a37726dd560c') ek = deskey(key, decrypt=False) dk = deskey(key, decrypt=True) assert desfunc(plain, ek) == cipher assert desfunc(desfunc(plain, ek), dk) == plain assert desfunc(desfunc(plain, dk), ek) == plain print('ok') mythbuntu-common/mythbuntu_common/vnc.py0000664000000000000000000000737112664343134016060 0ustar # -*- coding: utf-8 -*- # # «vnc» - libmythbuntu class for adding/removing VNC from configuration # # This script: # Copyright (C) 2007-2008, Mario Limonciello, 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 3 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 import os import sys import shutil from mythbuntu_common import d3des #import xorgconfig import xkit from xkit import xutils #Script Directory SCRIPTDIR = '/usr/share/mythbuntu-common/scripts' class VNCHandler: """Used to properly enable VNC in a target configuration""" def __init__(self,root=''): self.add_modules = ["vnc"] self.add_screen = [ ['SecurityTypes', 'VncAuth'], ['UserPasswdVerifier', 'VncAuth'], ['PasswordFile', '/root/.vnc/passwd']] self.root = root self.xorg_conf_path = '/etc/X11/xorg.conf' try: self.xorg_conf = xutils.XUtils(self.xorg_conf_path) except(IOError, xkit.xorgparser.ParseException):#if xorg.conf is missing or broken self.xorg_conf = xutils.XUtils() def create_password(self,password): home = os.environ['HOME'] if not os.path.exists(home + "/.vnc"): os.mkdir(home + "/.vnc") elif os.path.exists(home + "/.vnc/passwd"): print("Copying ~/.vnc/passwd to ~/.vnc/passwd.old") shutil.copy(home + "/.vnc/passwd",home + "/.vnc/passwd.old") if not isinstance(password, bytes): raise ValueError('Password should be passed as bytes') passpadd = (password + b'\x00' * 8)[:8] strkey = bytes(d3des.vnckey) ekey = d3des.deskey(strkey, False) ctext = d3des.desfunc(passpadd, ekey) with open(home + "/.vnc/passwd", 'wb') as f: f.write(ctext) def toggle_xorg(self,enable): """Adds necessary lines for enabling VNC upon the next boot""" # backup the current xorg.conf open(os.path.join(self.root + self.xorg_conf_path + ".old"), "w").write(open(self.root + self.xorg_conf_path).read()) #Revert any existing settings first have_modules = len(self.xorg_conf.globaldict["Module"]) > 0 have_screens = len(self.xorg_conf.globaldict["Screen"]) > 0 if have_modules: for m in self.add_modules: self.xorg_conf.removeOption("Module", "Load", value=m, position=0) if have_screens: for item in self.add_screen: self.xorg_conf.removeOption("Screen", item[0], position=0) #Now re-enable if we want to if enable: if self.add_modules: if not have_modules: self.xorg_conf.makeSection("Module") for m in self.add_modules: self.xorg_conf.addOption("Module", "Load", m, position=0) if not have_screens: self.xorg_conf.makeSection("Screen", identifier="Default Screen") for item in self.add_screen: self.xorg_conf.addOption("Screen", item[0], item[1], optiontype="Option", position=0) self.xorg_conf.writeFile(self.root + self.xorg_conf_path) mythbuntu-common/mythbuntu_common/lirc.py0000664000000000000000000003722012664343134016217 0ustar # -*- coding: utf-8 -*- # # «lirc» - libmythbuntu class for lirc modifications # # This script: # Copyright (C) 2010, John Baab, for Mythbuntu # Copyright (C) 2007-2008, Mario Limonciello, 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 3 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 import re import subprocess import os import shutil #default remote hwdb REMOTE_HWDB="/usr/share/lirc/lirc.hwdb" EXTRA_REMOTE_HWDB="/usr/share/lirc/extras/more_remotes.hwdb" TRANSMITTER_HWDB="/usr/share/lirc/extras/transmitter.hwdb" #path to hardware.conf HARDWARE_CONF="/etc/lirc/hardware.conf" #Path to remotes REMOTE_PATH="/usr/share/lirc/remotes/" #path to main lircd.conf LIRCD_CONF="/etc/lirc/lircd.conf" class LircHandler: def __init__(self,hw_conf=HARDWARE_CONF): #initialize all lists self.remote_list=[] self.remote="None" self.remote_modules="" self.remote_device="" self.remote_driver="" self.remote_lircd_conf="" self.remote_count=0 self.transmitter_list=[] self.transmitter="None" self.transmitter_modules="" self.transmitter_device="" self.transmitter_driver="" self.transmitter_lircd_conf="" self.transmitter_count=0 self.populate_devices("remote",REMOTE_HWDB) self.populate_devices("remote",EXTRA_REMOTE_HWDB) self.populate_devices("transmitter",TRANSMITTER_HWDB) self.sort_devices() #load our current data self.read_hardware_conf(hw_conf) def sort_devices(self): """Sorts the device list for a type""" self.remote_list.sort(reverse=True) self.transmitter_list.sort(reverse=True) self.remote_list.insert(0,"None") self.transmitter_list.insert(0,"None") def populate_devices(self,type,file): """Populates all possible remotes from a hwdb. Accepts either 'remote' or 'transmitter' for possible types""" try: hwdb = open(file).readlines() hwdb.sort() #Filter out uncessary lines filter = "^\#|^\[" #Filter out the /dev/input/eventX remote filter += "|http" #Filter blaster if we are in remote if type == 'remote': filter += "|Blaster" pattern = re.compile(filter) for line in hwdb: if pattern.search(line) is None: list = line.split(';') if len(list) > 1: #Make sure we have a config file before including if list[4] != "": if type == "remote": # self.remote_list.append(list[0].translate(bytes.maketrans('',''),',')) self.remote_list.append(list[0]) self.remote_count = self.remote_count + 1 elif type == "transmitter": self.transmitter_list.append(list[0]) # self.transmitter_list.append(list[0].translate(bytes.maketrans('',''),',')) self.transmitter_count = self.transmitter_count + 1 except IOError: print("Error reading " + file + " to parse remote listing.") #if type == "remote": # self.remote_list.append("Custom") # self.remote_count = self.remote_count + 1 #elif type == "transmitter": # self.transmitter_list.append("Custom") # self.transmitter_count = self.transmitter_count + 1 def set_device(self,device,type): """Sets an active remote control or transmitter""" if type == "remote": count=self.remote_count list=self.remote_list elif type == "transmitter": count=self.transmitter_count list=self.transmitter_list else: print("Invalid device type: " + type) return found = False for item in range(count): if list[item] == device[type]: if type == "remote": self.remote = list[item] elif type == "transmitter": self.transmitter = list[item] found = True break if device[type] == "Custom": if type == "remote": self.remote=device[type] self.remote_modules=device["remote_modules"] self.remote_driver=device["remote_driver"] self.remote_device=device["remote_device"] self.remote_lircd_conf=device["remote_lircd_conf"] elif type == "transmitter": self.transmitter=device[type] self.transmitter_modules=device["transmitter_modules"] self.transmitter_driver=device["transmitter_driver"] self.transmitter_device=device["transmitter_device"] self.transmitter_lircd_conf=device["transmitter_lircd_conf"] def get_device_dictionary(self,type): """Returns a dictionary of all the info for a given device type""" if type == "remote": return {"remote":self.remote, "remote_modules":self.remote_modules, "remote_device": self.remote_device, "remote_driver":self.remote_driver, "remote_lircd_conf":self.remote_lircd_conf} elif type == "transmitter": return {"transmitter":self.transmitter, "transmitter_modules":self.transmitter_modules, "transmitter_device": self.transmitter_device, "transmitter_driver":self.transmitter_driver, "transmitter_lircd_conf":self.transmitter_lircd_conf} def get_possible_devices(self,type): """Returns all the possible remotes or transmitters""" if type == "remote": return self.remote_list elif type == "transmitter": return self.transmitter_list else: print("Invalid type: " + type) return None def read_hardware_conf(self,file=HARDWARE_CONF): """Reads in a lirc hardware configuration""" try: in_f=open(file) remote_pattern=re.compile("^REMOTE=") found_remote=False remote_modules_pattern=re.compile("^REMOTE_MODULES=") remote_device_pattern=re.compile("^REMOTE_DEVICE=") remote_driver_pattern=re.compile("^REMOTE_DRIVER=") remote_lircd_conf_pattern=re.compile("^REMOTE_LIRCD_CONF=") transmitter_pattern=re.compile("^TRANSMITTER=") found_transmitter=False transmitter_modules_pattern=re.compile("^TRANSMITTER_MODULES=") transmitter_device_pattern=re.compile("^TRANSMITTER_DEVICE=") transmitter_driver_pattern=re.compile("^TRANSMITTER_DRIVER=") transmitter_lircd_conf_pattern=re.compile("^TRANSMITTER_LIRCD_CONF=") for line in in_f: if remote_pattern.search(line) and not found_remote: for item in range(self.remote_count): if (not found_remote) and (self.remote_list[item] == line.split('"')[1]): found_remote = True self.remote = line.split('"')[1] elif remote_modules_pattern.search(line): self.remote_modules = line.split('"')[1] elif remote_device_pattern.search(line): self.remote_device = line.split('"')[1] elif remote_driver_pattern.search(line): self.remote_driver = line.split('"')[1] elif remote_lircd_conf_pattern.search(line): self.remote_lircd_conf = line.split('"')[1] elif transmitter_pattern.search(line) and not found_transmitter: for item in range(self.transmitter_count): if (not found_transmitter) and (self.transmitter_list[item] == line.split('"')[1]): found_transmitter = True self.transmitter = line.split('"')[1] elif transmitter_modules_pattern.search(line): self.transmitter_modules = line.split('"')[1] elif transmitter_device_pattern.search(line): self.transmitter_device = line.split('"')[1] elif transmitter_driver_pattern.search(line): self.transmitter_driver = line.split('"')[1] elif transmitter_lircd_conf_pattern.search(line): self.transmitter_lircd_conf = line.split('"')[1] if not found_remote: self.remote="" if not found_transmitter: self.transmitter="" in_f.close() except IOError: print("Error opening " + file) def write_hardware_conf(self,file=HARDWARE_CONF): """Writes out a hardware.conf""" patternline="^REMOTE=" patternline+="|^TRANSMITTER=" patternline+="|^FORCE_NONINTERACTIVE_RECONFIGURATION=" #If we are known to be a custom remote, then write out other stuff too if self.remote == "Custom": custom_remote = True patternline+="|^REMOTE_MODULES=" patternline+="|^REMOTE_DRIVER=" patternline+="|^REMOTE_LIRCD_CONF=" else: custom_remote = False if self.transmitter == "Custom": custom_transmitter = True patternline+="|^TRANSMITTER_MODULES=" patternline+="|^TRANSMITTER_DRIVER=" patternline+="|^TRANSMITTER_LIRCD_CONF=" else: custom_transmitter = False pattern=re.compile(patternline) found_remote=False found_transmitter=False lines = None try: in_f = open(file) lines = in_f.readlines() in_f.close() except IOError: print("Unable to find " + file) out_f = open(file, 'w') for line in lines: if pattern.search(line) is None: out_f.write(line) continue else: if not found_remote and re.compile("^REMOTE=").search(line): out_f.write("REMOTE=\"" + self.remote + "\"\n") found_remote = True continue elif not found_transmitter and re.compile("^TRANSMITTER=").search(line): out_f.write("TRANSMITTER=\"" + self.transmitter + "\"\n") found_transmitter = True continue if re.compile("^FORCE_NONINTERACTIVE_RECONFIGURATION=").search(line): #a reconfigure of lirc will be necessary after writing this hardware conf out_f.write("FORCE_NONINTERACTIVE_RECONFIGURATION=\"" + "true" + "\"\n") if custom_remote: if re.compile("^REMOTE_MODULES=").search(line): out_f.write("REMOTE_MODULES=\"" + self.remote_modules + "\"\n") continue elif re.compile("^REMOTE_DRIVER=").search(line): out_f.write("REMOTE_DRIVER=\"" + self.remote_driver + "\"\n") continue elif re.compile("^REMOTE_DEVICE=").search(line): out_f.write("REMOTE_DEVICE=\"" + self.remote_device + "\"\n") continue elif re.compile("^REMOTE_LIRCD_CONF=").search(line): out_f.write("REMOTE_LIRCD_CONF=\"" + self.remote_lircd_conf + "\"\n") continue if custom_transmitter: if re.compile("^TRANSMITTER_MODULES=").search(line): out_f.write("TRANSMITTER_MODULES=\"" + self.transmitter_modules + "\"\n") continue elif re.compile("^TRANSMITTER_DRIVER=").search(line): out_f.write("TRANSMITTER_DRIVER=\"" + self.transmitter_driver + "\"\n") continue elif re.compile("^TRANSMITTER_DEVICE=").search(line): out_f.write("TRANSMITTER_DEVICE=\"" + self.transmitter_device + "\"\n") continue elif re.compile("^TRANSMITTER_LIRCD_CONF=").search(line): out_f.write("TRANSMITTER_LIRCD_CONF=\"" + self.transmitter_lircd_conf + "\"\n") continue if not found_remote: out_f.write("REMOTE=\"" + self.remote + "\"\n") if not found_transmitter: out_f.write("TRANSMITTER=\"" + self.transmitter + "\"\n") out_f.close() def reconfigure_lirc(self,interactive=False): """Restarts & Reconfigures LIRC""" if interactive: os.putenv('DEBIAN_FRONTEND','gnome') else: os.putenv('DEBIAN_FRONTEND','noninteractive') lirc_command = subprocess.Popen(["/usr/sbin/dpkg-reconfigure", "lirc"],stdout=subprocess.PIPE).communicate()[0] print(lirc_command) def query_advanced(self,remote_hwdb_file=REMOTE_HWDB,transmitter_hwdb_file=TRANSMITTER_HWDB): """Determine if this remote requires interactive configuration""" advanced_driver_pattern=re.compile("devinput") advanced_modules_pattern=re.compile("serial") remote_hwdb = open(remote_hwdb_file).readlines() transmitter_hwdb = open(transmitter_hwdb_file).readlines() #Filter out uncessary lines filter = "^\#|^\[" pattern = re.compile(filter) #search advanced remotes for line in remote_hwdb: if pattern.search(line) is None: list = line.split(";") if len(list) > 1 and list[0].translate(bytes.maketrans('',''),',') == self.remote: if advanced_driver_pattern.search(list[1]) or advanced_modules_pattern.search(list[2]): return True #search advanced transmitters for line in transmitter_hwdb: if pattern.search(line) is None: list = line.split(";") if len(list) > 1 and list[0].translate(bytes.maketrans('',''),',') == self.remote: if advanced_driver_pattern.search(list[1]) or advanced_modules_pattern.search(list[2]): return True return False def create_lircrc(self,file=LIRCD_CONF,change_permissions=True,irexec=False,irexec_only=False): """Generates lircrc files for all possible applications""" command = "mythbuntu-lircrc-generator" if file != LIRCD_CONF: command = command + " -L " + file if irexec == True: command = command + " --irexec 1" if irexec_only == True: command = command + " --mythtv 0 --mplayer 0 --totem 0 --elisa 0 --xine 0 --vlc 0 --xmame 0 --xmess 0" if change_permissions: uid = os.getenv('SUDO_UID') if uid != None: in_f=open("/etc/passwd") for line in in_f: fields = line.split(":") if fields[2] == uid: command = "su " + fields[0] + " -c " + command os.system(command) mythbuntu-common/mythbuntu_common/dictionaries.py0000664000000000000000000001167112664343134017745 0ustar # -*- coding: utf-8 -*- # # «dictionaries» - Manage list of all widget -> package matching # # This script: # Copyright (C) 2008, Mario Limonciello, 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 3 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 import string import subprocess #################### # Type dictionaries: different installation types possible def get_install_type_dictionary(self): list= { "Master Backend/Frontend" : self.master_be_fe, \ "Slave Backend/Frontend" : self.slave_be_fe, \ "Master Backend" : self.master_be, \ "Slave Backend" : self.slave_be, \ "Frontend" : self.fe, \ "Set Top Box" : self.stb } return list #################### #Plugin dictionaries: these are for managing a list of all possible plugins #################### def get_frontend_plugin_dictionary(self): list = { "mytharchive": self.mytharchive_checkbox, \ "mythbrowser": self.mythbrowser_checkbox, \ "mythgame": self.mythgame_checkbox, \ "mythgallery": self.mythgallery_checkbox, \ "mythmusic": self.mythmusic_checkbox, \ "mythnews": self.mythnews_checkbox, \ "mythnetvision": self.mythnetvision_checkbox, \ "mythweather": self.mythweather_checkbox } return list def get_backend_plugin_dictionary(self): return { "mythweb": self.mythweb_checkbox } #################### #Other dictionaries: these are for managing a list of all other apps #################### def get_role_dictionary(self): list = { "mythtv-backend-master": self.primary_backend_radio, \ "mythtv-backend": self.secondary_backend_radio, \ "mythtv-frontend": self.frontend_radio } return list def get_desktop_dictionary(self): list = { "ubuntu-desktop": self.ubuntu_desk_check, \ "xubuntu-desktop": self.xubuntu_desk_check, \ "kubuntu-desktop": self.kubuntu_desk_check } return list def get_media_app_dictionary(self): list = { "mplayer": self.mplayer_checkbox, \ "xine-ui": self.xine_checkbox, \ "vlc": self.vlc_checkbox } return list def get_nonfree_dictionary(self): list = { # "medibuntu-keyring": self.medibuntu_keyring, \ "libdvdcss2": self.enable_libdvdcss2 } return list def get_services_dictionary(self,sql_object=None): list = { "x11vnc": self.enablevnc, \ "samba": self.enablesamba, \ "nfs-kernel-server": self.enablenfs, \ "openssh-server": self.enablessh, \ "mysql-server": sql_object } return list def get_diskless_dictionary(self): list = { "mythbuntu-diskless-server": self.diskless_server_install, \ "dhcp3-server": self.diskless_server_dhcp } return list def get_graphics_dictionary(): list = {} ##AMD graphics detection #output=string.split(subprocess.Popen(['lspci'],stdout=subprocess.PIPE).communicate()[0],'\n') #for line in output: # if line and 'VGA' in line and ('AMD' in line or 'ATI' in line): # list["AMD Graphics"]="fglrx" # break #NVIDIA Graphics detection try: from NvidiaDetector.nvidiadetector import NvidiaDetection except ImportError: return list nv = NvidiaDetection().selectDriver() if nv is not None: list["NVIDIA Graphics"]=nv return list def get_tweak_dictionary(self): list = { "/etc/mysql/conf.d/mythtv-tweaks.cnf": self.enable_mysql_tweaks, \ # "/etc/cron.daily/mythtv-xfs-defrag": self.enable_nightly_defrag, \ "/etc/cron.daily/optimize_mythdb": self.enable_mysql_repair} return list mythbuntu-common/mythbuntu_common/mysql.py0000664000000000000000000002022512664343134016430 0ustar # -*- coding: utf-8 -*- # # «mysql» - mythbuntu class for mysql mangling # # This script: # Copyright (C) 2007-2010, Mario Limonciello, 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 3 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 import shutil import os import subprocess import re import string import xml.dom.minidom #pymysql isn't available yet. #for now don't fail on import try: import pymysql except: pass class MySQLHandler: """MySQL configuration, mangling, and activation class""" def __init__(self,config={"user":"mythtv","password":"mythtv","server":"localhost","database":"mythconverg","securitypin":"0000"}): self.user=config["user"] self.password=config["password"] self.server=config["server"] self.database=config["database"] self.securitypin=config["securitypin"] def _config_xml(self, file=None): """Reads in and parses and writes a config.xml from a number of places: 1) /etc/mythtv/config.xml 2) /usr/share/mythtv/config.xml Returns a dictionary filled with references that can be parsed or processed """ dictionary={"doc": None, 'DBHostName': None, 'DBUserName': None, 'DBPassword': None, 'DBName': None, 'SecurityPin' : None} for file in [file, '/etc/mythtv/config.xml', '/usr/share/mythtv/config.xml' ]: if file and os.path.exists(file): dictionary["doc"]=xml.dom.minidom.parse(file) for tag in dictionary: elements=dictionary["doc"].getElementsByTagName(tag) if elements: dictionary[tag]=elements[0] elif tag != "doc": dictionary[tag]=dictionary["doc"].createElement(tag) break return dictionary def write_xml(self,file): """Writes XML to a file""" dict=self._config_xml(file) if dict['DBHostName'].hasChildNodes(): dict['DBHostName'].childNodes[0].replaceWholeText(self.server) else: node = dom.xml.minidom.createTextNode(self.server) dict['DBHostName'].appendChild(node) if dict['DBUserName'].hasChildNodes(): dict['DBUserName'].childNodes[0].replaceWholeText(self.user) else: node = dom.xml.minidom.createTextNode(self.user) dict['DBUserName'].appendChild(node) if dict['DBPassword'].hasChildNodes(): dict['DBPassword'].childNodes[0].replaceWholeText(self.password) else: node = dom.xml.minidom.createTextNode(self.password) dict['DBPassword'].appendChild(node) if dict['DBName'].hasChildNodes(): dict['DBName'].childNodes[0].replaceWholeText(self.database) else: node = dom.xml.minidom.createTextNode(self.database) dict['DBName'].appendChild(node) if dict['SecurityPin'].hasChildNodes(): dict['SecurityPin'].childNodes[0].replaceWholeText(self.securitypin) else: node = dom.xml.minidom.createTextNode(self.securitypin) dict['SecurityPin'].appendChild(node) dict["doc"].writexml(open(file, 'w')) def read_xml(self,file): dict=self._config_xml(file) if dict['DBHostName'].hasChildNodes(): self.server = dict['DBHostName'].childNodes[0].data if dict['DBUserName'].hasChildNodes(): self.user = dict['DBUserName'].childNodes[0].data if dict['DBPassword'].hasChildNodes(): self.password = dict['DBPassword'].childNodes[0].data if dict['DBName'].hasChildNodes(): self.database = dict['DBName'].childNodes[0].data if dict['SecurityPin'].hasChildNodes(): self.securitypin = dict['SecurityPin'].childNodes[0].data def toggle_mysql_service_config(self,enable): """Enables and disables the mysql service on all interfaces""" if not os.path.exists("/etc/mysql/conf.d"): os.mkdir("/etc/mysql/conf.d") lines = None out_f = None found = False pattern = re.compile("^bind-address|^#bind-address") try: in_f = open("/etc/mysql/conf.d/mythtv.cnf") lines = in_f.readlines() in_f.close() out_f=open("/etc/mysql/conf.d/mythtv.cnf","w") for line in lines: if pattern.search(line) is None: out_f.write(line) elif not found: if enable: out_f.write("bind-address=::\n") else: out_f.write("#bind-address=::\n") found = True if not found: if enable: out_f.write("bind-address=::\n") else: out_f.write("#bind-address=::\n") except IOError: print("/etc/mysql/conf.d/mythtv.cnf not found") out_f=open("/etc/mysql/conf.d/mythtv.cnf","w") out_f.write("[mysqld]\n") if enable: out_f.write("bind-address=::\n") else: out_f.write("#bind-address=::\n") out_f.close() def restart_mysql_service(self): """Restarts MySQL service""" start_mysql = subprocess.Popen(["/usr/sbin/invoke-rc.d", "mysql", "restart"],stdout=subprocess.PIPE).communicate()[0] print(start_mysql) def update_config(self,config): """Sets up a new configuration based on the dict {user,pass,server,db,securitypin}""" self.user=config["user"] self.password=config["password"] self.server=config["server"] self.database=config["database"] self.securitypin=config["securitypin"] def get_config(self): """Returns our currently stored configuration""" return {"user":self.user,"password":self.password,"server":self.server,"database":self.database,"securitypin":self.securitypin} def reset_user_password(self,admin_pass,password): """Resets a user's password if it was forgotten""" commands = ["UPDATE user SET Password=PASSWORD('"+password+"') WHERE user=mythtv')", "FLUSH PRIVILEGES"] if self.run_mysql_commands(commands,mysql_user="root"): return "Successful" else: return "Failure" def run_mysql_commands(self,commands,mysql_user=None): """Runs mysql command(s) and returns the response""" if mysql_user is None: mysql_user = self.user try: db = pymysql.Connect(host=self.server, user=mysql_user, passwd=self.password,database=self.database) cursor = db.cursor() if type(commands) is list: for command in commands: cursor.execute(command) result = cursor.fetchone() elif type(commands) is str: result = cursor.execute(commands) else: print("Unknown type") cursor.close() db.close() except: result = False return result def do_connection_test(self, pin): """Tests to make sure that the backend is accessible""" try: import MythTV except ImportError: return False args = { 'SecurityPin' : pin } #figure out whether 0.24+ or 0.23 try: method = getattr(MythTV, "MythDBBase") except AttributeError: method = getattr(MythTV, "MythDB") try: db_base = method(args=args) except Exception as e: return str(e) mythbuntu-common/Changelog0000777000000000000000000000000012664343134016202 2debian/changelogustar mythbuntu-common/setup.cfg0000664000000000000000000000007412664343134013123 0ustar [build] i18n = True [build_i18n] domain = mythbuntu-common mythbuntu-common/COPYING0000664000000000000000000010451312664343134012340 0ustar GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program 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 3 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 program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mythbuntu-common/Makefile0000664000000000000000000000125212664343134012741 0ustar update-po: find -regex "./\(plugins\).*\.\(py\|glade\|ui\|in\)" \ | sed '/gtk\.ui/ s,^,[type: gettext/glade],' > po/POTFILES.in python setup.py build_i18n --merge-po --po-dir po clean: rm -rf build/* find . -type f -name "*.pyo" -delete translations: po/*.po # TODO evand 2009-07-28: Ideally we should build the mo files once, # instead of once here and once in setup.py. # Taken from Wubi. rm -rf build/translations mkdir -p build/translations/ @for po in $^; do \ language=`basename $$po`; \ language=$${language%%.po}; \ target="build/translations/$$language/LC_MESSAGES"; \ mkdir -p $$target; \ msgfmt --output=$$target/mythbuntu-common.mo $$po; \ done mythbuntu-common/examples/0000775000000000000000000000000012664343134013117 5ustar mythbuntu-common/examples/mythtv-tweaks.dist0000664000000000000000000000056012664343134016634 0ustar [mysqld] # The following values were partly taken from: # http://www.gossamer-threads.com/lists/mythtv/users/90942#90942 # key_buffer = 48M # max_allowed_packet = 8M table_cache = 128 sort_buffer_size = 48M net_buffer_length = 8M # thread_cache_size = 4 query_cache_type = 1 query_cache_size = 32M # don't do binary logs for mythconverg binlog_ignore_db = mythconverg mythbuntu-common/examples/exports.dist0000664000000000000000000000043512664343134015512 0ustar /var/lib/mythtv/recordings *(ro,async,no_root_squash,no_subtree_check) /var/lib/mythtv/videos *(ro,async,no_root_squash,no_subtree_check) /var/lib/mythtv/music *(ro,async,no_root_squash,no_subtree_check) /var/lib/mythtv/pictures *(ro,async,no_root_squash,no_subtree_check) mythbuntu-common/examples/smb.conf.dist0000664000000000000000000000163712664343134015520 0ustar [global] workgroup = MSHOME server string = %h server (Samba, Mythbuntu) log file = /var/log/samba/log.%m max log size = 1000 syslog = 0 panic action = /usr/share/samba/panic-action %d dns proxy = no security = user map to guest = Bad User [recordings] comment = TV Recordings path = /var/lib/mythtv/recordings public = yes writable = no create mask = 0777 directory mask = 0777 force user = nobody force group = nogroup [videos] comment = Videos path = /var/lib/mythtv/videos public = yes writable = yes create mask = 0660 directory mask = 0770 force user = mythtv force group = mythtv [music] comment = Music path = /var/lib/mythtv/music public = yes writable = yes create mask = 0660 directory mask = 0770 force user = mythtv force group = mythtv [pictures] comment = Pictures path = /var/lib/mythtv/pictures public = yes writable = yes create mask = 0660 directory mask = 0770 force user = mythtv force group = mythtv mythbuntu-common/README0000664000000000000000000000070112664343134012157 0ustar # mythbuntu-common # By: Mario Limonciello This package provides the basis for all plugins used in Mythbuntu. It's primary purpose to reduce code duplication. It's functions currently get reused in both the Mythbuntu Control Centre (MCC) and the Mythbuntu installer (Ubiquity). Starting with Mythbuntu 9.10 (Karmic Koala), this package breaks up mcc support into individual plugins. Other packages can provide MCC plugins very similar to this. mythbuntu-common/plugins/0000775000000000000000000000000012664343134012762 5ustar mythbuntu-common/plugins/python/0000775000000000000000000000000012704067171014302 5ustar mythbuntu-common/plugins/python/mysql_configuration.py0000664000000000000000000001703312664343134020755 0ustar ## -*- coding: utf-8 -*- # # «mysql_configuration» - MCC MysQL Related configuration plugin # # Copyright (C) 2009, Mario Limonciello, 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 os import re import logging from mythbuntu_common.mysql import MySQLHandler from mythbuntu_common.dictionaries import get_tweak_dictionary MYSQL_TXT='/etc/mythtv/mysql.txt' MYTHTV_SETUP='/usr/bin/mythtv-setup' OPTIMIZE_DATABASE="/usr/bin/x-terminal-emulator -e perl /usr/share/doc/mythtv-backend/contrib/maintenance/optimize_mythdb.pl" class MySQLConfigurationPlugin(MCCPlugin): """A configuration tool for MySQL Related Connectivity""" def __init__(self): #Initialize parent class information = {} information["name"] = "MySQL" information["icon"] = "gtk-network" information["ui"] = "tab_mysql_configuration" MCCPlugin.__init__(self,information) self.mysql=MySQLHandler() def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" #Roles self.frontend=False self.mysql_service=False if self.query_installed('mythtv-backend-master'): #enable master backend and backend, disable frontend self.master=True self.backend=True if os.path.exists("/etc/mysql/conf.d/mythtv.cnf"): in_f=open("/etc/mysql/conf.d/mythtv.cnf") for line in in_f: if re.compile("^bind-address").search(line): self.mysql_service=True break in_f.close() else: self.master=False self.backend=self.query_installed('mythtv-backend') if os.path.exists(os.path.join(os.environ['HOME'], '.mythtv', 'config.xml')): self.mysql.read_xml(os.path.join(os.environ['HOME'], '.mythtv', 'config.xml')) #Dictionaries self.dictionary_state={} list=get_tweak_dictionary(self) for item in list: self.dictionary_state[list[item]]=os.path.exists(item) def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" #Master if self.master: self.master_backend_vbox.show() if self.mysql_service: self.enablemysql.set_active(1) else: self.enablemysql.set_active(0) else: self.master_backend_vbox.hide() #Backend if self.backend: self.backend_vbox.show() else: self.backend_vbox.hide() #Connectivity config=self.mysql.get_config() self.security_entry.set_text(config["securitypin"]) self.mysql_test_hbox.hide() #Dictionaries for item in self.dictionary_state: item.set_active(self.dictionary_state[item]) self._incomplete=False def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) list=get_tweak_dictionary(self) for item in list: if list[item].get_active() != self.dictionary_state[list[item]]: self._markReconfigureRoot(item,list[item].get_active()) if self.master: if self.mysql_service and self.enablemysql.get_active_text() == "Disable": #disable service self._markReconfigureRoot("mysql_service",False) if not self.mysql_service and self.enablemysql.get_active_text() == "Enable": #enable service self._markReconfigureRoot("mysql_service",True) else: config=self.mysql.get_config() if self.security_entry.get_text() != config["securitypin"]: self._markReconfigureUser("securitypin",self.security_entry.get_text()) def root_scripted_changes(self,reconfigure): """System-wide changes that need root access to be applied. This function is ran by the dbus backend""" for item in reconfigure: if item == "mysql_service": self.mysql.toggle_mysql_service_config(reconfigure[item]) self.mysql.restart_mysql_service() elif item == "/etc/mysql/conf.d/mythtv-tweaks.cnf" or\ item == "/etc/cron.daily/optimize_mythdb": if reconfigure[item]: import shutil try: if os.path.exists(item): os.remove(item) if item == "/etc/mysql/conf.d/mythtv-tweaks.cnf": shutil.copy('/usr/share/mythbuntu/examples/mythtv-tweaks.dist',item) else: shutil.copy('/usr/share/doc/mythtv-backend/contrib/maintenance/optimize_mythdb.pl',item) os.chmod(item,0o755) except Exception as msg: logging.warning("Exception when enabling %s, %s" % (item,msg)) else: try: os.remove(item) except Exception as msg: logging.warning("Exception when disabling item %s, %s" % (item,msg)) def user_scripted_changes(self, reconfigure): for item in reconfigure: if item == "securitypin": logging.debug("Updating MySQL config") #We don't actually have to modify this - if it was successful, it would have happened from the test. self.mysql.read_xml() if not os.path.exists(os.path.join(os.environ['HOME'],'.mythtv')): os.makedirs(os.path.join(os.environ['HOME'],'.mythtv')) self.mysql.write_mysql_txt(os.path.join(os.environ['HOME'],'.mythtv','mysql.txt')) def do_connection_test(self,widget): """Performs a connectivity test to the backend's mysql server""" if widget is not None: self.mysql_test_hbox.show() result = self.mysql.do_connection_test(self.security_entry.get_text()) if not result: self.pass_mysql.show() self.fail_mysql.hide() self._incomplete=False return self.pass_mysql.hide() self.fail_mysql.show() self._incomplete=True def launch_app(self,widget): """Launches an app defined in the glade file""" if widget.get_name() == 'mysql_tweak_button': MCCPlugin.launch_app(self,widget,OPTIMIZE_DATABASE) elif widget.get_name() == 'mythtv_setup_button': MCCPlugin.launch_app(self,widget,MYTHTV_SETUP) mythbuntu-common/plugins/python/services.py0000664000000000000000000001370312664343134016504 0ustar ## -*- coding: utf-8 -*- # # «services» - MCC Services enablement plugin # # Copyright (C) 2009, Mario Limonciello, 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 from mythbuntu_common.dictionaries import get_services_dictionary from mythbuntu_common.vnc import VNCHandler import re import shutil import os from gi.repository import Gtk class MCCServices(MCCPlugin): """Services enablement plugin""" def __init__(self): information = {} information["name"] = "Services" information["icon"] = "gnome-settings" information["ui"] = "tab_services" MCCPlugin.__init__(self,information) self.vnc=VNCHandler() def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" #Most services meet this category self.dictionary_state={} list = get_services_dictionary(self) for item in list: if list[item] is not None: self.dictionary_state[list[item]]=self.query_installed(item) #VNC password self.vnc_pass='' def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" #from previous runs self.vnc_pass_hbox.hide() #Load the detected dictionary for item in self.dictionary_state: model = item.get_model() if len(model) > 2: iter = model.get_iter(Gtk.TreePath([2,0])) model.remove(iter) if self.dictionary_state[item]: item.set_active_iter(model.get_iter(Gtk.TreePath([1,0]))) model.append(["Reconfigure"]) else: item.set_active_iter(model.get_iter(Gtk.TreePath([0,0]))) #Corner cases that don't need reconfiguring model = self.enablessh.get_model() if len(model) > 2: iter = model.get_iter(Gtk.TreePath([2,0])) model.remove(iter) def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) list=get_services_dictionary(self) for item in list: if list[item] is not None and \ list[item].get_active() != self.dictionary_state[list[item]]: #Installable items if list[item].get_active() == 1: self._markInstall(item) #Removable items elif list[item].get_active() == 0: self._markRemove(item) #Reconfigurable items: if list[item].get_active() > 0 and \ item != 'openssh-server' and \ item != 'x11vnc': self._markReconfigureRoot(item,list[item].get_active()) #VNC password if self.vnc_pass != self.vnc_password.get_text(): bytepassword = self.vnc_password.get_text().encode('utf-8') self._markReconfigureUser("x11vnc_password",bytepassword) def toggle_vnc(self,widget): """Called whenever VNC service is toggled""" if (widget is not None and widget.get_name() == 'enablevnc'): iteration=1 if self.dictionary_state[self.enablevnc]: iteration = 2 if widget.get_active() == iteration: self.vnc_pass_hbox.show() self.vnc_error_image.show() self._incomplete=True else: self.vnc_password.set_text("") self.vnc_pass_hbox.hide() self.vnc_error_image.hide() self._incomplete=False def toggle_vnc_password(self,widget): if (widget is not None and widget.get_name() == 'vnc_password'): password= widget.get_text().split(' ')[0] if len(password) >= 6: self.vnc_error_image.hide() self._incomplete=False else: self.vnc_error_image.show() self._incomplete=True def root_scripted_changes(self,reconfigure): """System-wide changes that need root access to be applied. This function is ran by the dbus backend""" for item in reconfigure: if item == "samba": if os.path.exists('/etc/samba/smb.conf'): shutil.copy('/etc/samba/smb.conf','/etc/samba/smb.conf.dpkg-dist') shutil.copy('/usr/share/mythbuntu/examples/smb.conf.dist', '/etc/samba/smb.conf') elif item == "nfs-kernel-server": if os.path.exists('/etc/exports'): shutil.copy('/etc/exports','/etc/exports.dpkg-dist') shutil.copy('/usr/share/mythbuntu/examples/exports.dist', '/etc/exports') def user_scripted_changes(self,reconfigure): """Local changes that can be performed by the user account. This function will be ran by the frontend""" for item in reconfigure: if item == "x11vnc_password": self.vnc.create_password(reconfigure[item]) mythbuntu-common/plugins/python/remote.py0000664000000000000000000003245212664343134016156 0ustar ## -*- coding: utf-8 -*- # # «remote» - MCC Infrared device selection plugin # # Copyright (C) 2010, John Baab, for Mythbuntu # Copyright (C) 2009, Mario Limonciello, 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 from mythbuntu_common.lirc import LircHandler from gi.repository import Gtk import os import subprocess import logging class RemotePlugin(MCCPlugin): """A GUI configuration tool for LIRC""" def __init__(self): #Initialize parent class information = {} information["name"] = "Infrared" information["icon"] = "gtk-media-record" information["ui"] = "tab_remote_control" MCCPlugin.__init__(self,information) self.count={} self.count["remote"]=0 self.count["transmitter"]=0 #Helper functions def populate_lirc(self): """Fills the lirc pages with the appropriate data""" def fill_array(list,possible_items): """Fills an individual array up""" count=0 for item in possible_items: list.append([item]) count = count + 1 return count for type in ('remote','transmitter'): list = self.builder.get_object(type + '_list') model = list.get_model() self.count[type]=fill_array(model, \ self.lirc.get_possible_devices(type)) list.set_active_iter(model.get_iter(Gtk.TreePath([0,0]))) def find_lircrc(self): """Determines if there is current a lircrc for the current user""" return os.path.exists(os.getenv('HOME') + '/.lircrc') #Inherited, overridden functions def captureState(self): """Determines the state of the items on managed by this plugin""" #Parent functionality for state capturing MCCPlugin.clearParentState(self) #If this is a first run of capturing, we might need to fill #in our remote_count self.state = {} for item in ['lirc','mythbuntu-lirc-generator']: self.state[item] = self.query_installed(item) #TODO, detect smartphone type somehow. self.state['type'] = 'native' if self.state['lirc']: self.state['type'] = 'lirc' if self.count["remote"] is 0: self.lirc=LircHandler() self.populate_lirc() #Read in our /etc/lirc/hardware.conf self.lirc.read_hardware_conf() def applyStateToGUI(self): """Takes the current state in formation and sets the GUI""" def match_object(saved_setting, list, count): """Attempts to match a saved object to a GTK list of objects""" if saved_setting is "Custom": return True elif saved_setting != "None": for item in range(count): model = list.get_model() iter = model.get_iter(Gtk.TreePath([item,0])) list.set_active_iter(iter) if model[iter][0] == saved_setting: return True return False def load_custom(type,dictionary): """Loads a custom remote or transmitter into the GUI""" modules=self.builder.get_object(type + '_modules') device=self.builder.get_object(type + '_device') driver=self.builder.get_object(type + '_driver') conf=self.builder.get_object('browse_' + type + '_lircd_conf') modules.set_text(dictionary[type + "_modules"]) driver.set_text(dictionary[type + "_driver"]) device.set_text(dictionary[type + "_device"]) conf.select_filename("/usr/share/lirc/" + type ) if os.path.exists("/usr/share/lirc/" + type + '/' + dictionary[type + "_lircd_conf"]): conf.select_filename("/usr/share/lirc/" + type + '/' + dictionary[type + "_lircd_conf"]) if self.state['type'] == 'lirc': self.smartphone_vbox.set_sensitive(False) self.lirc_vbox.set_sensitive(True) self.lirc_support.set_active(True) for type in ('remote','transmitter'): dict=self.lirc.get_device_dictionary(type) list=self.builder.get_object(type + '_list') checkbox=self.builder.get_object(type + 'control') found=match_object(dict[type],list,self.count[type]) checkbox.set_active(found) self.toggle_ir(checkbox,True) #"Custom" support load_custom(type,dict) elif self.state['type'] == 'native': self.lirc_vbox.set_sensitive(False) self.smartphone_vbox.set_sensitive(False) else: self.lirc_vbox.set_sensitive(False) self.smartphone_vbox.set_sensitive(True) def compareState(self): """Determines what items have been modified on this plugin""" def test_basic_changes(type): """Test for changes in a regular remote or transmitter""" old=self.lirc.get_device_dictionary(type)[type] list = self.builder.get_object(type + '_list') model = list.get_model() current = model[list.get_active_iter()][0] if old != current: self._markReconfigureRoot(type,current) return current def test_custom_changes(type): """Tests for changes in a custom remote or transmitter""" old={} new={} old['modules']=self.lirc.get_device_dictionary(type)[type + "_modules"] old['device']=self.lirc.get_device_dictionary(type)[type + "_device"] old['driver']=self.lirc.get_device_dictionary(type)[type + "_driver"] old['lircd_conf']=self.lirc.get_device_dictionary(type)[type + "_lircd_conf"] new['modules']=self.builder.get_object(type + '_modules').get_text() new['device']=self.builder.get_object(type + '_device').get_text() new['driver']=self.builder.get_object(type + '_driver').get_text() new['lircd_conf']=self.builder.get_object('browse_' + type + '_lircd_conf').get_filename() for item in old: if old[item] != new[item]: self._markReconfigureRoot(type + '_'+ item,new[item]) #Prepare for state capturing MCCPlugin.clearParentState(self) #check for type changes if self.native_support.get_active(): radio = 'native' elif self.lirc_support.get_active(): radio = 'lirc' else: radio = 'smartphone' #figure out if we are installing lirc or removing it if self.state['type'] != radio: if radio == 'lirc' and not self.state['lirc']: self._markInstall('lirc') elif self.state['lirc']: self._markRemove('lirc') if self.state['lirc']: for type in ('remote','transmitter'): value = test_basic_changes(type) if value == 'Custom': test_custom_changes(type) if self.generate_lircrc_checkbox.get_active(): if not self.state['mythbuntu-lirc-generator']: self._markInstall('mythbuntu-lirc-generator') if self.enable_irexec_checkbox.get_active(): self._markReconfigureUser("generate_lircrc_irexec", True) else: self._markReconfigureUser("generate_lircrc",True) elif self.enable_irexec_checkbox.get_active(): if not self.state['mythbuntu-lirc-generator']: self._markInstall('mythbuntu-lirc-generator') self._markReconfigureUser("generate_lircrc_irexec_only", True) def toggle_ir(self,widget,internal=False): """Callback used for any widgets in the remote plugin""" def toggle_active_section(widget,type): """Turns on or off an IR remote""" hbox=self.builder.get_object(type + '_hbox') list=self.builder.get_object(type + '_list') hbox.set_sensitive(widget.get_active()) if widget.get_active(): if list.get_active() == 0: list.set_active(1) else: list.set_active(0) def toggle_active_object_selection(widget,type): """Toggles the active device selection and related items""" control=self.builder.get_object(type + 'control') list=self.builder.get_object(type + '_list') driver=self.builder.get_object(type + '_driver_hbox') modules=self.builder.get_object(type + '_modules_hbox') device=self.builder.get_object(type + '_device_hbox') config=self.builder.get_object(type + '_configuration_hbox') if list.get_model()[list.get_active_iter()][0] == "Custom": custom = True else: custom = False if list.get_active() == 0: control.set_active(False) return False for item in (driver, modules, device, config): if custom: item.show() else: item.hide() return True if internal and self.find_lircrc(): self.generate_lircrc_checkbox.set_active(False) self.enable_irexec_checkbox.set_active(False) if widget is not None: #toggle types on the page if type(widget) is Gtk.RadioButton: #they all have callbacks, only use the active one if widget.get_active(): name = widget.get_name() if name == 'native_support': self.smartphone_vbox.set_sensitive(False) self.lirc_vbox.set_sensitive(False) elif name == 'smartphone_support': self.smartphone_vbox.set_sensitive(True) self.lirc_vbox.set_sensitive(False) self.emit_progress("Smartphone support selected.\n\nYou must enable the 'Network Remote Control interface' in the frontend\n\nSetup > General > Remote Control (6th screen)", 100) #the lirc package needs to be installed to show this elif self.state['lirc']: self.smartphone_vbox.set_sensitive(False) self.lirc_vbox.set_sensitive(True) #turn on/off IR remote elif widget.get_name() == 'remotecontrol': toggle_active_section(widget,"remote") #turn on/off IR transmitter elif widget.get_name() == "transmittercontrol": toggle_active_section(widget,"transmitter") #if our selected remote itself changed elif widget.get_name() == 'remote_list': if toggle_active_object_selection(widget,"remote"): self.generate_lircrc_checkbox.set_active(True) else: self.generate_lircrc_checkbox.set_active(False) #if our selected transmitter itself changed elif widget.get_name() == 'transmitter_list': toggle_active_object_selection(widget,"transmitter") def user_scripted_changes(self,reconfigure): """Local changes that can be performed by the user account. This function will be ran by the frontend.""" for item in reconfigure: if item == "generate_lircrc": self.lirc.create_lircrc(change_permissions=False) elif item == "generate_lircrc_irexec": self.lirc.create_lircrc(change_permissions=False,irexec=True) elif item == "generate_lircrc_irexec_only": self.lirc.create_lircrc(change_permissions=False,irexec=True,irexec_only=True) def root_scripted_changes(self,reconfigure): """System-wide changes that need root access to be applied. This function is ran by the dbus backend""" lirc=LircHandler() found = False for item in reconfigure: if item == "remote" or item == "transmitter": logging.debug("Setting item %s to %s." % (item,reconfigure[item])) lirc.set_device({item:reconfigure[item]},item) found = True if found: logging.debug("Writing out /etc/lirc/hardware.conf") lirc.write_hardware_conf() logging.debug("Reconfiguring LIRC package") lirc.reconfigure_lirc(interactive=False) return found mythbuntu-common/plugins/python/startup_behavior.py0000664000000000000000000000635412664343134020246 0ustar ## -*- coding: utf-8 -*- # # «startup_behavior» - MCC Automatic Login enablement plugin # # Copyright (C) 2009, Mario Limonciello, 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 os import string import re class LoginPlugin(MCCPlugin): """A plugin for setting up automatic login""" def __init__(self): #Initialize parent class information = {} information["name"] = "Startup Behavior" information["icon"] = "emblem-desktop" information["ui"] = "tab_startup_behavior" self.user_count=0 MCCPlugin.__init__(self,information) def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" self.autostart_state=os.path.exists(os.environ['HOME'] + '/.config/autostart/mythtv.desktop') def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" self.enableautostartup.set_active(self.autostart_state) def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) if self.autostart_state != self.enableautostartup.get_active(): self._markReconfigureUser("autostartup",self.enableautostartup.get_active()) def user_scripted_changes(self,reconfigure): """Local changes that can be performed by the user account. This function will be ran by the frontend""" for item in reconfigure: if item == 'autostartup': home = os.environ['HOME'] if reconfigure[item]: if not os.path.exists(home + '/.config/autostart'): os.makedirs(home + '/.config/autostart') if not os.path.exists(home + '/.config/autostart/mythtv.desktop'): try: os.symlink('/usr/share/applications/mythtv.desktop',home + '/.config/autostart/mythtv.desktop') except OSError: os.unlink(home + '/.config/autostart/mythtv.desktop') os.symlink('/usr/share/applications/mythtv.desktop',home + '/.config/autostart/mythtv.desktop') elif os.path.exists(home + '/.config/autostart/mythtv.desktop'): os.remove(home + '/.config/autostart/mythtv.desktop') mythbuntu-common/plugins/python/mythbuntu_repos.py0000664000000000000000000003277112704027135020131 0ustar ## -*- coding: utf-8 -*- # # «Mythbuntu Repos» - A Plugin for adding Mythbuntu Repos. (ie. -testing and # Auto-Builds) # # Copyright (C) 2009, 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 os import re import subprocess import urllib.request, urllib.error, urllib.parse import shutil import subprocess import configparser #from bzrlib.plugin import load_plugins #from bzrlib import branch, tree import time class MythbuntuReposPlugin(MCCPlugin): """A Plugin for adding Mythbuntu Repos""" # #Load GUI & Calculate Changes # def __init__(self): #Initialize parent class information = {} information["name"] = "Repositories" information["icon"] = "emblem-downloads" information["ui"] = "tab_repos" MCCPlugin.__init__(self, information) self.CONFIGFILE = "/etc/default/mythbuntu-repos" self.USERHOME = os.path.expanduser("~") if not os.path.isdir(self.USERHOME+"/.mythbuntu"): os.mkdir(self.USERHOME+"/.mythbuntu") if not os.path.isfile(self.USERHOME+"/.mythbuntu/repos.db"): try: #pass self.downloadFile() except: pass #shutil.copy("/usr/share/mythbuntu/repos.db", self.USERHOME+"/.mythbuntu/") self.config = configparser.ConfigParser() #Set mythtv versions def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" self.versions = [] for line in open("/etc/lsb-release"): if "DISTRIB_CODENAME" in line: line = line.strip("\n") throwaway, distro = line.split("=") NumRepos = 0 if os.path.isfile(self.USERHOME+"/.mythbuntu/repos.db"): self.versions = [] for line in open(self.USERHOME+"/.mythbuntu/repos.db"): if distro in line: line = line.strip("\n") release, version = line.split("\t") if not version in self.versions: self.versions.append(version) NumRepos += 1 elif "MYTHTV_RELEASE" in line: line = line.strip("\n") VerName, self.CurVer = line.split("\t") elif "TRUNKPASS" in line: line = line.strip("\n") discard, self.TRUNKPASS = line.split("\t") elif "URL" in line: line = line.strip("\n") discard, self.DOWNLOADURL = line.split("\t") self.download_repo_db_label.hide() self.mythtv_updates_alignment.show() self.mythtv_updates_ckbox_alignment.show() self.mythtv_updates_label.show() self.mythtv_updates_checkbox.show() self.repobox.show() self.hseparator3.show() self.mythbuntu_updates_alignment.show() self.mythbuntu_updates_checkbox_alignment.show() self.hseparator4.show() self.xmltv_updates_alignment.show() self.xmltv_updates_checkbox_alignment.show() self.hseparator5.show() self.footer_alignment.show() else: self.versions.append('0') self.CurVer = '0' self.download_repo_db_label.show() self.mythtv_updates_alignment.hide() self.mythtv_updates_ckbox_alignment.hide() self.mythtv_updates_label.hide() self.mythtv_updates_checkbox.hide() self.repobox.hide() self.hseparator3.hide() self.mythbuntu_updates_alignment.hide() self.mythbuntu_updates_checkbox_alignment.hide() self.hseparator4.hide() self.xmltv_updates_alignment.hide() self.xmltv_updates_checkbox_alignment.hide() self.hseparator5.hide() self.footer_alignment.hide() self.trunk_block.hide() self.DOWNLOADURL = 'http://people.ubuntu.com/~tgm4883/repos.db' self.changes = {} self.repobox.get_model().clear() for item in self.versions: self.builder.get_object('repobox').append_text(item) if os.path.exists(self.CONFIGFILE): self.config.read(self.CONFIGFILE) try: self.changes['MythTVUpdatesActivated'] = self.config.getboolean("cfg", "ActivateMythTVUpdates") except: self.changes['MythTVUpdatesActivated'] = False try: self.changes['MythTVUpdatesRepo'] = self.config.get("cfg", "MythTVRepo") except: self.changes['MythTVUpdatesRepo'] = self.versions[0] try: self.changes['ActivateMythbuntuUpdates'] = self.config.getboolean("cfg", "ActivateMythbuntuUpdates") except: self.changes['ActivateMythbuntuUpdates'] = False try: self.changes['ActivateXMLTVUpdates'] = self.config.getboolean("cfg", "ActivateXMLTVUpdates") except: self.changes['ActivateXMLTVUpdates'] = False def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" self.mythtv_updates_checkbox.set_active(self.changes['MythTVUpdatesActivated']) self.repobox.set_sensitive(self.changes['MythTVUpdatesActivated']) try: self.repobox.set_active(self.versions.index(self.changes['MythTVUpdatesRepo'])) except ValueError: self.repobox.set_active(0) self.mythbuntu_updates_checkbox.set_active(self.changes['ActivateMythbuntuUpdates']) self.xmltv_updates_checkbox.set_active(self.changes['ActivateXMLTVUpdates']) self.trunk_pass_ok.hide() def on_mythtv_updates_checkbox_toggled(self, widget, data=None): """Show the repobox if this is checked""" widget_was_visible = self.mythtv_updates_checkbox.get_active() if widget_was_visible: self.repobox.set_sensitive(True) else: self.repobox.set_sensitive(False) def on_dev_password_entry_changed(self, widget, data=None): """Require a password for using trunk""" if self.dev_password_entry.get_text() == self.TRUNKPASS: self.trunk_pass_error.hide() self.trunk_pass_ok.show() else: self.trunk_pass_error.show() self.trunk_pass_ok.hide() def on_repobox_changed(self, widget, data=None): """Check the version to know if it's trunk""" if not self.repobox.get_active_text() == None: SELVER = self.convertVersion(self.repobox.get_active_text()) if SELVER > self.CurVer: self.trunk_block.show() else: self.trunk_block.hide() def convertVersion(self, VERSION): """Remove the trailing .x if it exists""" if VERSION.endswith(".x"): VERSION = VERSION.strip(".x") return VERSION def compareState(self): """Determines what items have been modified on this plugin""" MCCPlugin.clearParentState(self) SENDLIST = False SELVER = self.convertVersion(self.repobox.get_active_text()) if self.mythtv_updates_checkbox.get_active() != self.changes['MythTVUpdatesActivated'] and self.mythtv_updates_checkbox.get_active() == False: self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active()) SENDLIST = True if self.repobox.get_sensitive() == True: if self.repobox.get_active_text() != self.changes['MythTVUpdatesRepo'] or self.mythtv_updates_checkbox.get_active() != self.changes['MythTVUpdatesActivated']: if (SELVER > self.CurVer and self.dev_password_entry.get_text() == self.TRUNKPASS) or SELVER <= self.CurVer: self._markReconfigureRoot('MythTV-Updates-Repo', self.repobox.get_active_text()) self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active()) SENDLIST = True elif self.mythtv_updates_checkbox.get_active() == False: self._markReconfigureRoot('MythTV-Updates-Activated', self.mythtv_updates_checkbox.get_active()) if self.mythbuntu_updates_checkbox.get_active() != self.changes['ActivateMythbuntuUpdates']: self._markReconfigureRoot('Mythbuntu-Updates-Activated', self.mythbuntu_updates_checkbox.get_active()) if self.xmltv_updates_checkbox.get_active() != self.changes['ActivateXMLTVUpdates']: self._markReconfigureRoot('XMLTV-Updates-Activated', self.xmltv_updates_checkbox.get_active()) if SENDLIST == True: self._markReconfigureRoot('Repo-list', self.versions) def refresh_button_clicked(self, widget, data=None): """Download a new db file if requested""" self.downloadFile() self.captureState() self.applyStateToGUI() def downloadFile(self): """Download files""" self.emit_progress("Refreshing available repos from server", 0) time.sleep(.5) try: url = self.DOWNLOADURL except: url = 'http://people.ubuntu.com/~tgm4883/repos.db' try: import urllib.request from urllib.error import HTTPError,URLError # Open the url f = urllib.request.urlopen(url) # Open our local file for writing local_repo_file = open(self.USERHOME+"/.mythbuntu/repos.db", "wb") #Write to our local file local_repo_file.write(f.read()) local_repo_file.close() self.emit_progress("New DB file download finished", 100) #handle errors except HTTPError as e: print("HTTP Error:",e.code , url) self.emit_progress("HTTP Error: Failed to download new DB file", 0) except URLError as e: print("URL Error:",e.reason , url) self.emit_progress("URL Error: Failed to download new DB file", 0) time.sleep(2) #self.close_progress() # # 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.emit_progress("Opening config file", 10) if os.path.exists(self.CONFIGFILE): self.config.read("/etc/default/mythbuntu-repos") else: self.config.add_section("cfg") if "Repo-list" in reconfigure: self.emit_progress("Removing old repositories", 40) for item in reconfigure["Repo-list"]: if item.endswith(".x"): item = item.strip(".x") subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/"+item]) if "MythTV-Updates-Activated" in reconfigure: self.emit_progress("Configuring MythTV Updates repo", 50) if reconfigure["MythTV-Updates-Activated"]: repo = reconfigure["MythTV-Updates-Repo"] self.config.set("cfg", "ActivateMythTVUpdates", "True") self.config.set("cfg", "MythTVRepo", repo) if repo.endswith(".x"): repo = repo.strip(".x") subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/"+repo]) else: self.config.set("cfg", "ActivateMythTVUpdates", "False") if "Mythbuntu-Updates-Activated" in reconfigure: self.emit_progress("Configuring Mythbuntu Updates repo", 60) if reconfigure["Mythbuntu-Updates-Activated"]: subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/testing"]) self.config.set("cfg", "ActivateMythbuntuUpdates", "True") else: subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/testing"]) self.config.set("cfg", "ActivateMythbuntuUpdates", "False") if "XMLTV-Updates-Activated" in reconfigure: self.emit_progress("Configuring XMLTV Updates repo", 70) if reconfigure["XMLTV-Updates-Activated"]: subprocess.call(["apt-add-repository", "-y", "ppa:mythbuntu/xmltv"]) self.config.set("cfg", "ActivateXMLTVUpdates", "True") else: subprocess.call(["apt-add-repository", "-r", "-y", "ppa:mythbuntu/xmltv"]) self.config.set("cfg", "ActivateXMLTVUpdates", "False") with open('/etc/default/mythbuntu-repos', 'w', encoding='utf8') as configfile: self.emit_progress("Writing config file", 80) self.config.write(configfile) self.emit_progress("Done configuring repositories", 100) time.sleep(2) mythbuntu-common/plugins/python/plugins.py0000664000000000000000000002050612664343134016341 0ustar ## -*- coding: utf-8 -*- # # «plugins» - MCC & MythTV Plugin enablement plugin # # Copyright (C) 2009, Mario Limonciello, 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 from gi.repository import Gtk import os import string import logging import configparser from mythbuntu_common.dictionaries import * class MythPluginsPlugin(MCCPlugin): """A tool for enabling different MythTV plugins""" CONFIGFILE = "/etc/default/mythweb" def __init__(self): #Initialize parent class information = {} information["name"] = "Plugins" information["icon"] = "gtk-add" information["ui"] = "tab_plugins" self.config = configparser.RawConfigParser() MCCPlugin.__init__(self,information) def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" #Dictionaries self.dictionary_state={} for list in get_frontend_plugin_dictionary(self), \ get_backend_plugin_dictionary(self): for item in list: self.dictionary_state[list[item]]=self.query_installed(item) #Mythweb auth self.mythweb_auth={} found_cfg=False if os.path.exists(self.CONFIGFILE): self.config.read(self.CONFIGFILE) try: self.mythweb_auth['enable'] = self.config.getboolean("cfg", "enable") self.mythweb_auth['user'] = self.config.getboolean("cfg", "username") self.mythweb_auth['pass'] = self.config.getboolean("cfg", "password") found_cfg=True except Exception: pass if not found_cfg: self.mythweb_auth['enable'] = os.path.exists('/etc/mythtv/mythweb-digest') self.mythweb_auth['user'] = "" self.mythweb_auth['pass'] = "" def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" #Load the detected dictionary for item in self.dictionary_state: item.set_active(self.dictionary_state[item]) #Mythweb auth self.password_table.hide() self.mythweb_username.set_text("") self.mythweb_password.set_text("") model = self.mythweb_password_combobox1.get_model() if len(model) > 2: iter = model.get_iter(Gtk.TreePath([2,0])) model.remove(iter) self.mythweb_password_combobox1.remove_all() self.mythweb_password_combobox1.append_text("Disable") self.mythweb_password_combobox1.append_text("Enable") if self.mythweb_auth['enable']: #self.mythweb_password_combobox1.set_active_iter(model.get_iter(Gtk.TreePath([0,1]))) self.mythweb_password_combobox1.set_active(1) self.mythweb_password_combobox1.append_text("Reconfigure") else: self.mythweb_password_combobox1.set_active(0) #self.mythweb_password_combobox1.set_active_iter(model.get_iter(Gtk.TreePath([0,0]))) self.toggle_plugins(self.mythweb_checkbox) def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) #Installable items for list in get_frontend_plugin_dictionary(self), \ get_backend_plugin_dictionary(self): for item in list: if list[item].get_active() != self.dictionary_state[list[item]]: if list[item].get_active(): self._markInstall(item) else: self._markRemove(item) #Mythweb auth if self.mythweb_password_combobox1.get_active() != self.mythweb_auth['enable']: self._markReconfigureRoot("mythweb_auth",self.mythweb_password_combobox1.get_active() > 0) if self.mythweb_password_combobox1.get_active(): if self.mythweb_username.get_text() != self.mythweb_auth['user']: self._markReconfigureRoot("mythweb_user",self.mythweb_username.get_text()) if self.mythweb_password.get_text() != self.mythweb_auth['pass']: self._markReconfigureRoot("mythweb_password",self.mythweb_password.get_text()) def toggle_plugins(self,widget): if widget is not None: if widget.get_name() == 'selectall_plugins_checkbox': toggle=widget.get_active() for list in get_frontend_plugin_dictionary(self), get_backend_plugin_dictionary(self): for item in list: if list[item].flags() & Gtk.SENSITIVE: list[item].set_active(toggle) elif widget.get_name() == "mythweb_checkbox": self.mythweb_password_combobox1.set_sensitive(widget.get_active()) if not widget.get_active(): self.mythweb_password_combobox.set_active(0) elif widget.get_name() == "mythweb_username" or \ widget.get_name() == "mythweb_password": username = self.mythweb_username.get_text().split(' ')[0] password = self.mythweb_password.get_text().split(' ')[0] if self.mythweb_password_combobox.get_active() != 2 or \ (len(username) > 0 and len(password) > 0): self._incomplete=False else: self._incomplete=True elif widget.get_name() == "mythweb_password_combobox1": iteration=1 if self.mythweb_auth['enable']: iteration = 2 if widget.get_active() == iteration: self.password_table.show() self._incomplete=True else: self.mythweb_username.set_text("") self.mythweb_password.set_text("") self.password_table.hide() self._incomplete=False def root_scripted_changes(self,reconfigure): """System-wide changes that need root access to be applied. This function is ran by the dbus backend""" found_cfg = False print(self.CONFIGFILE) if os.path.exists(self.CONFIGFILE): try: self.config.read(self.CONFIGFILE) if not self.config.has_section('cfg'): self.config.add_section("cfg") found_cfg = True except Exception: pass if not found_cfg: self.config.add_section("cfg") self.config.set("cfg", "enable", "false") self.config.set("cfg", "only", "false") self.config.set("cfg", "username", "") self.config.set("cfg", "password", "") for item in reconfigure: if item == "mythweb_auth": if not reconfigure[item]: if os.path.exists('/etc/mythtv/mythweb-digest'): os.remove('/etc/mythtv/mythweb-digest') self.config.set("cfg", "enable", "false") else: self.config.set("cfg", "enable", "true") elif item == "mythweb_user": self.config.set("cfg", "username", reconfigure[item]) elif item == "mythweb_password": self.config.set("cfg", "password", reconfigure[item]) with open(self.CONFIGFILE, 'w') as configfile: self.config.write(configfile) os.system("dpkg-reconfigure -fnoninteractive mythweb") mythbuntu-common/plugins/python/system_roles.py0000664000000000000000000001052412664343134017407 0ustar ## -*- coding: utf-8 -*- # # «roles» - MCC System Role selector plugin # # Copyright (C) 2009, Mario Limonciello, 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 from mythbuntu_common.dictionaries import * class SystemRolesPlugin(MCCPlugin): """A tool for adjusting the role of a system""" def __init__(self): #Initialize parent class information = {} information["name"] = "System Roles" information["icon"] = "gnome-monitor" information["ui"] = "tab_system_roles" MCCPlugin.__init__(self,information) def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" #We can't really represent no backend or no frontend well yet self.no_back=True self.no_front=True #Dictionaries self.dictionary_state={} for list in get_role_dictionary(self), \ get_diskless_dictionary(self), \ get_desktop_dictionary(self): for item in list: self.dictionary_state[list[item]]=self.query_installed(item) if "backend" in item and self.dictionary_state[list[item]]: self.no_back=False elif "frontend" in item and self.dictionary_state[list[item]]: self.no_front=False #corner case if self.dictionary_state[self.primary_backend_radio]: self.dictionary_state[self.secondary_backend_radio]=False def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" #Load the detected dictionary for item in self.dictionary_state: if self.dictionary_state[item]: item.set_active(True) #In case we don't have a front or back role self.no_backend_radio.set_active(self.no_back) self.no_frontend_radio.set_active(self.no_front) def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) #Installable items for list in get_diskless_dictionary(self), \ get_desktop_dictionary(self): for item in list: if list[item].get_active() != self.dictionary_state[list[item]]: if list[item].get_active(): self._markInstall(item) else: self._markRemove(item) #backend unfortunately totally a corner case if self.primary_backend_radio.get_active() != self.dictionary_state[self.primary_backend_radio]: if self.primary_backend_radio.get_active(): self._markInstall('mythtv-backend-master') else: self._markRemove('mythtv-backend-master') if not self.secondary_backend_radio.get_active(): self._markRemove('mythtv-backend') elif self.secondary_backend_radio.get_active() != self.dictionary_state[self.secondary_backend_radio]: if self.secondary_backend_radio.get_active(): self._markInstall('mythtv-backend') else: self._markRemove('mythtv-backend') if self.frontend_radio.get_active() != self.dictionary_state[self.frontend_radio]: if self.frontend_radio.get_active(): self._markInstall('mythtv-frontend') else: self._markRemove('mythtv-frontend') mythbuntu-common/plugins/python/proprietary_codecs.py0000664000000000000000000000646612664343134020571 0ustar ## -*- coding: utf-8 -*- # # «proprietary_codecs» - MCC Proprietary Codecs enablement plugin # # Copyright (C) 2009, Mario Limonciello, 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 subprocess import re import os import logging from mythbuntu_common.dictionaries import * class ProprietaryCodecsPlugin(MCCPlugin): """Proprietary Codec Enablement""" def __init__(self): #Initialize parent class information = {} information["name"] = "Proprietary Codecs" information["icon"] = "gtk-dialog-warning" information["ui"] = "tab_proprietary_codecs" MCCPlugin.__init__(self,information) def captureState(self): """Determines the state of the items on managed by this plugin and stores it into the plugin's own internal structures""" #Dictionaries self.dictionary_state={} list=get_nonfree_dictionary(self) for item in list: self.dictionary_state[list[item]]=self.query_installed(item) def applyStateToGUI(self): """Takes the current state information and sets the GUI for this plugin""" #Load the detected dictionary for item in self.dictionary_state: item.set_active(self.dictionary_state[item]) self.proprietary_codecs.set_sensitive(True) def compareState(self): """Determines what items have been modified on this plugin""" #Prepare for state capturing MCCPlugin.clearParentState(self) #Installable items list=get_nonfree_dictionary(self) for item in list: if list[item].get_active() != self.dictionary_state[list[item]]: if list[item].get_active(): self._markReconfigureRoot("DVD Support",self.enable_libdvdcss2.get_active()) else: self._markRemove(item) def search(self,path, filename): for root, dirs, files in os.walk(path): if filename in files: rootpath = root return rootpath def root_scripted_changes(self,reconfigure): """System-wide changes that need root access to be applied. This function is ran by the dbus backend""" os.environ['PATH']='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' for item in reconfigure: if item == "DVD Support": csspath = self.search("/usr/share/doc/", "install-css.sh") run = subprocess.Popen([csspath+'/install-css.sh']) run.communicate() mythbuntu-common/plugins/ui/0000775000000000000000000000000012700535100013362 5ustar mythbuntu-common/plugins/ui/tab_proprietary_codecs.ui0000664000000000000000000001465512664343134020477 0ustar True False 6 True True 0 <big><b>Proprietary Codec Support</b></big> True True False False 0 True False False False 6 1 True False 10 555 True False 0 <b>NOTE</b>: The packages installable on this page are not officially supported by Mythbuntu or Ubuntu for legal reasons. The Medibuntu team is responsible for them. They are only provided here for convenience to Mythbuntu and Ubuntu users. True True False False 0 True False True False 0 For more information, you can visit the Medibuntu website. False False 0 True False 0 0 0 0 25 False False 1 True False False True False 0 0 0 0 25 Enable DVD Support (libdvdcss2) True True False True 0.5 True False False 0 False False 2 False False 1 False False 6 2 mythbuntu-common/plugins/ui/tab_startup_behavior.ui0000664000000000000000000002033212664343134020145 0ustar [Disabled] True False 6 True True 0 <big><b>Startup Behavior</b></big> True True False False 0 True False False False 6 1 True False 10 555 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 If this box is going to be used like an appliance in Frontend mode, you will likely want the system to automatically login. True False True 0 False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Automatic Login</b> True True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 25 True True 1 False True 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Automatic MythTV Frontend Startup</b> True True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 25 Automatically start MythTV Frontend True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.5 True True True 1 False True 2 False True 6 2 mythbuntu-common/plugins/ui/tab_mysql_configuration.ui0000664000000000000000000006332512664343134020671 0ustar Disable Enable True False 6 True True 0 <big><b>MySQL Configuration</b></big> True True False False 0 True False False False 6 1 True False 10 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 <b>Master Backend Role</b> True False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 110 True False 0 1 Disable Enable False False 0 375 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 MySQL service on ethernet interfaces (required for remote Frontend or Backend) True True False False 32 1 False False 1 True False 0 0 25 True True True True half True False 0.019999999552965164 0 0 True False 2 True False gtk-properties False False 0 True False Optimize Tables True False False 1 False False 2 True False 25 Enable daily MySQL DB Optimize/Repair cron job True True False True 0.5 True False False 3 True False 25 Enable MySQL performance tweaks True True False True 0.5 True True True 4 False False 0 False 10 True False 0 <b>Backend Role</b> True False False 0 True False 0 0 25 True True True True half True False 0.019999999552965164 0 0 True False 2 True False gnome-settings-theme False False 0 True False Launch MythTV Setup True False False 1 False False 1 False False 1 True False 12 True False 0 <b>Remote Connectivity</b> True False False 0 True False 0 In order to connect remotely, your backend must have a 4 digit security key set. You can view this key in mythtv-setup on the backend. True False False 1 True False True False 0 Security Key: False False 0 True True 4 0000 False False 1 False False 2 True False 0 0 Test Connection True True True True half True False False 3 False True False 0 25 25 True False 0 Test Results: False False 0 False gtk-yes False False 1 False gtk-no False False 2 True False 0 True True 3 False False 4 False False 2 False False 6 2 mythbuntu-common/plugins/ui/tab_plugins.ui0000664000000000000000000005755112664343134016262 0ustar True False 6 True True 0 <big><b>Plugins</b></big> True True False False 0 True False False False 6 1 555 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Plugins can be used to futher extend functionality of a Mythbuntu box. True False False 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 Enable/Disable All MythTV Plugins True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 3 MythWeb 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A backend plugins that provides a frontend for scheduling and managing recordings on your MythBox from a web browser located on another machine. A backend plugins that provides a frontend for scheduling and managing recordings on your MythBox from a web browser located on another machine. 0 True 2 3 2 3 GTK_FILL MythWeather 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that downloads and displays weather information. A frontend plugin that downloads and displays weather information. 0 True 2 3 1 2 GTK_FILL MythMusic 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that allows you to play and manage music and audio files A frontend plugin that allows you to play and manage music and audio files 0 True 1 2 1 2 GTK_FILL MythNews 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin which permits the user to follow their favorite news sources, available in RSS (Really Simple Syndication) format. A frontend plugin which permits the user to follow their favorite news sources, available in RSS (Really Simple Syndication) format. 0 True 1 2 3 4 GTK_FILL MythNetvision 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin designed to make adding Internet video sources to MythTV fun and easy. A frontend plugin designed to make adding Internet video sources to MythTV fun and easy. 0 True 1 2 2 3 GTK_FILL MythGame 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that is a starter for games and emulators, so they can be run from within MythTV. A frontend plugin that is a starter for games and emulators, so they can be run from within MythTV. 0 True 3 4 MythGallery 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that allows you to view all your photos as well as short movies from your digital camera. A frontend plugin that allows you to view all your photos as well as short movies from your digital camera. 0 True 2 3 MythBrowser 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that provides a fully functional WebKit-based browser. A frontend plugin that provides a fully functional WebKit-based browser. 0 True 1 2 MythArchive 175 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True A frontend plugin that lets you create DVDs from your recorded shows, MythVideo files and any video files available on your system. A frontend plugin that lets you create DVDs from your recorded shows, MythVideo files and any video files available on your system. 0 True False False 1 True False True False True True 0 True False 25 Password Protect Mythweb True True 1 False False 2 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Username GTK_FILL 25 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Password 1 2 GTK_FILL 25 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 1 2 1 2 GTK_FILL False False 3 False False 15 3 mythbuntu-common/plugins/ui/tab_system_roles.ui0000664000000000000000000006213112664343134017317 0ustar True False 6 True True 0 <big><b>System Roles</b></big> True True False False 0 True False False False 6 1 True False 10 555 True False 0 0 Active Mythbuntu roles may be added, removed, or modified at any time. True False False 0 True False 5 True False 0 <b>Backend Role</b> True False False 0 525 True False 0 A machine containing a this role will schedule and record TV shows. Also, it is needed on a network for a frontend role to connect to. True False False 1 True False True False 25 No Backend 200 True True False True 0.5 True True False False 0 Primary Backend True True False True 0.5 True no_backend_radio False False 1 False False 2 True False True False 25 Secondary Backend True True False True 0.5 True no_backend_radio False False 0 False False 3 False False 1 True False 5 True False 0 <b>Frontend Role</b> True False False 0 525 True False 0 A frontend role will connect to a backend to obtain content. True False False 1 True False True False 25 No Frontend 200 True True False True 0.5 True True False False 0 Desktop Frontend True True False True 0.5 True no_frontend_radio False False 1 False False 2 True False True False 25 Appliance Frontend False True False True 0.5 True no_frontend_radio False False 0 False False 3 False False 2 True False 5 True False 0 <b>Desktop Role</b> True False False 0 525 True False 0 If you would like to use this machine as a desktop, it can be converted at anytime. True False False 1 True False 29 True False 25 Ubuntu Desktop True True False True 0.5 True False False 0 Xubuntu Desktop True True False True 0.5 True False False 1 Kubuntu Desktop True True False True 0.5 True False False 2 False False 2 False False 3 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False 0 <b>Diskless Server</b> True False False 0 525 True False 0 A system role that will allow you to operate additional Frontend clients without installation. True False False 1 True False True False 25 Diskless Server True True False True 0.5 True True True 0 True False 25 Add DHCP server True True False 0.5 True True True 1 False False 2 False False 4 False False 6 2 mythbuntu-common/plugins/ui/tab_remote_control.ui0000664000000000000000000015056012664343134017626 0ustar True 6 3 True 3 True True 0 <big><b>Infrared Remotes and Transmitters</b></big> True True False False 0 True False False 1 False False 0 No Additional Remote Support True True False True True 1 True 0 20 True 0 If you don't have a remote right now, or it's supported natively. 2 Use Android or iOS phone as a remote True True False True True native_support 3 True 0 20 True False True 0 0 Use your phone to scan the appropriate QR code to install the application on the phone. True 0 True 2 2 True /usr/share/mythbuntu/qr/mythmote.png True /usr/share/mythbuntu/qr/mymote.png 1 2 True Android Phones (Mythmote) center 1 2 True iOS Phones (Mymote) center 1 2 1 2 1 4 USB & Serial Remote support via LIRC (Linux Infrared Remote Control) True True False True True native_support 5 True 20 True False True 5 555 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 Choose your remote control from the list of supported remotes below. A standard (but further customizable) configuration will be loaded for you. True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Enable a Remote Control True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Remote: False False 0 400 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK remote_list_store 0 False False 1 False False 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Driver: False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 1 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Module(s): False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 2 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Configuration: False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False Select Remote lircd.conf 30 False False 1 False False 3 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Device: False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 25 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Generate dynamic button mappings False False 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 25 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Generate frontend restart mapping (Power followed by Clear) False False 6 1 1 False False 6 0 True 5 555 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Choose your IR transmitter from the list of supported blasters below. True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Enable an IR Transmitter True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Transmitters: False False 0 400 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK transmitter_list_store 0 False False 1 False False 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Driver: False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 1 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Module(s): False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 2 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Configuration: False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False Select Transmitter lircd.conf 30 False False 1 False False 3 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Device: False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 False False 1 False False 4 1 1 False False 6 1 6 mythbuntu-common/plugins/ui/tab_repos.ui0000664000000000000000000005540712664343134015727 0ustar True False 6 True True 0 0.46000000834465027 <big><b>Repositories</b></big> True True False False 0 True False False False 6 1 True False 10 True False 0 0 0 0 True False 0 0 The MythTV Updates repo will contain updated MythTV software for the version selected below. It is automatically built each day when there are upstream fixes available. False False 0 True False 0 0 0 0 25 Activate MythTV Updates repository True True False 0.5 0 True False False 1 True False 0 0 Select which version of MythTV you want to receive updates for. False False 2 True False 0 0 Please connect to the internet and refresh the repository list! False False 3 True False 0 0 0 0 True False True False 2.2351741291171123e-10 0 0 0 50 25 True False 0 1 False False 0 True False start 0 0 0 0 Refresh available repositories True True True True True 1 False False 4 True False True False True True 0 0 Warning: You have selected the MythTV version currently in development!! If you select this version, it is recommended that you subscribe to the <a href="http://www.mythtv.org/mailman/listinfo/mythtv-dev/">mythtv developer</a> and <a href="http://www.mythtv.org/mailman/listinfo/mythtv-commits/">mythtv commits</a> mailing lists and be prepared for severe breakage. If you wish to continue please enter YouMustBeThisTallToRide below for the development version password. True False True True 0 True False True False True False 0 0 10 True False MythTV Development Version Password False False 0 True False 0 0 True True True False False 1 True False 0 5 gtk-ok True True 2 True False 0 5 gtk-dialog-error True True 3 True True 1 True True 5 True False False False 6 6 True False 0 0 0 0 True False The Mythbuntu Updates repo provides updates for Mythbuntu specific software such as Mythbuntu Bare and Mythbuntu Log Grabber. It does not contain MythTV updates. True True 7 True False 0 0 0 0 25 Activate Mythbuntu Updates repository True True False 0 True True True 8 True False False False 6 9 True False 0 0 0 0 True False The XMLTV Updates repo provides daily builds of XMLTV for schedule data. If you do not know what XMLTV is you probably don't need to enable this. True True 10 True False 0 0 0 0 25 Activate XMLTV Updates repository True True False 0 True True True 11 True False False False 6 12 True False True False 0 0 After hitting apply, to complete the transition to the Updates repositories, please open update-manager (or synaptic) and click Check (or Reload) and then install updates as you normally would. True True 13 False True 6 2 mythbuntu-common/plugins/ui/tab_services.ui0000664000000000000000000007403112664343134016414 0ustar Disable Enable Disable Enable Disable Enable Disable Enable True 6 vertical True True 0 <big><b>Services</b></big> True True False False 0 True False False 6 1 True vertical 5 555 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 These services are typically used by people setting up a Mythbuntu box. Applicable services that are already installed can be reconfigured by selecting <b>Reconfigure</b>. True True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 <b>SSH Service</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 110 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model1 0 False False 0 375 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 SSH is a very commonly used protocol for console based remote administration of a machine. True False False 32 1 False False 1 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 <b>Samba Service</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 110 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model2 False 0 False False 0 375 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Samba provides Windows File Sharing services. These can then be accessed via Windows or any Samba client. True False False 32 1 False False 1 False False 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 <b>NFS Service</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 110 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model3 0 False False 0 375 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 NFS provides filesharing to other Unix & Linux clients. True False False 32 1 False False 1 False False 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 <b>VNC Service</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 0 0 110 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model4 0 False False 0 375 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 VNC is a very commonly used protocol for graphical remote administration and control. True False False 32 1 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 25 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 350 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Enter a password to be used: True True False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Note</b>: Pass must be >= 6 characters. True True False False 1 False False 0 150 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False False 1 True gtk-dialog-error 5 False False 2 False False 2 False False 4 False False 6 2 mythbuntu-common/qr/0000775000000000000000000000000012664343134011723 5ustar mythbuntu-common/qr/mythmote.png0000664000000000000000000000156512664343134014306 0ustar PNG  IHDRddpTsRGBbKGD pHYs  tIME('tEXtCommentCreated with GIMPWIDATx@CaeCA^:8Ϥ8cC׶m۾>.}MƼ,|"&%cx g⨁>uި$dYR]ٔS Y6%{IENDB`mythbuntu-common/qr/mymote.png0000664000000000000000000000107612664343134013747 0ustar PNG  IHDRddJ,sRGBPLTEU~bKGDH pHYs  tIME /3IDAT8ˍ?j0'bՃAWh7k] 6x5*oxUN:WZo0Gu#AV!7U(Ds*[ [az7Ҭl'@#NW}5Q C% ^|S)SN=Vqtn{ϱðb 2̇v*HdP* ܈,:jݽ*:5ce@\b}h:Kb=1JkA ȯg{8yNTq0>g!i۩D1E>V ENc.UX 툦ۊc`GfqYE ~ 0bf M7\hm/ uw 7S L./5$_бMF~ӟ'2UR$IENDB`mythbuntu-common/po/0000775000000000000000000000000012700535100011702 5ustar mythbuntu-common/po/POTFILES.in0000664000000000000000000000103012700535100013451 0ustar ./plugins/ui/tab_plugins.ui ./plugins/ui/tab_mysql_configuration.ui ./plugins/ui/tab_remote_control.ui ./plugins/ui/tab_repos.ui ./plugins/ui/tab_startup_behavior.ui ./plugins/ui/tab_services.ui ./plugins/ui/tab_proprietary_codecs.ui ./plugins/ui/tab_system_roles.ui ./plugins/python/mythbuntu_repos.py ./plugins/python/services.py ./plugins/python/plugins.py ./plugins/python/mysql_configuration.py ./plugins/python/system_roles.py ./plugins/python/startup_behavior.py ./plugins/python/remote.py ./plugins/python/proprietary_codecs.py