]>
Commit | Line | Data |
---|---|---|
ee31ad01 MR |
1 | package PVE::Storage::LunCmd::Comstar; |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | use Digest::MD5 qw(md5_hex); | |
6 | use PVE::Tools qw(run_command file_read_firstline trim dir_glob_regex dir_glob_foreach); | |
7 | use Data::Dumper; | |
8 | ||
9 | my @ssh_opts = ('-o', 'BatchMode=yes'); | |
10 | my @ssh_cmd = ('/usr/bin/ssh', @ssh_opts); | |
3b219e80 | 11 | my $id_rsa_path = '/etc/pve/priv/zfs'; |
ee31ad01 MR |
12 | |
13 | my $get_lun_cmd_map = sub { | |
3b219e80 MR |
14 | my ($method) = @_; |
15 | ||
16 | my $stmfadmcmd = "/usr/sbin/stmfadm"; | |
17 | my $sbdadmcmd = "/usr/sbin/sbdadm"; | |
18 | ||
19 | my $cmdmap = { | |
20 | create_lu => { cmd => $stmfadmcmd, method => 'create-lu' }, | |
21 | delete_lu => { cmd => $stmfadmcmd, method => 'delete-lu' }, | |
22 | import_lu => { cmd => $stmfadmcmd, method => 'import-lu' }, | |
23 | modify_lu => { cmd => $stmfadmcmd, method => 'modify-lu' }, | |
24 | add_view => { cmd => $stmfadmcmd, method => 'add-view' }, | |
25 | list_view => { cmd => $stmfadmcmd, method => 'list-view' }, | |
26 | list_lu => { cmd => $sbdadmcmd, method => 'list-lu' }, | |
27 | }; | |
28 | ||
29 | die "unknown command '$method'" unless exists $cmdmap->{$method}; | |
30 | ||
31 | return $cmdmap->{$method}; | |
ee31ad01 MR |
32 | }; |
33 | ||
34 | sub get_base { | |
3b219e80 | 35 | return '/dev/zvol/rdsk'; |
ee31ad01 MR |
36 | } |
37 | ||
38 | sub run_lun_command { | |
3b219e80 | 39 | my ($scfg, $timeout, $method, @params) = @_; |
ee31ad01 MR |
40 | |
41 | my $msg = ''; | |
42 | my $luncmd; | |
43 | my $target; | |
44 | my $guid; | |
45 | $timeout = 10 if !$timeout; | |
3b219e80 | 46 | |
ee31ad01 MR |
47 | my $output = sub { |
48 | my $line = shift; | |
3b219e80 | 49 | $msg .= "$line\n"; |
ee31ad01 MR |
50 | }; |
51 | ||
3b219e80 MR |
52 | if ($method eq 'create_lu') { |
53 | my $prefix = '600144f'; | |
54 | my $digest = md5_hex($params[0]); | |
55 | $digest =~ /(\w{7}(.*))/; | |
56 | $guid = "$prefix$2"; | |
57 | @params = ('-p', 'wcd=false', '-p', "guid=$guid", @params); | |
58 | } elsif ($method eq 'modify_lu') { | |
59 | @params = ('-s', @params); | |
60 | } elsif ($method eq 'list_view') { | |
61 | @params = ('-l', @params); | |
ee31ad01 | 62 | } elsif ($method eq 'list_lu') { |
3b219e80 MR |
63 | $guid = $params[0]; |
64 | @params = undef; | |
65 | } | |
66 | ||
67 | my $cmdmap = $get_lun_cmd_map->($method); | |
68 | $luncmd = $cmdmap->{cmd}; | |
69 | my $lunmethod = $cmdmap->{method}; | |
70 | ||
71 | $target = 'root@' . $scfg->{portal}; | |
72 | ||
73 | my $cmd = [@ssh_cmd, '-i', "$id_rsa_path/$scfg->{portal}_id_rsa", $target, $luncmd, $lunmethod, @params]; | |
74 | ||
75 | run_command($cmd, outfunc => $output, timeout => $timeout); | |
76 | ||
77 | if ($method eq 'list_view') { | |
78 | my @lines = split /\n/, $msg; | |
79 | $msg = undef; | |
80 | foreach my $line (@lines) { | |
81 | if ($line =~ /^\s*LUN\s*:\s*(\d+)$/) { | |
82 | $msg = $1; | |
83 | last; | |
84 | } | |
85 | } | |
86 | } elsif ($method eq 'list_lu') { | |
87 | my $object = $guid; | |
88 | my @lines = split /\n/, $msg; | |
89 | $msg = undef; | |
90 | foreach my $line (@lines) { | |
91 | if ($line =~ /(\w+)\s+\d+\s+$object$/) { | |
92 | $msg = $1; | |
93 | last; | |
94 | } | |
95 | } | |
96 | } elsif ($method eq 'create_lu') { | |
97 | $msg = $guid; | |
98 | } | |
99 | ||
100 | return $msg; | |
ee31ad01 MR |
101 | } |
102 |