]> git.sur5r.net Git - bacula/docs/blob - docs/manual/python.tex
Updates
[bacula/docs] / docs / manual / python.tex
1 %%
2 %%
3
4 \section*{Python Scripting}
5 \label{_ChapterStart60}
6 \index[general]{Python Scripting}
7 \index[general]{Scripting!Python}
8 \addcontentsline{toc}{section}{Python Scripting}
9
10 You may be asking what Python is and why a scripting language is
11 needed in Bacula. The answer to the first question is that Python
12 is an Object Oriented scripting language with features similar
13 to those found in Perl, but the syntax of the language is much
14 cleaner and simpler.  The answer to why have scripting in Bacula is to
15 give the user more control over the whole backup process. Probably 
16 the simplest example is when Bacula needs a new Volume name, with
17 a scripting language such as Python, you can generate any name 
18 you want, based on the current state of Bacula.
19
20 \subsection*{Python Configuration}
21 \index[general]{Python Configuration}
22 \index[general]{Configuration!Python}
23 \addcontentsline{toc}{subsection}{Python Configuration}
24
25 Python must be enabled during the configuration process by adding
26 a \verb:--:with-python, and possibly specifying an alternate
27 directory if your Python is not installed in a standard system
28 location. If you are using RPMs you will need the python-devel package
29 installed.
30
31 When Python is configured, it becomes an integral part of Bacula and
32 runs in Bacula's address space, so even though it is an interpreted 
33 language, it is very efficient.
34
35 When the Director starts, it looks to see if you have a {\bf
36 Scripts Directory} Directive defined, if so, it looks in that directory for
37 a file named {\bf DirStartUp.py}. If it is found, Bacula will pass this
38 file to Python for execution. The {\bf Scripts Directory} is a new
39 directive that you add to the Director resource of your bacula-dir.conf
40 file.
41
42 \subsection*{Bacula Events}
43 \index[general]{Bacula Events}
44 \index[general]{Events}
45 \addcontentsline{toc}{subsection}{Bacula Events}
46 A Bacula event is a point in the Bacula code where Bacula
47 will call a subroutine (actually a method) that you have 
48 defined in the Python StartUp script. Events correspond 
49 to some significant event such as a Job Start, a Job End,
50 Bacula needs a new Volume Name, ... When your script is
51 called, it will have access to all the Bacula variables
52 specific to the Job (attributes of the Job Object), and
53 it can even call some of the Job methods (subroutines)
54 or set new values in the Job attributes, such as the 
55 Priority. You will see below how the events are used.
56
57 \subsection*{Python Objects}
58 \index[general]{Python Objects}
59 \index[general]{Objects!Python}
60 \addcontentsline{toc}{subsection}{Python Objects}
61
62 There are four Python objects that you will need to work with:
63 \begin{description}
64 \item [The Bacula Object]
65    The Bacula object is created by the Bacula daemon (the Director
66    in the present case) when the daemon starts. It is available to
67    the Python startup script, {\bf DirStartup.py}, by importing the
68    Bacula definitions with {\bf import bacula}. The methods
69    available with this object are described below. 
70
71 \item [The Bacula Events Class]
72    You create this class in the startup script, and you pass
73    it to the Bacula Object's {\bf set\_events} method. The 
74    purpose of the Bacula Events Class is to define what global
75    or daemon events you want to monitor. When one of those events
76    occurs, your Bacula Events Class will be called at the method
77    corresponding to the event. There are currently three events,
78    JobStart, JobEnd, and Exit, which are described in detail below.
79    
80 \item [The Job Object]
81    When a Job starts, and assuming you have defined a JobStart method
82    in your Bacula Events Class, Bacula will create a Job Object. This
83    object will be passed to the JobStart event. The Job Object has a
84    has good number of read-only members or attributes providing many
85    details of the Job, and it also has a number of writable attributes
86    that allow you to pass information into the Job.  These attributes
87    are described below.
88    
89 \item [The Job Events Class]
90    You create this class in the JobStart method of your Bacula Events
91    class, and it allows you to define which of the possible Job Object
92    events you want to see. You must pass an instance of your Job Events
93    class to the Job Object set\_events() method.
94    Normally, you will probably only have one
95    Job Events Class, which will be instantiated for each Job. However,
96    if you wish to see different events in different Jobs, you may have
97    as many Job Events classes as you wish.
98 \end{description}
99
100
101 The first thing the startup script must do is to define what global Bacula
102 events (daemon events), it wants to see. This is done by creating a 
103 Bacula Events class, instantiating it, then passing it to the 
104 {\bf set\_events} method. There are three possible
105 events.
106
107 \begin{description}
108 \item [JobStart]
109    \index[dir]{JobStart}
110    This Python method, if defined, will be called each time a Job is started.
111    The method is passed the class instantiation object as the first argument,
112    and the Bacula Job object as the second argument.  The Bacula Job object
113    has several built-in methods, and you can define which ones you
114    want called. If you do not define this method, you will not be able
115    to interact with Bacula jobs.
116
117 \item [JobEnd]
118    This Python method, if defined, will be called each time a Job terminates.
119    The method is passed the class instantiation object as the first argument,
120    and the Bacula Job object as the second argument.  
121
122 \item [Exit]
123    This Python method, if defined, will be called when the Director terminates.
124    The method is passed the class instantiation object as the first argument.
125 \end{description}
126
127 Access to the Bacula variables and methods is done with:
128
129      import bacula
130
131 The following are the read-only attributes provided by the bacula object.
132 \begin{description}
133 \item [Name]
134 \item [ConfigFile]
135 \item [WorkingDir]
136 \item [Version] string consisting of "Version  Build-date"
137 \end{description}
138
139
140 A simple definition of the Bacula Events Class might be the following:
141
142 \footnotesize
143 \begin{verbatim}
144 import sys, bacula
145 class BaculaEvents:
146   def JobStart(self, job):
147      ...
148 \end{verbatim}
149 \normalsize
150
151 Then to instantiate the class and pass it to Bacula, you
152 would do:
153
154 \footnotesize
155 \begin{verbatim}
156 bacula.set_events(BaculaEvents()) # register Bacula Events wanted
157 \end{verbatim}
158 \normalsize
159
160 And at that point, each time a Job is started, your BaculaEvents JobStart
161 method will be called.
162
163 Now to actually do anything with a Job, you must define which Job events
164 you want to see, and this is done by defining a JobEvents class containing
165 the methods you want called.  Each method name corresponds to one of the
166 Job Events that Bacula will generate.
167
168 A simple Job Events class might look like the following:
169
170 \footnotesize
171 \begin{verbatim}
172 class JobEvents:
173   def NewVolume(self, job):
174      ...
175 \end{verbatim}
176 \normalsize
177
178 Here, your JobEvents class method NewVolume will be called each time
179 the Job needs a new Volume name.  To actually register the events defined
180 in your class with the Job, you must instantiate the JobEvents class and
181 set it in the Job {\bf set\_events} variable. Note, this is a bit different 
182 from how you registered the Bacula events. The registration process must
183 be done in the Bacula JobStart event (your method).  So, you would modify 
184 Bacula Events (not the Job events) as follows:
185
186 \footnotesize
187 \begin{verbatim}
188 import sys, bacula
189 class BaculaEvents:
190   def JobStart(self, job):
191      events = JobEvents()         # create instance of Job class
192      job.set_events(events)       # register Job events desired
193      ...
194 \end{verbatim}
195 \normalsize
196
197 The following are the methods (subroutines) provided within the
198 directory by the {\bf job} object.
199 \begin{description}
200 \item [set\_events] The set\_events takes a single
201    argument, which is the instantation of the Job Events class
202    that contains the methods that you want called. The method
203    names that will be called must correspond to the Bacula
204    defined events. You may define additional methods but Bacula
205    will not use them.
206 \item [run] The run method takes a single string
207    argument, which is the run command (same as in the Console)
208    that you want to submit to start a new Job. The value
209    returned by the run method is the JobId of the job that
210    started, or -1 if there was an error.
211 \item [write] The write method is used to be able to send
212    print output to the Job Report. This will be described later.
213 \item [DoesVolumeExist] The DoesVolumeExist takes a single
214    string argument, which is the Volume name, and returns 
215    1 if the volume exists in the Catalog and 0 if the volume
216    does not exist.
217 \end{description}
218
219 The following attributes are read/write within the Director 
220 for the {\bf job} object.
221
222 \begin{description}
223 \item [Priority] Read or set the Job priority.
224 Note, that setting a Job Priority is effective only before
225 the Job actually starts.  (not functional yet)
226 \end{description}
227
228 The following read-only attributes are available within the Director
229 for the {\bf job} object.
230
231 \begin{description}
232 \item [Level]
233 \item [Type]
234 \item [JobId]
235 \item [Client]
236 \item [NumVols]
237 \item [Pool]
238 \item [Storage]
239 \item [Catalog]
240 \item [MediaType]
241 \item [JobName]
242 \item [JobStatus]
243 \item [CatalogRes] tuple consisting of (DBName, Address, User,
244   Password, Socket, Port, Database Vendor) taken from the Catalog resource 
245    for the Job with the exception of Database Vendor, which is
246    one of the following: MySQL, PostgreSQL, SQLite, Internal,
247    depending on what database you configured.
248 \end{description}
249
250 The following write-only attributes are available within the
251 Director:
252
253 \begin{description}
254 \item [JobReport] Send line to the Job Report.
255 \item [VolumeName] Set a new Volume name. Valid only during the
256    NewVolume event.
257 \end{description}
258
259 \subsection*{Python Console Command}
260 \index[general]{Python Console Command}
261 \index[general]{Console Command!Python}
262 \addcontentsline{toc}{subsection}{Python Console Command}
263
264 There is a new Console command named {\bf python}. It takes
265 a single argument {\bf restart}. Example:
266 \begin{verbatim}
267   python restart
268 \end{verbatim}
269
270 This command restarts the Python interpreter in the Director.
271 This can be useful when you are modifying the DirStartUp script,
272 because normally Python will cache it, and thus the
273 script will be read one time.
274
275
276 \subsection*{Python Example}
277 \index[general]{Python Example}
278 \index[general]{Example!Python}
279 \addcontentsline{toc}{subsection}{Python Example}
280
281 An example script for the Director startup file is provided in
282 {\bf examples/python/DirStartup.py} as follows:
283
284 \footnotesize
285 \begin{verbatim}
286 #
287 # Bacula Python interface script for the Director
288 #
289
290 # You must import both sys and bacula
291 import sys, bacula
292
293 # This is the list of Bacula daemon events that you
294 #  can receive.
295 class BaculaEvents:
296   def __init__(self):
297      # Called here when a new Bacula Events class is
298      #  is created. Normally not used 
299      noop = 1
300
301   def JobStart(self, job):
302      """
303        Called here when a new job is started. If you want
304        to do anything with the Job, you must register
305        events you want to receive.
306      """
307      events = JobEvents()         # create instance of Job class
308      events.job = job             # save Bacula's job pointer
309      job.set_events(events)       # register events desired
310      sys.stderr = events          # send error output to Bacula
311      sys.stdout = events          # send stdout to Bacula
312      jobid = job.JobId; client = job.Client
313      numvols = job.NumVols 
314      job.JobReport="Python Dir JobStart: JobId=%d Client=%s NumVols=%d\n" % (jobid,client,numvols) 
315
316   # Bacula Job is going to terminate
317   def JobEnd(self, job):    
318      jobid = job.JobId
319      client = job.Client 
320      job.JobReport="Python Dir JobEnd output: JobId=%d Client=%s.\n" % (jobid, client) 
321
322   # Called here when the Bacula daemon is going to exit
323   def Exit(self, job):
324       print "Daemon exiting."
325      
326 bacula.set_events(BaculaEvents()) # register daemon events desired
327
328 """
329   These are the Job events that you can receive.
330 """
331 class JobEvents:
332   def __init__(self):
333      # Called here when you instantiate the Job. Not
334      # normally used
335      noop = 1
336      
337   def JobInit:
338      # Called when the job is first scheduled
339      noop = 1
340      
341   def JobRun:
342      # Called just before running the job after initializing
343      #  This is the point to change most Job parameters.
344      #  It is equivalent to the JobRunBefore point.
345      noop = 1
346
347   def NewVolume(self, job):
348      jobid = job.JobId
349      client = job.Client 
350      numvol = job.NumVols
351      volname = "TestA-001"
352      job.JobReport = "JobId=%d Client=%s NumVols=%d VolumeName=%s" % (jobid, client, numvol,volname)
353      job.JobReport="Python before New Volume set for Job.\n"
354      job.VolumeName=volname
355
356
357 \end{verbatim}
358 \normalsize