]>
git.proxmox.com Git - pve-manager.git/blob - lib/PVE/API2/Tasks.pm
1 package PVE
::API2
::Tasks
;
7 use File
::ReadBackwards
;
12 use PVE
::RPCEnvironment
;
13 use PVE
::JSONSchema
qw(get_standard_option);
14 use PVE
::AccessControl
;
16 use base
qw(PVE::RESTHandler);
18 __PACKAGE__-
>register_method({
22 permissions
=> { user
=> 'all' },
23 description
=> "Read task list for one node (finished tasks).",
26 additionalProperties
=> 0,
28 node
=> get_standard_option
('pve-node'),
54 upid
=> { type
=> 'string' },
57 links
=> [ { rel
=> 'child', href
=> "{upid}" } ],
62 my $rpcenv = PVE
::RPCEnvironment
::get
();
63 my $user = $rpcenv->get_user();
67 my $filename = "/var/log/pve/tasks/index";
69 my $node = $param->{node
};
70 my $start = $param->{start
} || 0;
71 my $limit = $param->{limit
} || 50;
72 my $userfilter = $param->{userfilter
};
73 my $errors = $param->{errors
};
78 my $auditor = $rpcenv->check($user, "/nodes/$node", [ 'Sys.Audit' ]);
80 my $parse_line = sub {
81 if ($line =~ m/^(\S+)(\s([0-9A-Za-z]{8})(\s(\S.*))?)?$/) {
85 if ((my $task = PVE
::Tools
::upid_decode
($upid, 1))) {
86 return if $userfilter && $task->{user
} !~ m/\Q$userfilter\E/i;
87 next if !($auditor || $user eq $task->{user
});
89 return if $errors && $status && $status eq 'OK';
91 return if $count++ < $start;
92 return if $limit <= 0;
94 $task->{upid
} = $upid;
95 $task->{endtime
} = hex($endtime) if $endtime;
96 $task->{status
} = $status if $status;
103 if (my $bw = File
::ReadBackwards-
>new($filename)) {
104 while (defined ($line = $bw->readline)) {
109 if (my $bw = File
::ReadBackwards-
>new("$filename.1")) {
110 while (defined ($line = $bw->readline)) {
116 $rpcenv->set_result_count($count);
121 __PACKAGE__-
>register_method({
122 name
=> 'upid_index',
125 description
=> '', # index helper
126 permissions
=> { user
=> 'all' },
128 additionalProperties
=> 0,
130 node
=> get_standard_option
('pve-node'),
131 upid
=> { type
=> 'string' },
140 links
=> [ { rel
=> 'child', href
=> "{name}" } ],
151 __PACKAGE__-
>register_method({
155 description
=> 'Stop a task.',
156 permissions
=> { user
=> 'all' },
160 additionalProperties
=> 0,
162 node
=> get_standard_option
('pve-node'),
163 upid
=> { type
=> 'string' },
166 returns
=> { type
=> 'null' },
170 my ($task, $filename) = PVE
::Tools
::upid_decode
($param->{upid
}, 1);
171 raise_param_exc
({ upid
=> "unable to parse worker upid" }) if !$task;
172 raise_param_exc
({ upid
=> "no such task" }) if ! -f
$filename;
174 my $rpcenv = PVE
::RPCEnvironment
::get
();
175 my $user = $rpcenv->get_user();
176 my $node = $param->{node
};
178 my $sysadmin = $rpcenv->check($user, "/nodes/$node", [ 'Sys.Console' ]);
179 die "Permission check failed\n"
180 if !($sysadmin || $user eq $task->{user
});
182 my $pstart = PVE
::ProcFSTools
::read_proc_starttime
($task->{pid
});
183 $task->{status
} = ($pstart && ($pstart == $task->{pstart
})) ?
184 'running' : 'stopped';
186 die "not implemented - fixme";
191 __PACKAGE__-
>register_method({
192 name
=> 'read_task_log',
193 path
=> '{upid}/log',
195 permissions
=> { user
=> 'all' },
197 description
=> "Read task log.",
200 additionalProperties
=> 0,
202 node
=> get_standard_option
('pve-node'),
203 upid
=> { type
=> 'string' },
222 description
=> "Line number",
226 description
=> "Line text",
235 my ($task, $filename) = PVE
::Tools
::upid_decode
($param->{upid
}, 1);
236 raise_param_exc
({ upid
=> "unable to parse worker upid" }) if !$task;
240 my $rpcenv = PVE
::RPCEnvironment
::get
();
241 my $user = $rpcenv->get_user();
242 my $node = $param->{node
};
244 my $auditor = $rpcenv->check($user, "/nodes/$node", [ 'Sys.Audit' ]);
245 die "Permission check failed\n"
246 if !($auditor || $user eq $task->{user
});
248 my $fh = IO
::File-
>new($filename, "r");
249 raise_param_exc
({ upid
=> "no such task - unable to open file - $!" }) if !$fh;
251 my $start = $param->{start
} || 0;
252 my $limit = $param->{limit
} || 50;
255 while (defined ($line = <$fh>)) {
256 next if $count++ < $start;
259 push @$lines, { n
=> $count, t
=> $line};
265 # HACK: ExtJS store.guaranteeRange() does not like empty array
269 push @$lines, { n
=> $count, t
=> "no content"};
272 $rpcenv->set_result_count($count);
277 __PACKAGE__-
>register_method({
278 name
=> 'read_task_status',
279 path
=> '{upid}/status',
281 permissions
=> { user
=> 'all' },
283 description
=> "Read task status.",
286 additionalProperties
=> 0,
288 node
=> get_standard_option
('pve-node'),
289 upid
=> { type
=> 'string' },
299 type
=> 'string', enum
=> ['running', 'stopped'],
306 my ($task, $filename) = PVE
::Tools
::upid_decode
($param->{upid
}, 1);
307 raise_param_exc
({ upid
=> "unable to parse worker upid" }) if !$task;
308 raise_param_exc
({ upid
=> "no such task" }) if ! -f
$filename;
312 my $rpcenv = PVE
::RPCEnvironment
::get
();
313 my $user = $rpcenv->get_user();
314 my $node = $param->{node
};
316 my $auditor = $rpcenv->check($user, "/nodes/$node", [ 'Sys.Audit' ]);
317 die "Permission check failed\n"
318 if !($auditor || $user eq $task->{user
});
320 my $pstart = PVE
::ProcFSTools
::read_proc_starttime
($task->{pid
});
321 $task->{status
} = ($pstart && ($pstart == $task->{pstart
})) ?
322 'running' : 'stopped';
324 $task->{upid
} = $param->{upid
}; # include upid