diff options
author | James Meyer <james.meyer@operamail.com> | 2010-10-23 18:17:40 (GMT) |
---|---|---|
committer | James Meyer <james.meyer@operamail.com> | 2010-10-23 18:19:39 (GMT) |
commit | adbcf19958300e9b6598990184c8815b945ba0ee (patch) | |
tree | f4283c850ac0ac202c17e78a637ee7ca8147621b /abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl | |
parent | 61a68250df10d29b624650948484898334ff22d0 (diff) | |
download | linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.zip linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.tar.gz linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.tar.bz2 |
Removed old core and extra from repo. Renamed -testing to core/extra. This will setup the base for the testing branch.
Diffstat (limited to 'abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl')
-rwxr-xr-x | abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl b/abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl deleted file mode 100755 index c258e1d..0000000 --- a/abs/mv-core/myth/stable/mythtv-release-fixes/myth.find_orphans.pl +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/perl - -# check for recording anomolies - -# based somewhat on greg froese's "myth.rebuilddatabase.pl" -# -- Lincoln Dale <ltd@interlink.com.au>, September 2006 -# 2007-03-11: Added pretty print of unknown files vs. orphaned thumbnails. (Robert Kulagowski) - -# The intent of this script is to be able to find orphaned rows in the 'recorded' table -# (entries which don't have matching media files) and orphaned media files (potentially -# taking up gigabytes of otherwise usable disk space) which have no matching row in -# the 'recorded' db table. -# -# By default, running the script will simply return a list of problems it finds. -# Running with --dodbdelete will remove db recorded rows for which there is no matching -# media file. Running with --dodelete will delete media files for which there is no -# matching db record. -# -# This script may be useful to fix up some orphaned db entries (causes mythweb to run -# verrry slow) as well as reclaim some disk space from some orphaned media files. -# (in an ideal world, neither of these would ever happen, but i've seen both happen in reality). -# This script makes it easy to keep track of whether it has or hasn't happened, even if you -# have thousands of recordings and terabytes of stored media. -# -# no warranties expressed or implied. if you run this and it deletes all your recordings -# and sets mythtv to fill up all your disk space with The Home Shopping Network, its entirely -# your fault. - -my $progname = "myth.find_orphans.pl"; -my $revision = "0.20"; - -use DBI; -use Sys::Hostname; -use Getopt::Long; - -# -# options -# - -my $opt_host = hostname; -my $opt_dbhost = "localhost"; -my $opt_database = "mythconverg"; -my $opt_user = "mythtv"; -my $opt_pass = "mythtv"; -my $opt_ext = "{nuv,mpg,mpeg,avi}"; -my $opt_dir = ""; -my $opt_dodelete = 0; -my $opt_dodbdelete = 0; -my $debug = 0; -my $opt_help = 0; - -GetOptions( - 'host=s' => \$opt_host, - 'dbhost=s' => \$opt_dbhost, - 'database=s' => \$opt_database, - 'user=s' => \$opt_user, - 'pass=s' => \$opt_pass, - 'dir=s' => \$opt_dir, - 'dodelete' => \$opt_dodelete, - 'dodbdelete' => \$opt_dodbdelete, - 'debug+' => \$debug, - 'help' => \$opt_help, - 'h' => \$opt_help, - 'v' => \$opt_help); - -if ($opt_help) { - print<<EOF -$progname (rev $revision) -(checks MythTV recording directories for orphaned files) - -options: - --host=(host) MythTV backend host ($opt_host) - --dbhost=(host) host where MySQL database for backend is ($opt_dbhost) - --database=(dbname) MythTV database ($opt_database) - --user=(user) MySQL MythTV database user ($opt_user) - --pass=(pass) MySQL MythTV database password ($opt_pass) - --dir=directories manually specify recording directories (otherwise setting is from database) - --debug increase debug level - --dodbdelete remove recorded db entries with no matching file (default: don't) - --dodelete delete files with no record (default: don't) - -EOF -; - exit(0); -} - -# -# go go go! -# - -my $valid_recordings = 0; -my $missing_recordings = 0; -my $errors = 0; -my $unknown_files = 0; -my $known_files = 0; -my $unknown_size = 0; -my $known_size = 0; -my $unknown_thumbnail = 0; - -if (!($dbh = DBI->connect("dbi:mysql:database=$opt_database:host=$opt_dbhost","$opt_user","$opt_pass"))) { - die "Cannot connect to database $opt_database on host $opt_dbhost: $!\n"; -} - -if ($opt_dir eq "") { - &dir_lookup("SELECT dirname FROM storagegroup WHERE hostname=(?)"); - &dir_lookup("SELECT data FROM settings WHERE value='RecordFilePrefix' AND hostname=(?)"); - - printf STDERR "Recording directories ($opt_host): $opt_dir\n" if $debug; -} - -if ($opt_dir eq "") { - printf "ERROR: no directory found or specified\n"; - exit 1; -} - -foreach $d (split(/,/,$opt_dir)) { - $d =~ s/\/$//g; # strip trailing / - $dirs{$d}++; -} - - -# -# look in recorded table, make sure we can find every file .. -# - -my $q = "SELECT title, subtitle, starttime, endtime, chanid, basename FROM recorded WHERE hostname=(?) ORDER BY starttime"; -$sth = $dbh->prepare($q); -$sth->execute($opt_host) || die "Could not execute ($q): $!\n"; - -while (my @row=$sth->fetchrow_array) { - ($title, $subtitle, $starttime, $endtime, $channel, $basename) = @row; - - # see if we can find it... - $loc = find_file($basename); - if ($loc eq "") { - printf "Missing media: %s (title:%s, start:%s)\n",$basename,$title,$starttime; - $missing_recordings++; - - if ($opt_dodbdelete) { - my $sql = sprintf "DELETE FROM recorded WHERE basename LIKE \"%s\" LIMIT 1",$basename; - printf "performing database delete: %s\n",$sql; - $dbh->do($sql) || die "Could not execute $sql: $!\n"; - } - } else { - $valid_recordings++; - $seen_basename{$basename}++; - $seen_basename{$basename.".png"}++; # thumbnail - } -} - -# -# look in recording directories, see if there are extra files not in database -# - -foreach my $this_dir (keys %dirs) { - opendir(DIR, $this_dir) || die "cannot open directory $this_dir: $!\n"; - foreach $this_file (readdir(DIR)) { - if (-f "$this_dir/$this_file") { - - next if ($this_file eq "nfslockfile.lock"); - next if ($this_file =~ m/^mythconv.*/); - next if ($this_dir eq "/data/database_backup"); - - my $this_filesize = -s "$this_dir/$this_file"; - if ($seen_basename{$this_file} == 0) { - $sorted_filesizes{$this_filesize} .= sprintf "unknown file [%s]: %s/%s\n",pretty_filesize($this_filesize),$this_dir,$this_file; - $unknown_size += $this_filesize; - if (substr($this_file,-4) eq ".png") { - $unknown_thumbnail++; - } - else { - $unknown_files++; - } - - if ($opt_dodelete) { - printf STDERR "deleting [%s]: %s/%s\n",pretty_filesize($this_filesize),$this_dir,$this_file; - unlink "$this_dir/$this_file"; - - if (-f "$this_dir/$this_file") { - $errors++; - printf "ERROR: could not delete $this_dir/$this_file\n"; - } - } - } else { - $known_files++; - $known_size += $this_filesize; - printf "KNOWN file [%s]: %s/%s\n",pretty_filesize($this_filesize),$this_dir,$this_file if $debug; - } - } else { - printf "NOT A FILE: %s/%s\n",$this_dir,$this_file if $debug; - } - } - closedir DIR; -} - - -# -# finished, report results -# - -foreach my $key (sort { $a <=> $b } keys %sorted_filesizes) { - printf $sorted_filesizes{$key}; -} - -printf "Summary:\n"; -printf " Host: %s, Directories: %s\n", $opt_host, join(" ",keys %dirs); -printf " %d ERRORS ENCOUNTERED (see above for details)\n",$errors if ($errors > 0); -printf " %d valid recording%s, %d missing recording%s %s\n", - $valid_recordings, ($valid_recordings != 1 ? "s" : ""), - $missing_recordings, ($missing_recordings != 1 ? "s" : ""), - ($missing_recordings > 0 ? ($opt_dodbdelete ? "were fixed" : "not fixed, check above is valid and use --dodbdelete to fix") : ""); -printf " %d known media files using %s\n %d orphaned thumbnails with no corresponding recording\n %d unknown files using %s %s\n", - $known_files, pretty_filesize($known_size), - $unknown_thumbnail,$unknown_files, pretty_filesize($unknown_size), - ($unknown_files > 0 ? ($opt_dodelete ? "were fixed" : "not fixed, check above and use --dodelete to clean up if the above output is accurate") : ""); - -exit(0); - -########################################################################### -# filesize bling - -sub pretty_filesize -{ - local($fsize) = @_; - return sprintf "%0.1fGB",($fsize / 1000000000) if ($fsize >= 1000000000); - return sprintf "%0.1fMB",($fsize / 1000000) if ($fsize >= 1000000); - return sprintf "%0.1fKB",($fsize / 1000) if ($fsize >= 1000); - return sprintf "%0.0fB",$fsize; -} - -########################################################################### -# find a file in directories without globbing - -sub find_file -{ - local($fname) = @_; - - foreach my $d (keys %dirs) { - my $f = $d."/".$fname; - if (-e $f) { - return $f; - } - } - return; -} - -########################################################################### - -sub dir_lookup -{ - my $query = shift; - - $sth = $dbh->prepare($query); - $sth->execute($opt_host) || die "Could not execute ($dir_query)"; - while (my @row = $sth->fetchrow_array) { - $opt_dir .= "," if ($opt_dir ne ""); - $opt_dir .= $row[0]; - } -} - -########################################################################### |