Logo ROOT   6.08/07
Reference Guide
httpaccess.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_http
3 /// This program demonstrates access control to the THttpServer with digest methods.
4 /// Authentication file auth.txt was generated with following shell commands:
5 /// ~~~
6 /// [shell] htdigest -c auth.txt root guest
7 /// typing <empty> password for guest account
8 /// [shell] htdigest auth.txt root admin
9 /// typing 'admin' as password for admin account
10 /// ~~~
11 /// When macro started and opening in browser with url
12 /// ~~~
13 /// http://localhost:8080
14 /// ~~~
15 /// User name and password will be requested. One should
16 /// either specify guest account without password or
17 /// admin account with password 'admin'
18 ///
19 /// User with guest account only can monitor histograms
20 /// User with admin account see commands, which can be executed
21 ///
22 /// \macro_code
23 ///
24 /// \author
25 
26 #include "TH1.h"
27 #include "TH2.h"
28 #include "TRandom3.h"
29 #include "TSystem.h"
30 #include "THttpServer.h"
31 
32 void httpaccess()
33 {
34  // create histograms
35  TH1D *hpx = new TH1D("hpx","This is the px distribution",100,-4,4);
36  hpx->SetFillColor(48);
37  hpx->SetDirectory(0);
38  TH2D *hpxpy = new TH2D("hpxpy","py vs px",40,-4,4,40,-4,4);
39  hpxpy->SetDirectory(0);
40 
41  if (gSystem->AccessPathName("auth.txt")!=0) {
42  printf("Please start macro from directory where auth.txt file is available\n");
43  printf("It required to supply authentication information for the http server\n");
44  return;
45  }
46 
47  // start http server
48  THttpServer* serv = new THttpServer("http:8080?auth_file=auth.txt&auth_domain=root");
49 
50  // or start FastCGI server, where host server (like Apache or lighttpd) should enable own authentication
51  // for apache one should add correspondent module and authentication for fastcgi location
52  // for lighttpd one add following lines to configuration file:
53  // server.modules += ( "mod_auth" )
54  // auth.backend = "htdigest"
55  // auth.backend.htdigest.userfile = "/srv/auth/auth.txt"
56  // auth.require = ( "/root.app" => ( "method" => "digest", "realm" => "root", "require" => "valid-user" ))
57  // THttpServer* serv = new THttpServer("fastcgi:9000");
58 
59  // One could specify location of newer version of JSROOT
60  // serv->SetJSROOT("https://root.cern.ch/js/latest/");
61  // serv->SetJSROOT("http://jsroot.gsi.de/latest/");
62 
63  // register histograms
64  serv->Register("/", hpx);
65  serv->Register("/", hpxpy);
66 
67  // register commands, invoking object methods
68  serv->RegisterCommand("/ResetHPX","/hpx/->Reset();", "button;rootsys/icons/ed_delete.png");
69  serv->SetItemField("/ResetHPX","_update_item", "hpx"); // let browser update histogram view after commands execution
70  serv->RegisterCommand("/ResetHPXPY","/hpxpy/->Reset();", "button;rootsys/icons/bld_delete.png");
71  serv->SetItemField("/ResetHPXPY","_update_item", "hpxpy"); // let browser update histogram view after commands execution
72  // here also example how command with arguments can be invoked
73  serv->RegisterCommand("/RebinHPX","/hpx/->Rebin(%arg1%);", "button;rootsys/icons/ed_execute.png");
74  serv->SetItemField("/RebinHPX","_update_item", "hpx"); // let browser update histogram view after commands execution
75 
76  // these two commands fully hidden for other accounts,
77  // only admin can see and execute these commands
78  serv->Restrict("/ResetHPX", "visible=admin");
79  serv->Restrict("/ResetHPXPY", "visible=admin");
80 
81  // this command visible for other, but will be refused (return false)
82  // when executed from any other account
83  serv->Restrict("/RebinHPX", "allow=admin");
84 
85  // Fill histograms randomly
86  TRandom3 random;
87  Float_t px, py;
88  const Long_t kUPDATE = 1000;
89  Long_t cnt = 0;
90  while (kTRUE) {
91  random.Rannor(px,py);
92  hpx->Fill(px);
93  hpxpy->Fill(px,py);
94 
95  // IMPORTANT: one should regularly call ProcessEvents
96  if (cnt++ % kUPDATE == 0) {
97  if (gSystem->ProcessEvents()) break;
98  }
99  }
100 }
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
Definition: TSystem.cxx:1266
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition: TH1.cxx:3125
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
Definition: TSystem.cxx:421
virtual void Rannor(Float_t &a, Float_t &b)
Return 2 numbers distributed following a gaussian with mean=0 and sigma=1.
Definition: TRandom.cxx:460
Random number generator class based on M.
Definition: TRandom3.h:29
float Float_t
Definition: RtypesCore.h:53
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
Definition: TH1.cxx:8051
Bool_t Register(const char *subfolder, TObject *obj)
Register object in subfolder.
R__EXTERN TSystem * gSystem
Definition: TSystem.h:549
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition: TAttFill.h:42
tomato 1-D histogram with a double per channel (see TH1 documentation)}
Definition: TH1.h:618
long Long_t
Definition: RtypesCore.h:50
THist< 2, double, THistStatContent, THistStatUncertainty > TH2D
Definition: THist.hxx:307
Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon=0)
Register command which can be executed from web interface.
THist< 1, double, THistStatContent, THistStatUncertainty > TH1D
Definition: THist.hxx:301
const Bool_t kTRUE
Definition: Rtypes.h:91
Int_t Fill(Double_t)
Invalid Fill method.
Definition: TH2.cxx:292
Bool_t SetItemField(const char *fullname, const char *name, const char *value)
void Restrict(const char *path, const char *options)
Restrict access to specified object.
const char * cnt
Definition: TXMLSetup.cxx:75
tomato 2-D histogram with a double per channel (see TH1 documentation)}
Definition: TH2.h:296