]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Add a new function that permit to mark missing
authorEric Bollengier <eric@eb.homelinux.org>
Fri, 7 Nov 2008 19:18:54 +0000 (19:18 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Fri, 7 Nov 2008 19:18:54 +0000 (19:18 +0000)
     jobs as failed in job history table. That gives
     a more accurate way to do statistics.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8016 91ce42f0-d328-0410-95d8-f526ca767f89

gui/bweb/cgi/bweb.pl
gui/bweb/lang/en/tpl/scheduled_job.tpl
gui/bweb/lang/es/tpl/scheduled_job.tpl
gui/bweb/lang/fr/tpl/scheduled_job.tpl
gui/bweb/lib/Bconsole.pm
gui/bweb/lib/Bweb.pm
gui/bweb/script/regress.pl
gui/bweb/technotes-2.3
gui/bweb/tpl/scheduled_job.tpl

index 38e1b1eff17ee8cc6cc08f0cc4f6257b5bbcae79..4751b35cb18a23e10bc3a2a1f35a3196a6225d90 100755 (executable)
@@ -441,6 +441,9 @@ if ($action eq 'begin') {           # main display
 } elsif ($action eq 'cancel_job') {
     $bweb->cancel_job();
 
+} elsif ($action eq 'cancel_future_job') {
+    $bweb->cancel_future_job();
+
 } elsif  ($action eq 'media_zoom') {
     $bweb->display_media_zoom();
 
index 15324c17cc58e2f4ba51305e04b54b011e755fbd..165c2e42feeb0da36615b546abca6a58705054c3 100644 (file)
       <button type="submit" class="bp" name='action' title='Disable' value='disable_job'>
        <img src='/bweb/inflag0.png' alt=''> Disable </button>
        <button type="submit" onsubmit='document.form1.level.value="all"' class="bp" name='action' value='job' title='view <TMPL_VAR Client> jobs'><img src='/bweb/zoom.png'>View jobs</button>
+<TMPL_IF missing_mode>
+      <button type="submit" class="bp" name='action' title='Mark this job as canceled in job history' value='cancel_future_job'>
+       <img src='/bweb/f.png' alt=''> Mark it as canceled </button>
+</TMPL_IF>
 <TMPL_IF wiki_url>
        <a id='wiki' href="<TMPL_VAR wiki_url>" title='View doc'><img src='/bweb/doc.png' alt='View doc'></a>View doc
 </TMPL_IF>
@@ -17,6 +21,7 @@
      <input type='hidden' name='level' value=''>
      <input type='hidden' name='media' value=''>
      <input type='hidden' name='client' value=''>
+     <input type='hidden' name='when' value=''>
     </form>
  </div>
 
@@ -45,6 +50,7 @@ chkbox.onclick = function() {
  document.form1.pool.value = '<TMPL_VAR pool>';
  document.form1.media.value = '<TMPL_VAR volume>';
  document.form1.client.value = '<TMPL_VAR client>';
+ document.form1.when.value = '<TMPL_VAR date>';
  if (wiki_url) {
    document.getElementById('wiki').href=wiki_url + '<TMPL_VAR client>';
  }
index 49a1f9b7e9700dfecc40757b263bdbd19ffe6993..ac53e8b7ec3561213dc38430e2d18c379f7a85f7 100644 (file)
       <button type="submit" class="bp" name='action' title='Desactivar' value='disable_job'>
        <img src='/bweb/inflag0.png' alt=''> Desactivar </button>
        <button type="submit" onsubmit='document.form1.level.value="all"' class="bp" name='action' value='job' title='view <TMPL_VAR Client> jobs'><img src='/bweb/zoom.png'>Ver jobs</button>
+<TMPL_IF missing_mode>
+      <button type="submit" class="bp" name='action' title='Mark this job as canceled in job history' value='cancel_future_job'>
+       <img src='/bweb/f.png' alt=''> Mark it as canceled </button>
+</TMPL_IF>
 <TMPL_IF wiki_url>
        <a id='wiki' href="<TMPL_VAR wiki_url>" title='View doc'><img src='/bweb/doc.png' alt='View doc'></a>View doc
 </TMPL_IF>
@@ -17,6 +21,7 @@
      <input type='hidden' name='level' value=''>
      <input type='hidden' name='media' value=''>
      <input type='hidden' name='client' value=''>
+     <input type='hidden' name='when' value=''>
     </form>
  </div>
 
@@ -45,6 +50,7 @@ chkbox.onclick = function() {
  document.form1.pool.value = '<TMPL_VAR pool>';
  document.form1.media.value = '<TMPL_VAR volume>';
  document.form1.client.value = '<TMPL_VAR client>';
+ document.form1.when.value = '<TMPL_VAR date>';
  if (wiki_url) {
    document.getElementById('wiki').href=wiki_url + '<TMPL_VAR client>';
  }
index 8c9dcba1af7e06271a2c937af2931508a9fc4673..c8f56cc1f7039dad816dac2e8429b38a83a21abb 100644 (file)
       <button type="submit" class="bp" name='action' title='Désactiver' value='disable_job'>
        <img src='/bweb/inflag0.png' alt=''> Désactiver </button>
        <button type="submit" onsubmit='document.form1.level.value="all"' class="bp" name='action' value='job' title='voir <TMPL_VAR Client> jobs'><img src='/bweb/zoom.png'>Voir les jobs</button>
+<TMPL_IF missing_mode>
+      <button type="submit" class="bp" name='action' title='Mark this job as canceled in job history' value='cancel_future_job'>
+       <img src='/bweb/f.png' alt=''> Mark it as canceled </button>
+</TMPL_IF>
 <TMPL_IF wiki_url>
        <a id='wiki' href="<TMPL_VAR wiki_url>" title='Documentation'><img src='/bweb/doc.png' alt='Documentation'></a>Documentation
 </TMPL_IF>
@@ -17,6 +21,7 @@
      <input type='hidden' name='level' value=''>
      <input type='hidden' name='media' value=''>
      <input type='hidden' name='client' value=''>
+     <input type='hidden' name='when' value=''>
     </form>
  </div>
 
@@ -45,6 +50,7 @@ chkbox.onclick = function() {
  document.form1.pool.value = '<TMPL_VAR pool>';
  document.form1.media.value = '<TMPL_VAR volume>';
  document.form1.client.value = '<TMPL_VAR client>';
+ document.form1.when.value = '<TMPL_VAR date>';
  if (wiki_url) {
    document.getElementById('wiki').href=wiki_url + '<TMPL_VAR client>';
  }
index 96b6e1018bac6b21393f0d3158191a98ed167fa5..cd8456c0e52da6353d2caa625a689c4edb41b0c1 100644 (file)
@@ -445,7 +445,7 @@ package main;
 print "test sans conio\n";
 
 my $c = new Bconsole(pref => {
-    bconsole => '/tmp/bacula/sbin/bconsole -n -c /tmp/bacula/etc/bconsole.conf',
+    bconsole => '/tmp/regress/bin/bconsole -n -c /tmp/regress/bin/bconsole.conf',
 },
                     debug => 0);
 
index 37a1b97293d06db3741a42d53896bfe8d821eed5..6c3c30a11a54235bc424155980b6a3074be96d9e 100644 (file)
@@ -1868,7 +1868,7 @@ sub get_form
            }
        } elsif (exists $opt_t{$i}) { # 1: hh:min optionnal, 2: hh:min required
            my $when = CGI::param($i) || '';
-           if ($when =~ /(\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2})?)/) {
+           if ($when =~ /(\d{4}-\d{2}-\d{2}( \d{2}:\d{2}(:\d{2})?)?)/) {
                if ($opt_t{$i} == 1 or defined $2) {
                    $ret{$i} = $1;
                }
@@ -4554,6 +4554,69 @@ SELECT count(1) AS nbline,
                 }, 'display_log.tpl');
 }
 
+sub cancel_future_job
+{
+    my ($self) = @_;
+    $self->can_do('r_cancel_job');
+
+    my $arg = $self->get_form(qw/job pool level client when/);
+
+    if ( !$arg->{job} or !$arg->{pool} or !$arg->{level} 
+         or !$arg->{client} or !$arg->{when})
+    {
+        return $self->error("Can't get enough information to mark this job as canceled");
+    }
+
+    $arg->{level} =~ s/^(.).+/$1/; # we keep the first letter
+    my $jobtable = $self->{info}->{stat_job_table} || 'JobHistory';
+
+    if ($jobtable =~ /^Job$/i) {
+        return $self->error("Can add records only in history table");
+    }
+    my $jname = "$arg->{job}.$arg->{when}";
+    $jname =~ s/\s/_/g;
+
+    my $found = $self->dbh_selectrow_hashref("
+SELECT 1
+  FROM $jobtable
+ WHERE JobId = 0
+   AND Job = '$jname'
+   AND Name = '$arg->{job}'
+");
+    if ($found) {
+        return $self->error("$jname is already in history table");
+    }
+
+        $self->dbh_do("
+INSERT INTO $jobtable 
+  (JobId, Name, Job, Type, Level, JobStatus, SchedTime, StartTime, EndTime, 
+   RealEndTime, ClientId, PoolId) 
+ VALUES 
+  (0, '$arg->{job}', '$jname', 'B', '$arg->{level}', 'A',
+   '$arg->{when}', '$arg->{when}', '$arg->{when}', '$arg->{when}',
+   (SELECT ClientId FROM Client WHERE Name = '$arg->{client}'),
+   (SELECT PoolId FROM Pool WHERE Name = '$arg->{pool}')
+  )
+");
+    $self->display({ Filter => "Dummy record for $jname",
+                    ID => 1,
+                    Jobs => 
+                         [{ jobid => 0,
+                            client => $arg->{client},
+                            jobname => $arg->{job},
+                            pool => $arg->{pool},
+                            level => $arg->{level},
+                            starttime => $arg->{when},
+                            duration => '00:00:00',
+                            jobfiles => 0,
+                            jobbytes => 0,
+                            joberrors => 0,
+                            jobstatus => 'A',
+                     }]
+                  },
+                  "display_job.tpl");
+}
+
 sub add_media
 {
     my ($self) = @_ ;
@@ -4738,8 +4801,8 @@ sub enable_disable_job
     my ($self, $what) = @_ ;
     $self->can_do('r_run_job');
 
-    my $name = CGI::param('job') || '';
-    unless ($name =~ /^[\w\d\.\-\s]+$/) {
+    my $arg = $self->get_form('job');
+    if (!$arg->{job}) {
        return $self->error("Can't find job name");
     }
 
@@ -4753,9 +4816,9 @@ sub enable_disable_job
     }
 
     $self->display({
-       content => $b->send_cmd("$cmd job=\"$name\""),
-       title => "$cmd $name",
-       name => "$cmd job=\"$name\"",
+       content => $b->send_cmd("$cmd job=\"$arg->{job}\""),
+       title => "$cmd $arg->{job}",
+       name => "$cmd job=\"$arg->{job}\"",
     }, "command.tpl"); 
 }
 
@@ -4830,14 +4893,15 @@ sub run_job_mod
     $self->can_do('r_run_job');
 
     my $b = $self->get_bconsole();
-    
-    my $job = CGI::param('job') || '';
+    my $arg = $self->get_form(qw/pool level client fileset storage media job/);
+
+    if (!$arg->{job}) {
+        return $self->error("Can't get job name");
+    }
 
     # we take informations from director, and we overwrite with user wish
-    my $info = $b->send_cmd("show job=\"$job\"");
+    my $info = $b->send_cmd("show job=\"$arg->{job}\"");
     my $attr = $self->run_parse_job($info);
-
-    my $arg = $self->get_form(qw/pool level client fileset storage media/);
     
     if (!$arg->{pool} and $arg->{media}) {
        my $r = $self->dbh_selectrow_hashref("
@@ -4893,15 +4957,17 @@ sub run_job_now
     
     # TODO: check input (don't use pool, level)
 
-    my $arg = $self->get_form('pool', 'level', 'client', 'priority', 'when', 'fileset');
-    my $job = CGI::param('job') || '';
-    my $storage = CGI::param('storage') || '';
+    my $arg = $self->get_form(qw/pool level client priority when 
+                                 fileset job storage/);
+    if (!$arg->{job}) {
+        return $self->error("Can't get your job name");
+    }
 
-    my $jobid = $b->run(job => $job,
+    my $jobid = $b->run(job => $arg->{job},
                        client => $arg->{client},
                        priority => $arg->{priority},
                        level => $arg->{level},
-                       storage => $storage,
+                       storage => $arg->{storage},
                        pool => $arg->{pool},
                        fileset => $arg->{fileset},
                        when => $arg->{when},
@@ -4983,11 +5049,11 @@ sub check_job
        $l = $self->get_higher_level($l);
        my $evts = $sched->get_event($s);
        my $end = $sched->{end}; # this backup must have start before the next one
-       
        foreach my $evt (reverse @$evts) {
            my $all = $self->dbh_selectrow_hashref("
  SELECT 1
-   FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId)
+   FROM Job
+   JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId)
   WHERE Job.StartTime >= '$evt' 
     AND Job.StartTime <  '$end'
     AND Job.Name = '$job'
@@ -5050,10 +5116,11 @@ sub display_missing_job
        }
     }
     $self->display({
-       id => $cur_id++,
-       title => "Missing Job (since $arg->{begin} to $arg->{end})",
-       list => $self->{tmp},
-       wiki_url => $self->{info}->{wiki_url},
+        id => $cur_id++,
+        title => "Missing Job (since $arg->{begin} to $arg->{end})",
+        list => $self->{tmp},
+        wiki_url => $self->{info}->{wiki_url},
+        missing_mode => 1,
     }, "scheduled_job.tpl");
 
     delete $self->{tmp};
index 1b9828da43985834b84b082a49f381e87b0becbc..8a287b1a9a1e09ea7da5ea61fc7b0f24b1531562 100755 (executable)
@@ -93,6 +93,12 @@ ok($c =~ m!(action=job_zoom;jobid=\d+)!, "Get the first JobId");
 die "Can't get first jobid ($c)" unless $1;
 $job_url=$1;
 
+# check missing view
+ok($agent->follow_link(text_regex=>qr/Missing Jobs/), "Go to Missing Jobs page");
+$c=$agent->content;
+like($c, qr/BackupCatalog/, "Check for BackupCatalog job");
+unlike($c, qr/backup/, "Check for backup job");
+
 # test job_zoom page
 # check for
 #  - job log
@@ -138,7 +144,7 @@ ok($agent->success,"Get job zoom");
 ok($agent->form_name('delete'), "Find form");
 $agent->click(); $c=$agent->content;
 ok($agent->success, "Delete it"); 
-like($c, qr!deleted!, "Check deleted message");
+like($c, qr!deleted from the catalog!, "Check deleted message");
 
 $agent->get("$url?$job_url");
 ok($agent->success,"Get job zoom");
index 08fdef82585585ece229bad82a3f2ac2b49a5842..33d061372ecdd206b93e81858992c9204a113f00 100644 (file)
@@ -1,3 +1,9 @@
+07Nov08
+ebl  Fix statistics page
+ebl  Add new "Cancel missing job" feature to be able
+     to mark missing job as failed in history table.
+ebl  Fix a couple of unchecked arguments.
+
 06Nov08
 ebl  Fix a Bconsole.pm with Expect bug on debian lenny
 ebl  Fix in storage command
index aa7d3a3f35514f19178253c335044828b1375854..c76ab7703d717c1d292ed59b97691bf0266bad75 100644 (file)
       <button type="submit" class="bp" name='action' title='__Disable__' value='disable_job'>
        <img src='/bweb/inflag0.png' alt=''> __Disable__ </button>
        <button type="submit" onsubmit='document.form1.level.value="all"' class="bp" name='action' value='job' title='__view__ <TMPL_VAR Client> __jobs__'><img src='/bweb/zoom.png'>__View jobs__</button>
+<TMPL_IF missing_mode>
+      <button type="submit" class="bp" name='action' title='__Mark this job as canceled in job history__' value='cancel_future_job'>
+       <img src='/bweb/f.png' alt=''> __Mark it as canceled__ </button>
+</TMPL_IF>
 <TMPL_IF wiki_url>
        <a id='wiki' href="<TMPL_VAR wiki_url>" title='__View doc__'><img src='/bweb/doc.png' alt='__View doc__'></a>__View doc__
 </TMPL_IF>
@@ -17,6 +21,7 @@
      <input type='hidden' name='level' value=''>
      <input type='hidden' name='media' value=''>
      <input type='hidden' name='client' value=''>
+     <input type='hidden' name='when' value=''>
     </form>
  </div>
 
@@ -45,6 +50,7 @@ chkbox.onclick = function() {
  document.form1.pool.value = '<TMPL_VAR pool>';
  document.form1.media.value = '<TMPL_VAR volume>';
  document.form1.client.value = '<TMPL_VAR client>';
+ document.form1.when.value = '<TMPL_VAR date>';
  if (wiki_url) {
    document.getElementById('wiki').href=wiki_url + '<TMPL_VAR client>';
  }