#! /usr/bin/perl

my $cupsservice = 'cups';
my $oki4service = 'oki4daemon';
my $okidevice = '/dev/null';
my $lpadmin = '/usr/sbin/lpadmin';
my $poll_ppd_base = '/usr/bin/poll_ppd_base';
my $grep = '/bin/grep';
my $cat = '/bin/cat';
my $cut = '/usr/bin/cut';
my $head = '/usr/bin/head';
my $tail = '/usr/bin/tail';
my $wc = '/usr/bin/wc';

# Make sure that CUPS is running

system "service $cupsservice start 1> /dev/null 2> /dev/null";
# or die "Cannot start the CUPS daemon, please install the \"cups\" package!";

# Check whether there are drivers for OKI winprinters

open NUMBEROFDRIVERS, "$poll_ppd_base -a | $grep oki4w | $wc -l |" or die "Cannot read driver database!";

my $ndrivers = <NUMBEROFDRIVERS>; 
close NUMBEROFDRIVERS;

if ( $ndrivers =~ m/^\s*(\d+)\D*/ ) {
  $ndrivers = $1;
} else {
    die "Could not determine the number of supported OKI winprinter models!";
}

if ($ndrivers == 0) {
  die "Please install the \"cups-drivers\" package!";
}

# Ask the user which printer model he has

print "\n";
print "OKI 4w winprinter installation program\n";
print "--------------------------------------\n";
print "\n";
print "(C) 2000 by Till Kamppeter\n";
print "Free software under the terms of the GNU General Public License (GPL)\n";
my $driver = "";

do {
  print "\n";
  print "Currently the following OKI winprinters are supported\n";
  print "\n";

  system "$poll_ppd_base -a | $grep oki4w | $cut -d '|' -f 3 | $cut -d ',' -f 1 | $cat -n";

  print "\n";
  print "Please enter the number of your printer and make sure, that it is\n";
  print "connected to your parallel port (/dev/lp0, LPT1:).\n";
  print "\n";

  print "Number: ";
  my $input = <STDIN>;

  if ( $input =~ m/^\s*(\d+)\D*/ ) {
    my $number = $1;
    if (($number > 0) && ($number <= $ndrivers)) {
      open DRIVER, "$poll_ppd_base -a | $grep oki4w | $cut -d '|' -f 1 | $head -$number | $tail -1 |";
      if (!$?) {
        $driver = <DRIVER>; 
        close DRIVER;
      }
    }
  } else {
    print "\nWrong input, try again!\n";
  }
} until ($driver ne "");

my $printer = "";

do {
  print "\n";
  print "Please enter a name for your printer: ";
  my $input = <STDIN>;
  if ( $input =~ m/^\s*(\w+)\s*$/ ) {
    $printer = $1;
  } else {
    print "\nA printer name can only contain letters, digits, or underscores, try again!\n";
  }
} until ($printer ne "");

print "\nInstalling your printer under the name $printer ...\n";

system "service $oki4service start 1> /dev/null 2> /dev/null";

system("chown lp.sys /dev/oki4drv; chmod 660 $fifo") == 0
    or die "Unable to set ownerships/permissions for named pipe /dev/oki4drv!";

if (system "$lpadmin -p $printer -E -v $okidevice -m $driver") {
  system "service $oki4service stop 1> /dev/null 2> /dev/null";
  die "Could not install your printer under CUPS!";
};

system "chkconfig --add $oki4service";
system "chkconfig --add $cupsservice";

print "\nYour printer is successfully installed, you can configure it now with the help\nof \"kups\" or the web interface (http://localhost:631/printers/$printer)!\n\n";
