init();
break;
case "bacula-config":
+ bacula_config();
break;
case "add-disk":
add_disk();
break;
case "disks":
+ list_disks();
break;
case "status":
+ pbdc_status();
break;
default:
echo "invalid command\n";
}
+function bacula_config()
+{
+ global $BASE_DATA, $BASE_LIB, $BACULA_USER, $argv;
+
+ check_init_and_fail($argv[1]);
+ $changer = $argv[1];
+
+ $db = db_getDB($argv[1]);
+
+ $ntapes = conf_getVal($changer, "ndrives");
+ $tapeloc = conf_getVal($changer, "drivelocation");
+
+ // TODO: do this bit
+ // bacula-sd.conf
+ ?>
+Autochanger {
+ Name = <?php echo "$changer\n"?>
+ <?php
+ for($i=0; $i<$ntapes; $i++) {
+ echo "Device = \"$changer-drive$i\"\n";
+ }
+ ?>
+ Changer Command = "/usr/local/bin/vchanger %c %o %S %a %d"
+ Changer Device = "<?php echo $changer ?>"
+}
+
+<?php
+ for($i=0; $i < $ntapes; $i++) {
+?>
+Device {
+ Name = <?php echo "\"$changer-drive$i\"\n" ?>
+ DriveIndex = <?php echo "$i\n" ?>
+ Autochanger = yes;
+ DeviceType = File
+ MediaType = File
+ ArchiveDevice = <?php echo "\"$tapeloc/$changer-drive$i\"\n" ?>
+ RemovableMedia = no;
+ RandomAccess = yes;
+}
+<?php
+ }
+}
+
+function pbdc_status()
+{
+ global $BASE_DATA, $BASE_LIB, $BACULA_USER, $argv;
+
+ check_init_and_fail($argv[1]);
+ $changer = $argv[1];
+
+ $db = db_getDB($argv[1]);
+
+ $res = $db->query("select * from disk_list");
+
+ $tapeloc = conf_getVal($changer, "drivelocation");
+ $amloc = conf_getVal($changer, "automountdir");
+
+ $ret = false;
+ foreach($res as $row) {
+ echo "Listing tapes for disk ".$row["disk_id"].", ".$row["disk_name"]."\n";
+ //echo "dir: $amloc/".$row["disk_name"]."/pbdc/".$argv[1]."/tapes/\n";
+ //exit(0);
+ $dh = opendir("$amloc/".$row["disk_name"]."/pbdc/".$argv[1]."/tapes/");
+ while(($file = readdir($dh)) !== false) {
+ if(ereg("d[0-9]+_vol[0-9]+", $file)!=false) {
+ echo "Tape: $file\n";
+ } else {
+ //echo "didnt match: $file\n";
+ }
+ //exit(0);
+ }
+ closedir($dh);
+ }
+
+ $nt = (int)(conf_getVal($changer, "ndrives"));
+ for($i = 0; $i < $nt; $i++) {
+ if(file_exists("$tapeloc/$changer-drive$i")) {
+ $rl = basename(readlink("$tapeloc/$changer-drive$i"));
+ echo "drive $i points has tape $rl loaded\n";
+ } else {
+ echo "drive $i is unloaded\n";
+ }
+ }
+}
+
+function list_disks()
+{
+ global $BASE_DATA, $BASE_LIB, $BACULA_USER, $argv;
+
+ check_init_and_fail($argv[1]);
+
+ $db = db_getDB($argv[1]);
+
+ $res = $db->query("select * from disk_list");
+
+ $ret = false;
+ foreach($res as $row) {
+ echo "Disk ".$row["disk_id"].": ".$row["disk_name"]."\n";
+ $ret = true;
+ }
+
+ if(!$ret) {
+ echo "No disks defined yet for this changer\n";
+ }
+
+
+ return;
+}
+
function init()
{
global $BASE_DATA, $BASE_LIB, $BACULA_USER, $argv;
echo "This command will init the data for $changer_name\n";
- if(file_exists("$BASE_DATA/$changer_name.db")) {
+ if(file_exists("$BASE_DATA/$changer_name.db")&&check_init($changer_name)) {
//echo "Daemon is already init'd, are you sure you wish to do this, it will loose all config [y/n]:";
$r = readline("Daemon is already init'd, are you sure you wish to do this, it will loose all config [y/n]:");
if($r == "y") {
}
echo "Creating database\n";
- $r = readline("Directory where automount occurs [/changer/]:");
- $r = readline("Number of drives [1]:");
- $r = readline("Size of tapes [20] (in gb):");
+ $ra = readline("Directory where automount occurs [/changer/]:");
+ $rb = readline("Number of drives [1]:");
+ $rc = readline("Size of tapes [20] (in gb):");
+ $rd = readline("Where to store drive pointers [/var/run/bacula/]:");
+
+ if($ra == "") $ra = "/changer/";
+ if($rb == "") $rb = 1;
+ if($rc == "") $rc = 20;
+ if($rd == "") $rd = "/var/run/bacula/";
+
+ conf_setVal($changer_name, "automountdir", "$ra");
+ conf_setVal($changer_name, "ndrives", "$rb");
+ conf_setVal($changer_name, "tapesize", "$rc");
+ conf_setVal($changer_name, "drivelocation", "$rd");
+
+ // check if they were set
+ echo "got: ".conf_getVal($changer_name, "automountdir").", and ".conf_getVal($changer_name, "tapesize").", and ".conf_getVal($changer_name, "ndrives")."\n";
+}
+
+function check_init_and_fail($changer)
+{
+ $lk = conf_getVal($changer, "automountdir");
+ if(!$lk) {
+ echo "DB not init'd yet, please run init first\n";
+ exit(0);
+ }
+}
+
+function check_init($changer)
+{
+ $lk = conf_getVal($changer, "automountdir");
+ if(!$lk) {
+ return false;
+ }
+
+ return true;
}
function add_disk()
// creating pbdc/changer_name/stuff.
global $BASE_DATA, $BASE_LIB, $BACULA_USER, $argv;
+ check_init_and_fail($argv[1]);
+
$dh = opendir("/dev/disk/by-uuid");
$disk = "";
}
// now we try and init the disk
+ // we have to get automount directory config
+ $dir = conf_getVal($argv[1], "automountdir");
+ if(!is_dir($dir)) {
+ echo "cant find automount directory, $dir\n";
+ }
+ $mkd = "$dir/".basename($disk[$i]["syml"])."/pbdc/".$argv[1]."/tapes/";
+ $k = mkdir($mkd, 0700, true);
+
+ if(!is_dir($mkd)) {
+ echo "Error, couldn't create directory, check permissions on $mkd?\n";
+ }
+
+ $ts = conf_getVal($argv[1], "tapesize");
+ $max = (int)($disk[$i]["size"]/$ts);
+
+ $kt = (int)(readline("No of tapes to create [max:$max] @ ".$ts."gb each:"));
+ if($kt > $max) {
+ echo "Sorry, max number of tapes is $max, creating $max instead\n";
+ $kt = $max;
+ }
+
+ $did = add_diskToDB($argv[1], basename($disk[$i]["syml"]));
+
+ if(!$did) {
+ echo "Disk already exists, doing nothing\n";
+ exit(0);
+ }
+
+ // disk names are d.$did_vol0000x
+ //echo "did: $did\n";
+ for($ii=0; $ii < $kt; $ii++) {
+ $tid = sprintf("d%d_vol%04d", $did, $ii);
+ //echo "would create $tid\n";
+ $tp = "$dir/".basename($disk[$i]["syml"])."/pbdc/".$argv[1]."/tapes/$tid";
+ if(!file_exists($tp)) {
+ fopen($tp, "w");
+ echo "created tape $tid\n";
+ } else {
+ echo "tape $tid already existed\n";
+ }
+ }
}
?>
\ No newline at end of file