All pastes #562650 Raw Edit

Mine

public text v1 · immutable
·published 2007-06-12 21:16 UTC
rendered paste body
#!/usr/bin/perl -w

use XML::LibXML;
use XML::LibXML::Common;
use XML::NamespaceSupport;
use XML::SAX;

use Getopt::Std;
use Getopt::Long;

use strict;

# Step (1): setup the configuration
my %{CONFIG};
my %{CHROOT};

${CONFIG}{"DEBUG"} = 0;

## find if we are locked under a custom ROOT directory
if ((defined(${ENV}{"ROOT"})) && (${ENV}{"ROOT"} ne "")) {
  ${CONFIG}{"ROOT"} = ${ENV}{"ROOT"};
} else {
  ${CONFIG}{"ROOT"} = "";
}

my $configfile;
my $debug;
my $debuglevel;

my $stop;
my $start;
my $reset;
my $delete;

## check for the --config file
GetOptions ("config=s"   => \$configfile
            ,"debug"   => \$debug
            ,"debuglevel=i" => \$debuglevel
            ,"stop=s" => \$stop
            ,"start=s" => \$start
            ,"reset=s" => \$reset
            ,"delete=s" => \$delete
            );


if ((defined($configfile)) && ($configfile ne "")) {
  ${CONFIG}{"XML"} = ${CONFIG}{"ROOT"} . $configfile;
} else {
  ${CONFIG}{"XML"} = ${CONFIG}{"ROOT"} .
    "/etc/devel-chroots/default/devel-chroots.conf";
}

## check for --debug
if (defined($debug)) {
  ${CONFIG}{"DEBUG"} = $debug;
}

## check for --debuglevel
if (defined($debuglevel)) {
  ${CONFIG}{"DEBUG"} = $debuglevel;
}

## check for --stop (shut down chroot and unmount)
## check for --start (start chroot and mount)
## check for --reset (shut down chroot, unmount and reset config files like /etc/make.conf and restore /usr/portage)
## check for --delete (shut down chroot, unmount and delete chroot)

# Step (2): parse the XML config
my $xml = XML::LibXML->new()->parse_file(${CONFIG}{"XML"});
my @chroots = $xml->getDocumentElement()->childNodes;

foreach my $tag (@chroots) {
  if($tag->nodeType==ELEMENT_NODE) {
    if ($tag->nodeName ne "chroot") {
      ${CONFIG}{lc($tag->nodeName)} = $tag->textContent;
    } else {
      my @o = $tag->getElementsByTagName("owner");
      my @n = $tag->getElementsByTagName("name");

      for (@o) {
        my $cO = $_->textContent;

        for(@n) {
          my $cN = $_->textContent;

          ${CHROOT}{lc($cO)}{lc($cN)}{"idx"} = $cO . ":" . $cN . ":" . time();

          foreach my $p ($tag->childNodes) {
            if($p->nodeType==ELEMENT_NODE &&
               $p->nodeName ne "owner" &&
               $p->nodeName ne "name") {
              ${CHROOT}{lc($cO)}{lc($cN)}{lc($p->nodeName)} = $p->textContent;
} } } } } } }


if (${CONFIG}{"DEBUG"} > 10) {
  print "config initialized, dumping information: \n";
  print "GLOBAL CONFIGURATION:\n";
  for(keys(%{CONFIG})) {
    print "$_:" . ${CONFIG}{$_} . "\n";
  }
  print "\n";
  print "CHROOT CONFIGURATION:\n";
  foreach my $owner (keys(%CHROOT)) {
    foreach my $chrootname (keys( %{ ${CHROOT}{$owner} } )) {
      foreach my $prop (keys( %{ ${CHROOT}{$owner}{$chrootname} } )) {
        print "CHROOT{" . $owner . "}{" . $chrootname . "}{" . $prop . "}" .
          " = " . ${CHROOT}{$owner}{$chrootname}{$prop} . "\n";
} } } }

## find chroots we need to start
if (defined($start) && $start ne "") {
  my @STARTCHROOTS = split(",", $start);

  for (@STARTCHROOTS) {
    my $name = $_;
    if ($name =~ /all/) {
      print "starting all chroots\n";
      foreach my $user (keys(%CHROOT)) {
        foreach my $chrootname (keys( %{ ${CHROOT}{$user} } )) {
          startChroot($user, $chrootname) or die "startChroot failed for $user:$chrootname";
        }
      }
    } else {
      print "starting chroots for: $name\n";
      foreach my $chrootname (keys( %{ ${CHROOT}{$name} } )) {
       startChroot($name, $chrootname) or die "startChroot failed for $name:$chrootname";
} } } }

## find any chroots we need to stop (implies stopped)
if (defined($stop) && $stop ne "") {
  my @STOPCHROOTS = split(",", $stop);

  for (@STOPCHROOTS) {
    my $name = $_;
    if ($name =~ /all/) {
      print "stopping all chroots\n";
      foreach my $user (keys(%CHROOT)) {
        foreach my $chrootname (keys( %{ ${CHROOT}{$user} } )) {
          stopChroot($user, $chrootname) or die "stopChroot failed for $user:$chrootname";
        }
      }
    } else {
      print "stopping chroot: $name\n";
      foreach my $chrootname (keys( %{ ${CHROOT}{$name} } )) {
        stopChroot($name, $chrootname) or die "stopChroot failed for $name:$chrootname";
} } } }


## find chroots we need to reset (implies stopped)
if (defined($reset) && $reset ne "") {
  my @RESETCHROOTS = split(",", $reset);

  for (@RESETCHROOTS) {
    my $name = $_;
    if ($name =~ /all/) {
      print "resetting all chroots\n";
      foreach my $user (keys(%CHROOT)) {
        foreach my $chrootname (keys( %{ ${CHROOT}{$user} } )) {
          resetChroot($user, $chrootname) or die "resetChroot failed for $user:$chrootname";
        }
      }
    } else {
      print "resetting chroot: $name\n";
      foreach my $chrootname (keys( %{ ${CHROOT}{$name} } )) {
        resetChroot($name, $chrootname) or die "resetChroot failed for $name:$chrootname";
} } } } 

## find chroots we need to delete
if (defined($delete) && $delete ne "") {
  my @DELETECHROOTS = split(",", $delete);

  for (@DELETECHROOTS) {
    my $name = $_;
    if ($name =~ /all/) {
      print "deleting all chroots\n";
      foreach my $user (keys(%CHROOT)) {
        foreach my $chrootname (keys( %{ ${CHROOT}{$user} } )) {
          deleteChroot($user, $chrootname) or die "deleteChroot failed for $user:$chrootname";
        }
      }
    } else {
      print "deleting chroot: $name\n";
      foreach my $chrootname (keys( %{ ${CHROOT}{$name} } )) {
        deleteChroot($name, $chrootname) or die "startChroot failed for $name:$chrootname";
} } } }

sub startChroot {
  my $user = shift or die "no user in startChroot";
  my $chroot = shift or die "no chroot in startChroot";
  my $success = 1;

  print "startChroot:$user:$chroot\n";

  return ($success);
}

sub stopChroot {
  my $user = shift or die "no user in stopChroot";
  my $chroot = shift or die "no chroot in stopChroot";
  my $success = 1;

  print "stopChroot:$user:$chroot\n";

  return ($success);
}


sub resetChroot {
  my $user = shift or die "no user in resetChroot";
  my $chroot = shift or die "no chroot in resetChroot";
  my $success = 1;

  print "resetChroot:$user:$chroot\n";

  stopChroot($user, $chroot);

  return ($success);
}

sub deleteChroot {
  my $user = shift or die "no user in deleteChroot";
  my $chroot = shift or die "no chroot in deleteChroot";
  my $success = 1;

  print "deleteChroot:$user:$chroot\n";

  stopChroot($user, $chroot);

  return ($success);
}

#eof#