1 | #!/moira/bin/perl -Tw |
---|
2 | |
---|
3 | # $Id: ca.gen 4113 2013-05-28 14:29:10Z zacheiss $ |
---|
4 | |
---|
5 | # The following exit codes are defined and MUST BE CONSISTENT with the |
---|
6 | # error codes the library uses: |
---|
7 | $MR_DBMS_ERR = 47836421; |
---|
8 | $MR_OCONFIG = 47836460; |
---|
9 | |
---|
10 | $outfile = '/moira/dcm/ca.out'; |
---|
11 | |
---|
12 | use DBI; |
---|
13 | $dbh = DBI->connect("dbi:Oracle:moira", "moira", "moira") |
---|
14 | || exit $MR_DBMS_ERR; |
---|
15 | |
---|
16 | # First, let's do people with NFS homedirs, since it's not hard. |
---|
17 | $sth = $dbh->prepare("SELECT n.nfsphys_id, n.dir, m.name ". |
---|
18 | "FROM nfsphys n, machine m ". |
---|
19 | "WHERE m.mach_id = n.mach_id ". |
---|
20 | "ORDER BY n.nfsphys_id") || exit $MR_DBMS_ERR; |
---|
21 | |
---|
22 | $sth->execute || exit $MR_DBMS_ERR; |
---|
23 | |
---|
24 | umask 022; |
---|
25 | open(OUT, ">$outfile") || exit $MR_OCONFIG; |
---|
26 | |
---|
27 | while (($id, $dir, $machname) = $sth->fetchrow_array) { |
---|
28 | next if ($id == 0); |
---|
29 | $foo = $dbh->prepare("SELECT u.login, u.fullname ". |
---|
30 | "FROM users u, filesys f ". |
---|
31 | "WHERE f.label = u.login AND ". |
---|
32 | "(u.status = 1 OR u.status = 10 OR u.status = 11) ". |
---|
33 | "AND f.phys_id = " . $dbh->quote($id)); |
---|
34 | $first = 1; |
---|
35 | $foo->execute || exit $MR_DBMS_ERR; |
---|
36 | while (($login, $fullname) = $foo->fetchrow_array) { |
---|
37 | if ($first) { |
---|
38 | $first = 0; |
---|
39 | $row = "*$machname:$dir\n"; |
---|
40 | $row =~ s/\0//g; |
---|
41 | print OUT $row; |
---|
42 | } |
---|
43 | $row = "$login,$fullname\n"; |
---|
44 | $row =~ s/\0//g; |
---|
45 | print OUT $row; |
---|
46 | } |
---|
47 | } |
---|
48 | |
---|
49 | #Now, let's do all the AFS homedirs. This will take a while longer. |
---|
50 | $sth = $dbh->prepare("SELECT UNIQUE u.login, u.fullname, f.name ". |
---|
51 | "FROM users u, filesys f ". |
---|
52 | "WHERE f.label = u.login AND ". |
---|
53 | "(u.status = 1 OR u.status = 10 OR u.status = 11) ". |
---|
54 | "AND f.type = 'AFS' ". |
---|
55 | "ORDER BY u.login") || exit $MR_DBMS_ERR; |
---|
56 | |
---|
57 | $sth->execute || exit $MR_DBMS_ERR; |
---|
58 | |
---|
59 | $last = ""; |
---|
60 | while (($login, $name, $dir) = $sth->fetchrow_array) { |
---|
61 | $dir =~ /(\/.*)\//; |
---|
62 | $path = $1; |
---|
63 | if ($path ne $last) { |
---|
64 | $last = $path; |
---|
65 | $row = "*AFS:$path\n"; |
---|
66 | $row =~ s/\0//g; |
---|
67 | print OUT $row; |
---|
68 | } |
---|
69 | $row = "$login,$name\n"; |
---|
70 | $row =~ s/\0//g; |
---|
71 | print OUT $row; |
---|
72 | } |
---|
73 | |
---|
74 | close(OUT); |
---|
75 | $dbh->disconnect; |
---|
76 | |
---|
77 | exit 0; |
---|