/gforge/deb-specific/group_dump_update.pl

https://github.com/neymanna/fusionforge · Perl · 204 lines · 132 code · 39 blank · 33 comment · 20 complexity · c8815d6c3b0438163c8584b072b06c55 MD5 · raw file

  1. #!/usr/bin/perl
  2. #
  3. # $Id$
  4. #
  5. # dump_database.pl - script to dump data from the database to flat files so the ofher perl
  6. # scripts can process it without needing to access the database.
  7. use DBI;
  8. # Run as gforge
  9. my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam("gforge");
  10. $> = $uid;
  11. require("/usr/lib/gforge/lib/include.pl"); # Include all the predefined functions
  12. my $verbose = 0;
  13. my $user_array = ();
  14. my $group_array = ();
  15. my $gid_add = 10000 ;
  16. &db_connect;
  17. # Dump the Groups Table information
  18. $query = "select group_id,group_id+".$gid_add.",unix_group_name,status,is_public from groups";
  19. $c = $dbh->prepare($query);
  20. $c->execute();
  21. while(my ($group_id, $unix_gid, $group_name, $status, $is_public) = $c->fetchrow()) {
  22. my $new_query = "select users.user_name AS user_name FROM users,user_group WHERE users.user_id=user_group.user_id AND group_id=$group_id";
  23. my $d = $dbh->prepare($new_query);
  24. $d->execute();
  25. my $user_list = "";
  26. while($user_name = $d->fetchrow()) {
  27. $user_list .= "$user_name,";
  28. }
  29. $grouplist = "$group_name:$status:$unix_gid:$is_public:$user_list\n";
  30. $grouplist =~ s/,$//;
  31. push @group_array, $grouplist;
  32. }
  33. # Run as root
  34. $> = 0;
  35. # Now write out the files
  36. write_array_file($file_dir."/dumps/group_dump", @group_array);
  37. system("chmod o-r,g-r $file_dir/dumps/group_dump");
  38. my $group_file = $file_dir . "/dumps/group_dump";
  39. my ($gname, $gstatus, $gid, $is_public, $userlist);
  40. # Open up all the files that we need.
  41. @groupdump_array = open_array_file($group_file);
  42. #
  43. # Loop through @groupdump_array and deal w/ users.
  44. #
  45. if($verbose) {print ("\n\n Processing Groups\n\n")};
  46. while ($ln = pop(@groupdump_array)) {
  47. chop($ln);
  48. ($gname, $gstatus, $gid, $is_public, $userlist) = split(":", $ln);
  49. $userlist =~ tr/A-Z/a-z/;
  50. $group_exists = (-d $grpdir_prefix .'/'. $gname);
  51. if ($gstatus eq 'A' && $group_exists) {
  52. update_group($gid, $gname, $is_public, $userlist);
  53. } elsif ($gstatus eq 'A' && !$group_exists) {
  54. add_group($gid, $gname, $is_public, $userlist);
  55. } elsif ($gstatus eq 'D' && $group_exists) {
  56. delete_group($gname);
  57. }
  58. }
  59. ###############################################
  60. # Begin functions
  61. ###############################################
  62. #############################
  63. # Group Add Function
  64. #############################
  65. sub add_group {
  66. my ($gid, $gname, $is_public, $userlist) = @_;
  67. my ($log_dir, $cgi_dir, $ht_dir);
  68. my ($default_perms) ;
  69. my ($file_default_perms) ;
  70. my ($default_page) ;
  71. $group_dir = $grpdir_prefix."/".$gname;
  72. $log_dir = $group_dir."/log";
  73. $cgi_dir = $group_dir."/cgi-bin";
  74. $ht_dir = $group_dir."/htdocs";
  75. if ($is_public) {
  76. $default_perms = 2775 ;
  77. $file_default_perms = 664;
  78. $default_page = "/usr/lib/gforge/lib/default_page.php" ;
  79. } else {
  80. $default_perms = 2770 ;
  81. $file_default_perms = 660;
  82. $default_page = "/usr/lib/gforge/lib/private_default_page.php" ;
  83. }
  84. if ($verbose) {print("Making a Group for : $gname\n")};
  85. mkdir $group_dir, $default_perms ;
  86. mkdir $log_dir, $default_perms ;
  87. mkdir $cgi_dir, $default_perms ;
  88. mkdir $ht_dir, $default_perms ;
  89. system("cp $default_page $ht_dir/index.php");
  90. # perl is sometime fucked to create with right permission
  91. system("chmod $default_perms $group_dir");
  92. system("chmod $default_perms $log_dir");
  93. system("chmod $default_perms $cgi_dir");
  94. system("chmod $default_perms $ht_dir");
  95. system("chmod $file_default_perms $ht_dir/index.php");
  96. chown $dummy_uid, $gid, ($group_dir, $log_dir, $cgi_dir, $ht_dir);
  97. chown $dummy_uid, $gid, ("$ht_dir/index.php");
  98. }
  99. #############################
  100. # Group Update Function
  101. #############################
  102. sub update_group {
  103. my ($gid, $gname, $is_public, $userlist) = @_;
  104. my ($log_dir, $cgi_dir, $ht_dir);
  105. my ($realuid, $realgid);
  106. my ($default_perms);
  107. $group_dir = $grpdir_prefix.'/'.$gname;
  108. $log_dir = $group_dir."/log";
  109. $cgi_dir = $group_dir."/cgi-bin";
  110. $ht_dir = $group_dir."/htdocs";
  111. if ($is_public) {
  112. $default_perms = 2775 ;
  113. } else {
  114. $default_perms = 2771 ;
  115. }
  116. if ($verbose) {print("Updating Group: $gname\n")};
  117. system("chmod $default_perms $group_dir");
  118. system("chmod $default_perms $log_dir");
  119. system("chmod $default_perms $cgi_dir");
  120. system("chmod $default_perms $ht_dir");
  121. chown $dummy_uid, $gid, ($group_dir, $log_dir, $cgi_dir, $ht_dir);
  122. my $realuid=get_file_owner_uid($group_dir);
  123. if ($dummy_uid eq $realuid){
  124. system("chown $dummy_uid $group_dir");
  125. } else {
  126. if($verbose){print("Changing owner of $group_dir $realuid -> $dummy_uid\n")};
  127. system("chown -R $dummy_uid $group_dir");
  128. }
  129. my $realgid=get_file_owner_gid($group_dir);
  130. if ($gid eq $realgid){
  131. system("chgrp $gid $group_dir");
  132. } else {
  133. if($verbose){print("Changing group of $group_dir $realgid -> $gid\n")};
  134. system("chgrp -R $gid $group_dir");
  135. }
  136. }
  137. #############################
  138. # Group Delete Function
  139. #############################
  140. sub delete_group {
  141. my ($gname, $x, $gid, $userlist, $counter);
  142. my $this_group = shift(@_);
  143. $counter = 0;
  144. if (substr($hostname,0,3) ne "cvs") {
  145. if ($verbose) {print("Deleting Group: $this_group\n")};
  146. system("/bin/mv /var/lib/gforge/chroot/home/groups/$this_group /var/lib/gforge/chroot/home/groups/deleted_group_$this_group");
  147. system("/bin/tar -czf /var/lib/gforge/tmp/$this_group.tar.gz /var/lib/gforge/chroot/home/groups/deleted_group_$this_group && /bin/rm -rf /var/lib/gforge/chroot/home/groups/deleted_group_$this_group");
  148. }
  149. }
  150. #############################
  151. # Get File Owner UID
  152. #############################
  153. sub get_file_owner_uid {
  154. my $filename = shift(@_);
  155. my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
  156. return $uid;
  157. }
  158. #############################
  159. # Get File Owner GID
  160. #############################
  161. sub get_file_owner_gid {
  162. my $filename = shift(@_);
  163. my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
  164. return $gid;
  165. }