1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
package NDB::Net::NodeDb;
use strict;
use Carp;
use Symbol;
require NDB::Net::Node;
use vars qw(@ISA);
@ISA = qw(NDB::Net::Node);
# constructors
my $log;
sub initmodule {
$log = NDB::Util::Log->instance;
}
NDB::Net::NodeDb->attributes(
fsdir => sub { s/^\s+|\s+$//g; /^\S+$/ },
);
sub new {
my $class = shift;
@_ % 2 == 0 or confess 0+@_;
my(%attr) = @_;
my $node = $class->SUPER::new(%attr, type => 'db')
or $log->push, return undef;
$node->setfsdir($attr{fsdir})
or $log->push, return undef;
return 1;
}
# run methods
sub handleprepare {
my $node = shift;
@_ == 1 or confess 0+@_;
my($opts) = @_;
my $netenv = NDB::Net::Env->instance;
my $envdefs = $node->getenvdefs($opts);
defined($envdefs) or return undef;
my $nodedir = $node->getnodedir;
my $shellfile = $node->getshellfile;
my $fsdir = NDB::Util::Dir->new(
path => sprintf("%s/%s/%s-%s.fs",
$node->getfsdir, $node->getdb->getname, $node->getid, $node->gettype));
$fsdir->mkdir or $log->push, return undef;
my $init_rm;
my $run;
if ($^O ne 'MSWin32') {
$init_rm = "# no -i";
if ($opts->{init_rm}) {
$init_rm = 'rm -f $NDB_FILESYSTEM/*/DBDIH/P0.sysfile';
}
$run = "\$NDB_TOP/bin/ndb";
} else {
$init_rm = "rem no -i";
if ($opts->{init_rm}) {
$init_rm =
'del/f %NDB_FILESYSTEM%\D1\DBDIH\P0.sysfile' . "\n" .
'del/f %NDB_FILESYSTEM%\D2\DBDIH\P0.sysfile';
}
$run = "ndb";
}
if ($node->getdb->cmpversion("1.0") <= 0) {
$run .= " -s";
}
if ($opts->{nostart}) {
$run .= " -n";
}
if ($node->hasrun) {
$run = $node->getrun;
}
if (defined($opts->{run})) {
$run = $opts->{run};
}
$log->put("run: $run")->push($node)->user;
if ($^O ne 'MSWin32') {
$shellfile->puttext(<<END) or $log->push, return undef;
$envdefs
NDB_FILESYSTEM=@{[ $fsdir->getpath ]}
export NDB_FILESYSTEM
# v1.0 compat
UAS_FILESYSTEM=\$NDB_FILESYSTEM
export UAS_FILESYSTEM
mkdir -p \$NDB_FILESYSTEM
$init_rm
cd @{[ $nodedir->getpath ]} || exit 1
exec \$debugger $run
END
} else {
$shellfile->puttext(<<END) or $log->push, return undef;
$envdefs
set NDB_FILESYSTEM=@{[ $fsdir->getpath ]}
rem v1.0 compat
set UAS_FILESYSTEM=%NDB_FILESYSTEM%
mkdir %NDB_FILESYSTEM%
$init_rm
cd @{[ $nodedir->getpath ]}
call $run
END
}
return 1;
}
sub cmd_stopnode_fg {
my($node, $cmd) = @_;
$node->setstate('stop')
or log->push($node), return undef;
return 1;
}
1;
# vim:set sw=4:
|