summaryrefslogtreecommitdiffstats
path: root/abs/core/tweaker/bin/twk_upgrade.pl
blob: b5d09b61c95067aa36e6ab6f938b7145af414454 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/perl -w

# Copyright 2007-2009 Robert ("Bob") Igo of StormLogic, LLC and mythic.tv.
#
# 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 <http://www.gnu.org/licenses/>.

#
# NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE 
#
# Tweaker 0.7 is not interactive, so these post-upgrade changes are a stopgap
# measure to make sure people upgrading from R5F27 get sensible settings
# for things that MythTV 0.21 doesn't know how to handle properly.  This file
# should shrink or disappear entirely once Tweaker becomes interactive.
#
# NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE 
#

use Switch;
use Tweaker::Script;
package Tweaker::Script;

set_known_options( 'all' );

# Try to implement the given option.
sub implement_option {
    my($option) = @_;

    $dbconnectionstring = get_mythtv_connection_string();
	
    if (connect_to_db("DBI:mysql:$dbconnectionstring")) {
	# use poll results from twk_cpu.pl to set playback decoder options
	my @levels = ("low", "medium", "high");
	foreach my $level (@levels) {
	    my @results = split(/\|/, execute_shell_command("twk_cpu.pl --poll $level"));
	    foreach my $result (@results) {
		if ($result eq "recommended") {
		    if ("$level" eq "low") {
			change_or_make_setting('DefaultVideoPlaybackProfile', 'CPU--') || exit -1; # best playback defaults for weak hardware
		    } elsif ("$level" eq "medium") {
			change_or_make_setting('DefaultVideoPlaybackProfile', 'CPU+') || exit -1; # best playback defaults for average hardware
		    } elsif ("$level" eq "high") {
			change_or_make_setting('DefaultVideoPlaybackProfile', 'CPU++') || exit -1; # best playback defaults for powerful hardware
		    }
		}
	    }
	}

	# Update visualization modes for 0.21
	change_or_make_setting('VisualMode','BumpScope;Gears;Goom;MonoScope;Squares;StereoScope;Synaesthesia;LibVisual-bumpscope;LibVisual-corona;LibVisual-infinite;LibVisual-jakdaw;LibVisual-jess;AlbumArt');

	# Remove possibly obsolete and conflicting theme cache entries.
	execute_shell_command("/bin/rm -rf /home/mythtv/.mythtv/themecache/");

	# Fix bizarre ownership of files:
	execute_shell_command("chown -f root: /usr/bin/get_dual.sh");
	execute_shell_command("chown -fR root: /usr/lib/krp");
	execute_shell_command("chown -fR root: /usr/local/bin");
	execute_shell_command("chown -f root: /usr/share/man/man1/tv_grab_au.1.gz");
	execute_shell_command("chown -f root: /usr/share/xmltv/tv_grab_au/channel_ids");
	execute_shell_command("chown -fR root:src /usr/src/");

	# Fix video problems for some nVidia users
	execute_shell_command("grep nvidia /etc/X11/xorg.conf && sed -i -e 's/^[ \t]*Option.*\"XvmcUsesTextures\".*/#REMOVEME/g' -e 's/^[ \t]*Option.*\"UseEvents\".*/#REMOVEME/g' /etc/X11/xorg.conf"); # clear out old entries, if present
	execute_shell_command("grep nvidia /etc/X11/xorg.conf && sed -i -n '1h;2,\$H;\${g;s/#REMOVEME\\n//g;p}' /etc/X11/xorg.conf"); # clear out old entries, if present
	execute_shell_command("grep nvidia /etc/X11/xorg.conf && sed -i 's/\\(^[ \t]*Driver.*\"nvidia\".*\\)/\\1\\n\tOption \"XvmcUsesTextures\" \"false\"\\n\tOption \"UseEvents\" \"true\"/g' /etc/X11/xorg.conf");
	execute_shell_command("if [ -e /home/mythtv/.nvidia-settings-rc ] ; then sed -i -e \"s'.*XVideoTextureSyncToVBlank.*'#REMOVEME'g\" -e \"s'.*XVideoBlitterSyncToVBlank.*'#REMOVEME'g\" /home/mythtv/.nvidia-settings-rc; fi");
	execute_shell_command("grep nvidia /etc/X11/xorg.conf && echo 0/XVideoTextureSyncToVBlank=0 >> /home/mythtv/.nvidia-settings-rc && echo 0/XVideoBlitterSyncToVBlank=0 >> /home/mythtv/.nvidia-settings-rc && sed -i -n '1h;2,\$H;\${g;s/#REMOVEME\\n//g;p}' /home/mythtv/.nvidia-settings-rc");


	# Enable any digital audio out device we can.
	my $command = "amixer scontrols | grep IEC958";
	my @results = split('\n', execute_shell_command($command));
	foreach my $line (@results) {
	    if ($line =~ /Simple mixer control (.*),.*/i) {
		$command = "su - mythtv -c \"amixer set $1 on\""; # Tries to set all IEC958 devices to 'on'
		# but some are just placeholders and can't be turned 'on', therefore don't error out if we fail
		execute_shell_command($command);
	    }
	}
	execute_shell_command("alsactl store"); # persist the above change(s)

	# The Chaintech AV-710 was generally configured for digital audio in R5F27 in a way that worked
	# great there but which is failing utterly in R5.5.  Try to detect this old configuration, and if
	# it's present, implement the new settings which seem to work for all digital audio devices.
	# This may only match 80% of the AV-710 users, but the rest of them can just run the necessary
	# tweaker command by hand to get the same result.
	if (execute_shell_command('lspci -mn | grep -e ".*0401.*1412.*1724.*1412.*1724"')) {
	    # found an AV-710, now see if it's configured for digital audio
	    if (do_query("SELECT * FROM settings WHERE value='AudioOutputDevice' AND data='/dev/adsp'")) {
		# The user was using this AV-710's spdif output, so give them the new good digital configuration
		execute_shell_command("twk_audio.pl --implement digital");
	    }
	}
	change_or_make_setting('MixerDevice', 'ALSA:default') || exit -1;

	# Undo obsolete mplayer workaround for aspect ratio
	execute_shell_command("sed -i 's/.*monitoraspect.*//g' /home/mythtv/.mplayer/config");
	
	my $hostname = execute_shell_command("hostname") || "localhost";
	# one table at a time, replace hostname with our actual hostname
	# ??? can this be done all at once in MySQL?
	foreach my $table ("capturecard", "inuseprograms", "jobqueue", "jumppoints", "keybindings", "music_playlists",
			   "musicplaylist", "recorded", "settings", "weatherscreens") {
	    do_query("UPDATE $table SET hostname='$hostname'");
	}
	
	# Some entries in 'settings' should stay NULL:  http://www.mythtv.org/wiki/index.php/Settings_table
	# There are fewer entries that stay NULL than there are that should have the hostname set, so while
	# it duplicates some effort to change them from NULL to the hostname and them back to NULL, it's
	# easier to maintain and more future-proof.
	foreach my $entry ("mythfilldatabaseLastRunStart", "mythfilldatabaseLastRunEnd", "mythfilldatabaseLastRunStatus",
			   "DataDirectMessage", "HaveRepeats", "DBSchemaVer", "DefaultTranscoder", "MythFillSuggestedRunTime",
			   "MythFillGrabberSuggestsTime", "MasterServerIP", "MasterServerPort", "TVFormat", "VbiFormat", "FreqTable",
			   "TimeOffset", "MasterBackendOverride", "DeletesFollowLinks", "HDRingbufferSize", "EITTransportTimeout",
			   "EITIgnoresSource", "EITCrawIdleStart", "startupCommand", "blockSDWUwithoutClient", "idleWaitForRecordingTime",
			   "StartupSecsBeforeRecording", "WakeupTimeFormat", "SetWakeuptimeCommand", "ServerHaltCommand", "preSDWUCheckCommand",
			   "WOLbackendConnectRetry", "WOLbackendCommand", "WOLslaveBackendsCommand", "JobsRunOnRecordHost",
			   "AutoCommflagWhileRecording", "JobQueueCommFlagCommand", "JobQueueTranscodeCommand",
			   "AutoTranscodeBeforeAutoCommflag", "SaveTranscoding", "UserJobDesc1", "UserJob1", "UserJobDesc2", "UserJob2",
			   "UserJobDesc3", "UserJob3", "UserJobDesc4", "UserJob4", "PreviewPixmapOffset", "AllRecGroupPassword",
			   "MaximumCommercialSkip", "CommSkipAllBlanks", "LastFreeCard", "LiveTVPriority", "AutoExpireMethod",
			   "AutoExpireDefault", "RerecordWatched", "AutoExpireWatchedPriority", "AutoExpireLiveTVMaxAge",
			   "AutoExpireDayPriority", "AutoExpireExtraSpace", "AutoExpireInsteadOfDelete", "DeletedFifoOrder",
			   "CommercialSkipMethod", "AggressiveCommDetect", "AutoCommercialFlag", "AutoTranscode", "AutoRunUserJob1",
			   "AutoRunUserJob2", "AutoRunUserJob3", "AutoRunUserJob4", "OverTimeCategory", "CategoryOverTime",
			   "EPGEnableJumpToChannel", "LogEnabled", "MythFillEnabled", "MythFillDatabasePath", "MythFillDatabaseArgs",
			   "MythFillDatabaseLog", "MythFillPeriod", "MythFillMinHour", "MythFillMaxHour", "SchedMoveHigher", "SchedOpenEnd",
			   "ComplexPriority", "PrefInputPriority", "SingleRecordRecPriority", "FindOneRecordRecPriority", "ArchiveDBSchemaVer",
			   "FlixDBSchemaVer", "GalleryDBSchemaVer", "GameDBSchemaVer", "MusicDBSchemaVer", "PhoneDBSchemaVer",
			   "mythvideo.DBSchemaVer", "WeatherDBSchemaVer") {
	    do_query("UPDATE settings SET hostname=NULL WHERE value='$entry'");
	}

	change_or_make_setting('MythFillDatabaseLog', '/var/log/mythtv/mythfilldatabase.log');
	change_or_make_setting('MasterBackendOverride','1'); # I don't remember why, but making the hostname NULL is important here
	do_query("UPDATE settings SET hostname=NULL WHERE value='MasterBackendOverride'");

	disconnect_from_db();

	# Fix hostname for iPod feed URLs
	$command = "sed -i \"s/hostname\\//$hostname\\//g\" /usr/local/bin/myth2ipod";
	execute_shell_command($command);
	
	# Fix hostname for XViD feed URLs
	$command = "sed -i \"s/192.168.0.222\\//$hostname\\//g\" /usr/local/bin/myt2xvid3";
	execute_shell_command($command);

	# Customize default MythTV library.xml to reflect KnoppMyth's wider selection of
	# online stream options.
	#$command = "sed -i \"/<type>STREAM<\\/type>\$/{N; N; N; N; s/text>.*<\\/text/text>Online Streams<\\/text/; s/action>.*<\\/action/action>MENU is.xml<\\/action/; s/<depends.*depends>//; }\" /usr/share/mythtv/library.xml";
	$command = "/bin/cp /usr/share/mythtv/library.xml.km /usr/share/mythtv/library.xml";
	execute_shell_command($command);
	
    } else {
	my $logger = get_logger('tweaker.script');
	$logger->error("ERROR: Unable to connect to mythconverg database");
	$logger->error("ERROR: Unable to implement option $option.");
	exit -1;
    }
    disconnect_from_db();
}

# Try to get a Recommendation Level for $option.
sub poll_options {
    my($option) = @_;
    recommendation_level("recommended", "These tweaks benefit all users.");
}

# Unimplemented in 0.7
sub check_option {
    help;
}

# Unimplemented in 0.7
sub count_iterations {
    help;
}

process_parameters;