#!/usr/bin/perl

#    AlterEgo - Dynamic System Configuration Engine.
#    Copyright (C) 2010-2011, Andrew Wyatt, FEWT Software
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

### Note: Execute from .desktop with args: gnome-terminal --full-screen --hide-menubar --zoom=1.5 --disable-factory --title="Customize your Installation" -e alterego

$config{'modpath'}="/usr/lib/alterego";
### System Information
$sysinfo{'servername'}="Welcome to Fuduntu";
$sysinfo{'description'}="Customize your Installation";
$sysinfo{'copyright'}="(C) 2010-2011 Andrew Wyatt (FEWT)";
chomp ($sysinfo{'host'}=`hostname`);
###

$|=1;

chomp($os=`uname`);
$BSD_STYLE=1;


require ($config{'modpath'}."/framework.pl");

chomp ($mytty=`tty`);

main: {
  $SIG{KILL}=sub {errorout ("SIGKILL..");};
  $SIG{HUP}=sub {errorout ("SIGHUP..");};
  $SIG{TERM}=sub {errorout ("SIGTERM..");};
  $SIG{QUIT}=sub {errorout ("SIGQUIT..");};
  $debug=1;

  $info{'ansi'}=1;
  colorize();

  unless ($ENV{'USER'} =~/root/) {
    writeline($RED."Error: Must be run as root [".$WHT.$ENV{'USER'}.$RED."]".$RST,1);
    exit 0;
  }

  writeline("\n\n\nPlease wait, loading package database into memory......");
  @packagedb=`rpm -qa | sed \"s#-[0-9].*\\\$##\" | sort`;

  ### Optimization
  if ( -e "/proc/acpi/battery/BAT0/info" ) {
    $config{'optimization'}=0;
  } else {
    $config{'optimization'}=1;
  }

  ### Video Card Autodetect
  $config{'detectedvdriver'} = sysexec("lspci | grep VGA | grep -vi Intel | sed \"s#^[0-9].*: ##\" | awk '{print \$1}'");
  $config{'vdriver'}=2;

  ### System Architecture
  $config{'arch'} = sysexec("uname -m");

  ### Package Sets
  ### Format:  Display name | RPM names each separated by a space
  %data = (
	vdriver =>
	[ "nVidia|akmod-nvidia ",
	  "Ati Catalyst|akmod-catalyst ",
	  "Use the OSS driver|" ],

	winauth =>
	[ "No",
	  "Yes|likewise-mod-auth-kerb likewise-krb5 likewise-pstore likewise-rpc likewise-sqlite likewise-lwreg likewise-eventlog likewise-lwio likewise-lsass likewise-lwconfig likewise-lwnetapi likewise-reskit likewise-libxml2 likewise-openldap likewise-base likewise-lwtools likewise-domainjoin-gui likewise-passwd likewise-lwupgrade likewise-domainjoin fuduntu-likewise likewise-srvsvc likewise-netlogon samba-common samba-client ", ],

	winsoft =>
	[ "No",
	  "Yes|wine-desktop wine-core " ],

	optimization =>
	[ "Laptop / Netbook|jupiter jupiter-support-eee ",
	  "Desktop|" ],

	browsers =>
	[ "Chromium|chromium-browser-stable ",
	  "Firefox|firefox ",
	  "Midori|midori ",
	  "None|" ],

  	email =>
	[ "Google Mail|fuduntu-gmail ",
	  "Thunderbird|thunderbird thunderbird-lightning ",
	  "Yahoo Mail|fuduntu-yahoo ",
	  "Hotmail|fuduntu-hotmail ",
	  "Evolution|evolution ",
	  "None|" ],

  	im =>
	[ "Empathy|empathy ",
	  "Pidgin|pidgin ",
	  "None|" ],

  	office =>
	[ "Google Docs|fuduntu-google-docs ",
	  "GNOME Office|gnumeric abiword inkscape ease ",
	  "OpenOffice.org|openoffice.org-calc openoffice.org-writer openoffice.org-draw openoffice.org-impress ",
	  "None|" ],

  	music =>
	[ "Banshee|banshee ",
	  "Rhythmbox|rhythmbox ",
	  "None|" ],

  	video =>
	[ "VLC|vlc mozilla-vlc ",
	  "SMPlayer|smplayer ",
	  "Totem|totem totem-nautilus totem-mozplugin ",
	  "None|" ]);

  ### Defaults
  if (-e "/etc/default/alterego") {
    open(in,"</etc/default/alterego");
    while (<in>) {
      $line=$_;
      chomp $line;
      ($key,$value)=split(/\=/,$line);
      $value=~s/^\"//;
      $value=~s/\".*$//;
      $config{$key}=$value;
    }
    close(in);
  } else {
    $config{'browsers'}=0;
    $config{'email'}=0;
    $config{'im'}=0;
    $config{'office'}=0;
    $config{'music'}=0;
    $config{'video'}=0;
    $config{'winauth'}=0;
    $config{'winsoft'}=0;
  }
  ### Examine computer to determine existing configuration here...

  sub applychanges {
    writeline("",1);

    ($optname,$optselection)=split(/\|/,$data{'optimization'}[$config{'optimization'}]);
    $data{'optimization'}[$config{'optimization'}]="";
    ($vdname,$vdselection)=split(/\|/,$data{'vdriver'}[$config{'vdriver'}]);
    $data{'vdriver'}[$config{'vdriver'}]="";
    ($brwname,$brwselection)=split(/\|/,$data{'browsers'}[$config{'browsers'}]);
    $data{'browsers'}[$config{'browsers'}]="";
    ($emname,$emselection)=split(/\|/,$data{'email'}[$config{'email'}]);
    $data{'email'}[$config{'email'}]="";
    ($imname,$imselection)=split(/\|/,$data{'im'}[$config{'im'}]);
    $data{'im'}[$config{'im'}]="";
    ($offname,$offselection)=split(/\|/,$data{'office'}[$config{'office'}]);
    $data{'office'}[$config{'office'}]="";
    ($muname,$muselection)=split(/\|/,$data{'music'}[$config{'music'}]);
    $data{'music'}[$config{'music'}]="";
    ($viname,$viselection)=split(/\|/,$data{'video'}[$config{'video'}]);
    $data{'video'}[$config{'video'}]="";
    ($winaname,$winaselection)=split(/\|/,$data{'winauth'}[$config{'winauth'}]);
    $data{'winauth'}[$config{'winauth'}]="";
    ($winsname,$winsselection)=split(/\|/,$data{'winsoft'}[$config{'winsoft'}]);
    $data{'winsoft'}[$config{'winsoft'}]="";

    for $key (keys %data) {
       foreach $part(@{$data{$key}}) {
         ($junk,$package)=split(/\|/,$part);
         $removelist=$removelist.$package;
        }
    }

    foreach $package (@packagedb) {
      chomp $package;
      if ($removelist =~/$package/i) {
        next;
      }
      $removelist =~s/$package\ //i;
    }

    chomp $removelist;

    if ($removelist) {
      writeline($WHT."\nFound packages that can be cleaned up....",1);
      writeline($LGN."Would you like to remove software not selected? [".$LTB."y".$LGN."/".$LTB."N".$LGN."]: ");
      $key="";
      cbreak(on);
      $key=waitkey();
      cbreak(off);
      if ($key =~/^[Yy]/) {
        writeline ($WHT."\nPlease wait, removing software .... ");
        $REMOVAL=`yum -y erase $removelist 2>&1 | tee /var/log/removed_software.log`;
        writeline ($WHT."\nA list of removed packages can be found at ".$LTB."/var/log/removed_software.log",1);
      }
      writeline("",1);
      $key="";
    }

    ### Gather uninstall list, parse out packages that are already installed..
    foreach $package (@packagedb) {
      chomp $package;
      if ($optselection =~/$package/i) {
        $optselection =~s/$package\ //i;
      }
      if ($vdselection =~/$package/i) {
        $vdselection =~s/$package\ //i;
      }
      if ($brwselection =~/$package/i) {
        $brwselection =~s/$package\ //i;
      }
      if ($emselection =~/$package/i) {
        $emselection =~s/$package\ //i;
      }
      if ($imselection =~/$package/i) {
        $imselection =~s/$package\ //i;
      }
      if ($offselection =~/$package/i) {
        $offselection =~s/$package\ //i;
      }
      if ($muselection =~/$package/i) {
        $muselection =~s/$package\ //i;
      }
      if ($viselection =~/$package/i) {
        $viselection =~s/$package\ //i;
      }
      if ($winaselection =~/$package/i) {
        $winaselection =~s/$package\ //i;
      }
      if ($winsselection =~/$package/i) {
        $winsselection =~s/$package\ //i;
      }
    }

    ### Installer
    $packagelist=$optselection.$vdselection.$brwselection.$emselection.$imselection.$offselection.$muselection.$viselection.$winaselection.$winsselection;
    if ( $packagelist ) {
      open (out,">/etc/default/alterego");
      for $key (keys %data) {
         print out "$key=$config{$key}\n";
      }
      close (out);

      writeline ($WHT."\nPlease wait, installing software .... ");
      $INSTALL=`yum -y install $packagelist 2>&1 | tee /var/log/installed_software.log`;
      writeline ($WHT."\nA list of packages installed can be found at ".$LTB."/var/log/installed_software.log",1);
    }

    if ($config{'vdriver'} ne "2") {
      writeline($LGN."Your computer must be restarted to enable the $disp{'vdriver'} driver, restart now? [".$LTB."y".$LGN."/".$LTB."N".$LGN."]: ");
      $key="";
      cbreak(on);
      $key=waitkey();
      cbreak(off);
      if ($key =~/^[Yy]/) {
        system("/sbin/shutdown -r now");
      }
      writeline("",1);
      $key="";
    } else {
      writeline($LGN."Please log out and back inwhen possible.  Press any key to exit.");
      $key="";
      cbreak(on);
      $key=waitkey();
      cbreak(off);
      writeline("",1);
      $key="";
    }
    exit 0;
  }

  ### Main Menu
  for (;;) {
    print "\e[2J\e[0;0H";
    writeline ("",1);
    writeline ($WHT.$sysinfo{'servername'}." - ".$sysinfo{'description'},1);
    writeline ($sysinfo{'copyright'},1);
    writeline ("",1);
    writeline ($LGN."Computer:",1);

    ($disp{'optimization'},$jnk)=split(/\|/,$data{'optimization'}[$config{'optimization'}]);
    writeline ($LTB."A. ".$YLW."Preferred Optimization: ".$WHT.$disp{'optimization'},1);
    if ( $config{'detectedvdriver'} =~/nVidia/i || $config{'detectedvdriver'} =~/Ati/i ) {
      ($disp{'vdriver'},$driver)=split(/\|/,$data{'vdriver'}[$config{'vdriver'}]);
      writeline ($LTB."B. ".$YLW."Install Proprietary Video Driver for [".$LTB.$config{'detectedvdriver'}.$YLW."]: ".$WHT.$disp{'vdriver'},1);
    }
    writeline ("",1);
    writeline ($LGN."Base Packages:",1);
##
    ($disp{'browsers'},$jnk)=split(/\|/,$data{'browsers'}[$config{'browsers'}]);
    if ($config{'email'} eq "0" || $config{'email'} eq "2" || $config{'email'} eq "3" || $config{'office'} eq "0") {
      $config{'browsers'}=0;
      ($disp{'browsers'},$jnk)=split(/\|/,$data{'browsers'}[$config{'browsers'}]);
      $disp{'browsers'}=$disp{'browsers'}." [".$RED."DEPENDENCY".$WHT."]";
    }
    writeline ($LTB."C. ".$YLW."Web Browser: ".$WHT.$disp{'browsers'},1);

    ($disp{'email'},$jnk)=split(/\|/,$data{'email'}[$config{'email'}]);
    writeline ($LTB."D. ".$YLW."Email: ".$WHT.$disp{'email'},1);

    ($disp{'im'},$jnk)=split(/\|/,$data{'im'}[$config{'im'}]);
    writeline ($LTB."E. ".$YLW."Instant Messenger: ".$WHT.$disp{'im'},1);

    ($disp{'office'},$jnk)=split(/\|/,$data{'office'}[$config{'office'}]);
    writeline ($LTB."F. ".$YLW."Office Suite: ".$WHT.$disp{'office'},1);

    ($disp{'music'},$jnk)=split(/\|/,$data{'music'}[$config{'music'}]);
    writeline ($LTB."G. ".$YLW."Music Player: ".$WHT.$disp{'music'},1);

    ($disp{'video'},$jnk)=split(/\|/,$data{'video'}[$config{'video'}]);
    writeline ($LTB."H. ".$YLW."Video Player: ".$WHT.$disp{'video'},1);

    writeline ("",1);
    writeline ($LGN."Microsoft Windows Compatibility:",1);

    ($disp{'winauth'},$jnk)=split(/\|/,$data{'winauth'}[$config{'winauth'}]);
    writeline ($LTB."I. ".$YLW."Communicates with Windows Computers on a network: ".$WHT.$disp{'winauth'},1);

    ($disp{'winsoft'},$jnk)=split(/\|/,$data{'winsoft'}[$config{'winsoft'}]);
    writeline ($LTB."J. ".$YLW."Windows Software Compatibility: ".$WHT.$disp{'winsoft'},1);
    writeline ("",1);
    writeline ($LGN."Enter Option \"".$LTB."A-Z".$LGN."\" to change configuration, \"".$LTB."/".$LGN."\" to apply, or \"".$LTB."Q".$LGN."\" to quit: ");

    $key="";
    cbreak(on);
    $key=waitkey();
    cbreak(off);

    writeline("",1); 

    if ($key =~/^[Qq]/) {
      writeline("$RST");
      exit 0;
    }

    if ($key =~/^[Aa]/) {

      if ( $config{'optimization'} eq 0 ) {
        $config{'optimization'}=1;
      } else {
        $config{'optimization'}=0;
      }
    }

    if ($key =~/^[Bb]/) {
      $index=scalar(@{$data{'vdriver'}});
      ++$config{'vdriver'};
      if ( $config{'vdriver'} ge $index ) {
        $config{'vdriver'}=0;
      }
    }

    if ($key =~/^[Cc]/) {
      $index=scalar(@{$data{'browsers'}});
      ++$config{'browsers'};
      if ( $config{'browsers'} ge $index ) {
        $config{'browsers'}=0;
      }
    }

    if ($key =~/^[Dd]/) {
      $index=scalar(@{$data{'email'}});
      ++$config{'email'};
      if ( $config{'email'} ge $index ) {
        $config{'email'}=0;
      }
    }

    if ($key =~/^[Ee]/) {
      $index=scalar(@{$data{'im'}});
      ++$config{'im'};
      if ( $config{'im'} ge $index ) {
        $config{'im'}=0;
      }
    }

    if ($key =~/^[Ff]/) {
      $index=scalar(@{$data{'office'}});
      ++$config{'office'};
      if ( $config{'office'} ge $index ) {
        $config{'office'}=0;
      }
    }

    if ($key =~/^[Gg]/) {
      $index=scalar(@{$data{'music'}});
      ++$config{'music'};
      if ( $config{'music'} ge $index ) {
        $config{'music'}=0;
      }
    }

    if ($key =~/^[Hh]/) {
      $index=scalar(@{$data{'video'}});
      ++$config{'video'};
      if ( $config{'video'} ge $index ) {
        $config{'video'}=0;
      }
    }

    if ($key =~/^[Ii]/) {

      if ( $config{'winauth'} eq 0 ) {
        $config{'winauth'}=1;
      } else {
        $config{'winauth'}=0;
      }
    }

    if ($key =~/^[Jj]/) {

      if ( $config{'winsoft'} eq 0 ) {
        $config{'winsoft'}=1;
      } else {
        $config{'winsoft'}=0;
      }
    }

    if ($key =~/^[\/]/) {
      writeline($LGN."These changes will be applied to your computer, continue? [".$LTB."y".$LGN."/".$LTB."N".$LGN."]: ");
      $key="";
      cbreak(on);
      $key=waitkey();
      cbreak(off);
      if ($key =~/^[Yy]/) {
        applychanges;
      }
      $key="";
    }
     writeline("$RST");

  }
}

