OpenSANd Code
Brought to you by:
hoefer
#! /usr/bin/perl
# This is opensand, an NBD base SAN system
# Copyright (C) 2008-2015 Stefan Hoefer <stefan@hoefer.ch>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use strict;
use warnings;
my $VERSION="0.10.0";
use IO::Socket::UNIX;
if (@ARGV < 1) {
die "Usage: oscontrol command [options]\n";
}
if ($ARGV[0] eq "version") {
print "oscontrol version:\n";
print " ".$VERSION."\n";
}
my $basepath = "/var/lib/opensand";
my $socket = IO::Socket::UNIX->new($basepath."/opensand.sock");
if (!$socket) {
die "Could not open socket\n";
}
if ($ARGV[0] eq "create") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && length($ARGV[2]) > 0) {
my $size = $ARGV[1]*1024*1024;
print $socket "create $size:$ARGV[2]\n";
my $answer = <$socket>;
print $answer;
}
else {
die "Usage: oscontrol create size_in_MB comment\n";
}
}
elsif ($ARGV[0] eq "status") {
#system("opensand status");
print $socket "status\n";
while (my $answer = <$socket>) {
print $answer;
}
}
elsif ($ARGV[0] eq "touchall") {
if (@ARGV == 2 && $ARGV[1] =~ /^\d+$/) {
print $socket "touchall $ARGV[1]\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol touchall id\n";
}
}
elsif ($ARGV[0] eq "protect") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && $ARGV[2] =~ /^0|1$/) {
print $socket "protect $ARGV[1] $ARGV[2]\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol protect id 0|1\n";
}
}
elsif ($ARGV[0] eq "scramble") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && $ARGV[2] =~ /^0|1$/) {
print $socket "scramble $ARGV[1] $ARGV[2]\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol scramble id 0|1\n";
}
}
elsif ($ARGV[0] eq "rename") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && length($ARGV[2]) > 0) {
print $socket "rename $ARGV[1] $ARGV[2]\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol rename id <name>\n";
}
}
elsif ($ARGV[0] eq "snapshot") {
#if (@ARGV == 2 && $ARGV[1] =~ /^\d+$/) {
if ((@ARGV == 2 && $ARGV[1] =~ /^\d+$/) || (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && $ARGV[2] =~ /^\d+$/)) {
my $disk = $ARGV[1];
my $size = 4096;
if (defined($ARGV[2])) {
$size = $ARGV[2];
}
print $socket "snapshot $disk $size\n";
my $answer = <$socket>;
print $answer;
}
else {
die "Usage: oscontrol snapshot disk_number [size_in_MB]\n";
}
}
elsif ($ARGV[0] eq "backup") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && $ARGV[2] =~ /^0|1$/) {
my $num = $ARGV[1];
my $backup = $ARGV[2];
print $socket "backup $num $backup\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol backup diskid 0|1\n";
}
}
# STH Dec 2012: we don't do these backups anymore, they don't work well
#elsif ($ARGV[0] eq "backup") {
# if (@ARGV == 2 && $ARGV[1] =~ /^\d+$/) {
# my $num = $ARGV[1];
# print $socket "backup $num\n";
# while (my $answer = <$socket>) {
# print $answer;
# }
# }
# else {
# die "Usage: oscontrol backup number_backups_kept\n";
# }
#}
elsif ($ARGV[0] eq "copy") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/) {
my $disk = $ARGV[1];
my $comment = $ARGV[2];
print $socket "copy $disk:$comment\n";
my $answer = <$socket>;
print $answer;
}
else {
die "Usage: oscontrol copy disk_number comment\n";
}
}
elsif ($ARGV[0] eq "transcrypt") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/) {
my $disk = $ARGV[1];
my $comment = $ARGV[2];
print $socket "transcrypt $disk:$comment\n";
my $answer = <$socket>;
print $answer;
}
else {
die "Usage: oscontrol transcrypt disk_number comment\n";
}
}
elsif ($ARGV[0] eq "runbackup") {
print $socket "runbackup\n";
my $answer = <$socket>;
print $answer;
}
elsif ($ARGV[0] eq "loadkeys") {
print $socket "load_keys\n";
my $answer = <$socket>;
print $answer;
}
elsif ($ARGV[0] eq "encrypt") {
if (@ARGV == 3 && $ARGV[1] =~ /^\d+$/ && $ARGV[2] =~ /^0|1$/) {
print $socket "encrypt $ARGV[1] $ARGV[2]\n";
}
else {
die "Usage: oscontrol encrypt id 0|1\n";
}
my $answer = <$socket>;
print $answer;
}
elsif ($ARGV[0] eq "show") {
if (@ARGV == 2) {
if ($ARGV[1] !~ /^\d+$/) {
die "The optional second argument to 'show' must be a number (disk id)!\n";
}
print $socket "show ".int($ARGV[1])."\n";
while (my $answer = <$socket>) {
print $answer;
}
}
elsif (@ARGV == 1) {
print $socket "show\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol show [diskid]\n";
}
}
elsif ($ARGV[0] eq "housekeeping") {
if (@ARGV == 3) {
if ($ARGV[1] !~ /^\d+$/) {
die "The second argument to 'housekeeping' must be a number (number of backups to keep; 0 means skip deleting old backups)!\n";
}
if ($ARGV[2] !~ /^\d+$/) {
die "The third argument to 'housekeeping' must be a number (number of MB to free by archiving; 0 means skip archiving/zipping backups)!\n";
}
print $socket "housekeeping ".int($ARGV[1])." ".int($ARGV[2])."\n";
while (my $answer = <$socket>) {
print $answer;
}
}
else {
die "Usage: oscontrol housekeeping <retention_number> <archive_size_in_MB>]\n";
}
}
elsif ($ARGV[0] eq "resources") {
print $socket "resources\n";
my $answer = <$socket>;
print $answer;
}
elsif ($ARGV[0] eq "delete") {
if (@ARGV == 2 && $ARGV[1] =~ /^\d+$/) {
print $socket "delete $ARGV[1]\n";
my $answer = <$socket>;
print $answer;
}
else {
die "Usage: oscontrol delete id\n";
}
}
elsif ($ARGV[0] eq "version") {
print $socket "version\n";
my $answer = <$socket>;
if (defined($answer)) {
print "core opensand version running:\n";
print " ".$answer."\n";
}
else {
print "core is running, but unknown version!\n";
}
}
elsif ($ARGV[0] eq "list") {
print $socket "list\n";
while (my $line = <$socket>) {
print $line;
}
}
else {
print "Unknown or no command\n";
print "Available commands are:\n";
print " create\n";
print " delete\n";
print " list\n";
print " snapshot\n";
print " copy\n";
print " backup\n";
print " encrypt\n";
print " scramble\n";
print " loadkeys\n";
print " protect\n";
print " transcrypt\n";
print " status\n";
print " show\n";
print " runbackup\n";
print " touchall\n";
print " housekeeping\n";
print " version\n";
print " resources\n";
print " rename\n";
}
close $socket;