1 | #!/usr/bin/env python
|
---|
2 |
|
---|
3 | # get client properties for bacula
|
---|
4 |
|
---|
5 | import logging
|
---|
6 | import subprocess
|
---|
7 | import time
|
---|
8 | import json
|
---|
9 | from pprint import pprint
|
---|
10 |
|
---|
11 | opsi={
|
---|
12 | 'server': "https://opsi.joergs.dass-it:4447/rpc",
|
---|
13 | 'username': "joergs",
|
---|
14 | 'password': "linuxlinux",
|
---|
15 | }
|
---|
16 |
|
---|
17 | catalog="MyCatalog"
|
---|
18 |
|
---|
19 | # "-d"
|
---|
20 | opsiCallPrefix=[ "opsi-admin", "-a", opsi['server'], "-u", opsi['username'], "-p", opsi['password'] ]
|
---|
21 |
|
---|
22 | opsiCallClientsWithBacula=[ "method", "productOnClient_getObjects", "[]", '{"productId":"bacula", "installationStatus": "installed"}']
|
---|
23 |
|
---|
24 | opsiCallClientBaculaProperties=[ "method", "getProductProperties_hash", "bacula" ]
|
---|
25 |
|
---|
26 |
|
---|
27 | def write_client_conf( fd, client, properties ):
|
---|
28 | #Client {
|
---|
29 | #Name = ting-fd
|
---|
30 | #Address = ting.dass-it
|
---|
31 | #FDPort = 9102
|
---|
32 | #Catalog = MyCatalog
|
---|
33 | #Password = "D5w2V5w6B8a9H5Z"
|
---|
34 | #File Retention = 6 months
|
---|
35 | #Job Retention = 6 months
|
---|
36 | #AutoPrune = yes
|
---|
37 | #}
|
---|
38 | params = [ "FDPort", "FileRetention", "JobRetention", "AutoPrune" ]
|
---|
39 | fd.write( "Client {\n" )
|
---|
40 | fd.write( ' Name = "' + properties['filedaemon_full_name'] + '"' + "\n" )
|
---|
41 | fd.write( ' Address = "' + client['clientId'] + '"' + "\n" )
|
---|
42 | # ipAddress: method host_getObjects [] '{"id":client['clientId']}'
|
---|
43 | #print " # Address =", ipAddress
|
---|
44 | fd.write( ' Password = "' + properties['filedaemon_full_password'] + '"' + "\n" )
|
---|
45 | fd.write( ' Catalog = "' + properties['catalog'] + '"' + "\n" )
|
---|
46 | for i in params:
|
---|
47 | try:
|
---|
48 | fd.write( ' ' + i + ' = "' + properties[i.lower()] + '"' + "\n" )
|
---|
49 | except KeyError:
|
---|
50 | fd.write( ' # ' + i + " = \n" )
|
---|
51 | fd.write( "}\n")
|
---|
52 | fd.write( "\n" )
|
---|
53 |
|
---|
54 |
|
---|
55 |
|
---|
56 |
|
---|
57 | def write_job_conf( fd, client, properties ):
|
---|
58 | #Job {
|
---|
59 | #FileSet = "tingfileset"
|
---|
60 | #Name = "ting"
|
---|
61 | #Client = ting-fd
|
---|
62 | #JobDefs = "LaptopJob"
|
---|
63 | ## Write Bootstrap = "/var/lib/bacula/ting.bsr"
|
---|
64 | #}
|
---|
65 | params = [ "Fileset", "JobDefs" ]
|
---|
66 | fd.write( "Job {" + "\n" )
|
---|
67 | fd.write( ' Name = "' + client['clientId'] + '-job"' + "\n" )
|
---|
68 | fd.write( ' Client = "' + properties['filedaemon_full_name'] + '"' + "\n" )
|
---|
69 | for i in params:
|
---|
70 | fd.write( " " )
|
---|
71 | try:
|
---|
72 | if not properties[i.lower()]:
|
---|
73 | fd.write( "# " )
|
---|
74 | fd.write( i + ' = "' + properties[i.lower()] + '"' + "\n" )
|
---|
75 | except KeyError:
|
---|
76 | fd.write( "# " + i + " = " + "\n" )
|
---|
77 | fd.write( "}" + "\n" )
|
---|
78 | fd.write( "\n" )
|
---|
79 |
|
---|
80 | #
|
---|
81 | # main
|
---|
82 | #
|
---|
83 |
|
---|
84 | #logging.basicConfig(format='%(asctime)s %(levelname)8s %(message)s')
|
---|
85 | logging.basicConfig(format='%(message)s')
|
---|
86 | logger = logging.getLogger(__name__)
|
---|
87 | #logger.setLevel(logging.INFO)
|
---|
88 | logger.setLevel(logging.DEBUG)
|
---|
89 |
|
---|
90 | logger.debug( "start" )
|
---|
91 |
|
---|
92 | try:
|
---|
93 | clientsWithBacula=json.loads( subprocess.check_output( opsiCallPrefix + opsiCallClientsWithBacula ) )
|
---|
94 | #except subprocess.CalledProcessError as e:
|
---|
95 | except BaseException as e:
|
---|
96 | logger.exception( "failed: %s" %(e) )
|
---|
97 | exit(1)
|
---|
98 |
|
---|
99 | #pprint( clientsWithBacula )
|
---|
100 |
|
---|
101 | if clientsWithBacula:
|
---|
102 | try:
|
---|
103 | file_opsi_clients = open('opsi-clients-generated.conf', 'w')
|
---|
104 | file_opsi_clients.write( "#\n" )
|
---|
105 | file_opsi_clients.write( "# automatically generated at {}\n".format( time.asctime() ) )
|
---|
106 | file_opsi_clients.write( "#\n\n" )
|
---|
107 |
|
---|
108 | file_opsi_jobs = open('opsi-jobs-generated.conf', 'w')
|
---|
109 | file_opsi_jobs.write( "#\n" )
|
---|
110 | file_opsi_jobs.write( "# automatically generated at {}\n".format( time.asctime() ) )
|
---|
111 | file_opsi_jobs.write( "#\n\n" )
|
---|
112 | except BaseException as e:
|
---|
113 | logger.exception( "failed to create files" )
|
---|
114 | exit(1)
|
---|
115 |
|
---|
116 | for client in clientsWithBacula:
|
---|
117 | clientId = client['clientId']
|
---|
118 |
|
---|
119 | try:
|
---|
120 | clientBaculaProperties=json.loads( subprocess.check_output( opsiCallPrefix + opsiCallClientBaculaProperties + [ client['clientId'] ] ) )
|
---|
121 | except ValueError as e:
|
---|
122 | logger.warn( "%s: no valid information found: %s" %(clientId, e) )
|
---|
123 | except subprocess.CalledProcessError as e:
|
---|
124 | logger.exception( "%s: failed:" %(clientId) )
|
---|
125 | #exit( 1 )
|
---|
126 | else:
|
---|
127 | #pprint( clientBaculaProperties )
|
---|
128 | write_client_conf( file_opsi_clients, client, clientBaculaProperties )
|
---|
129 | write_job_conf( file_opsi_jobs, client, clientBaculaProperties )
|
---|
130 | logger.info( "%s: OK" % clientId )
|
---|
131 |
|
---|
132 | logger.debug( "finished" )
|
---|