#!/usr/bin/perl
#

# Usage:  create_iscsi_targets.pl [count] [disk-size-in-1m-units]

# Make sure stuff is installed
# modprobe iscsi_tcp
# yum install iscsi-initiator-utils scsi-target-utils

# Experience on F10 indicates that no more than about 112
# disks can be properly created.

use strict;
my $i;

my $cnt = 20;
my $sz = 100; # 100M
my $export_base = "/export/iscsi";
if (@ARGV >= 1) {
  $cnt = $ARGV[0];
}

if (@ARGV >= 2) {
  $sz = $ARGV[1];
}

my_system("mkdir -p $export_base");

# Create enough loop devices.
for ($i = 0; $i<$cnt; $i++) {
  if (! -e "/dev/loop$i") {
    my_system("mknod -m640 /dev/loop$i b 7 $i");
  }
}

# Remove all existing targets
my @lns = `tgtadm --lld iscsi --op show --mode target|grep ^Target`;
for ($i = 0; $i<@lns; $i++) {
  if ($lns[$i] =~ /Target\s+(\d+):/) {
    my_system("tgtadm --lld iscsi --op delete --mode target --tid $1");
  }
}

# Un-associate all loop devices
my @lns = `losetup -a`;
for ($i = 0; $i<@lns; $i++) {
  if ($lns[$i] =~ /(\/dev\/loop\S+):.*$export_base/) {
    my_system("losetup -d $1");
  }
}

for ($i = 0; $i<$cnt; $i++) {
  if (-f "$export_base/disk$i") {
    print "$export_base/disk$i exists, not modifying.\n";
  }
  else {
    my $predisk = "$export_base/disk.$sz" . "m.ext3";
    if (-f $predisk) {
      my_system("cp $predisk $export_base/disk$i");
    }
    else {
      my_system("dd if=/dev/zero of=$export_base/disk$i bs=1M count=$sz");
    }
  }
  my $lov = `losetup -f`;
  chomp($lov);
  my_system("losetup $lov /export/iscsi/disk$i");
  my_system("tgtadm --lld iscsi --op new --mode target --tid=$i --targetname iqn.2009-02.com.lanforge:for.all.$i");
  my_system("tgtadm --lld iscsi --op new --mode logicalunit --tid $i --lun 1 -b $lov");
  my_system("tgtadm --lld iscsi --op bind --mode target --tid $i -I ALL");
}

my_system("tgtadm --lld iscsi --op show --mode target");

sub my_system {
  my $arg = shift;
  print("Running -:$arg:-\n");
  system($arg);
}



