3 # dump_database.pl - script to dump data from the database to flat files so the ofher perl
4 # scripts can process it without needing to access the database.
7 require("/usr/share/gforge/lib/include.pl"); # Include all the predefined functions
10 my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam("gforge");
20 # Dump the Groups Table information
21 $query = "select group_id,group_id+".$gid_add.",unix_group_name,status,is_public from groups";
22 $c = $dbh->prepare($query);
25 while(my ($group_id, $unix_gid, $group_name, $status, $is_public) = $c->fetchrow()) {
27 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";
28 my $d = $dbh->prepare($new_query);
33 while($user_name = $d->fetchrow()) {
34 $user_list .= "$user_name,";
37 $grouplist = "$group_name:$status:$unix_gid:$is_public:$user_list\n";
40 push @group_array, $grouplist;
46 # Now write out the files
47 write_array_file($file_dir."/dumps/group_dump", @group_array);
48 system("chmod o-r,g-r $file_dir/dumps/group_dump");
50 my $group_file = $file_dir . "/dumps/group_dump";
51 my ($gname, $gstatus, $gid, $is_public, $userlist);
53 # Open up all the files that we need.
54 @groupdump_array = open_array_file($group_file);
57 # Loop through @groupdump_array and deal w/ users.
59 if($verbose) {print ("\n\n Processing Groups\n\n")};
60 while ($ln = pop(@groupdump_array)) {
62 ($gname, $gstatus, $gid, $is_public, $userlist) = split(":", $ln);
64 $userlist =~ tr/A-Z/a-z/;
66 $group_exists = (-d $grpdir_prefix .'/'. $gname);
68 if ($gstatus eq 'A' && $group_exists) {
69 update_group($gid, $gname, $is_public, $userlist);
71 } elsif ($gstatus eq 'A' && !$group_exists) {
72 add_group($gid, $gname, $is_public, $userlist);
74 } elsif ($gstatus eq 'D' && $group_exists) {
80 ###############################################
82 ###############################################
84 #############################
86 #############################
88 my ($gid, $gname, $is_public, $userlist) = @_;
89 my ($log_dir, $cgi_dir, $ht_dir);
92 my ($file_default_perms) ;
95 $group_dir = $grpdir_prefix."/".$gname;
96 $log_dir = $group_dir."/log";
97 $cgi_dir = $group_dir."/cgi-bin";
98 $ht_dir = $group_dir."/htdocs";
99 $inc_dir = $group_dir."/incoming";
102 $default_perms = 2775 ;
103 $file_default_perms = 664;
104 $default_page = "/usr/share/gforge/lib/default_page.php" ;
106 $default_perms = 2770 ;
107 $file_default_perms = 660;
108 $default_page = "/usr/share/gforge/lib/private_default_page.php" ;
111 if ($verbose) {print("Making a Group for : $gname\n")};
113 mkdir $group_dir, $default_perms ;
114 mkdir $log_dir, $default_perms ;
115 mkdir $cgi_dir, $default_perms ;
116 mkdir $ht_dir, $default_perms ;
117 mkdir $inc_dir, $default_perms ;
118 system("cp $default_page $ht_dir/index.php");
119 # perl is sometime fucked to create with right permission
120 system("chmod $default_perms $group_dir");
121 system("chmod $default_perms $log_dir");
122 system("chmod $default_perms $cgi_dir");
123 system("chmod $default_perms $ht_dir");
124 system("chmod $default_perms $inc_dir");
125 system("chmod $file_default_perms $ht_dir/index.php");
126 chown $dummy_uid, $gid, ($group_dir, $log_dir, $cgi_dir, $ht_dir);
127 chown $dummy_uid, $gid, ("$ht_dir/index.php");
130 #############################
131 # Group Update Function
132 #############################
134 my ($gid, $gname, $is_public, $userlist) = @_;
135 my ($log_dir, $cgi_dir, $ht_dir);
136 my ($realuid, $realgid);
139 $group_dir = $grpdir_prefix.'/'.$gname;
140 $log_dir = $group_dir."/log";
141 $cgi_dir = $group_dir."/cgi-bin";
142 $ht_dir = $group_dir."/htdocs";
143 $inc_dir = $group_dir."/incoming";
146 $default_perms = 2775 ;
148 $default_perms = 2771 ;
151 if ($verbose) {print("Updating Group: $gname\n")};
153 system("chmod $default_perms $group_dir");
154 system("chmod $default_perms $log_dir");
155 system("chmod $default_perms $cgi_dir");
156 system("chmod $default_perms $ht_dir");
157 system("chmod $default_perms $inc_dir");
158 chown $dummy_uid, $gid, ($group_dir, $log_dir, $cgi_dir, $ht_dir, $inc_dir);
160 my $realuid=get_file_owner_uid($group_dir);
161 if ($dummy_uid eq $realuid){
162 system("chown $dummy_uid $group_dir");
164 if($verbose){print("Changing owner of $group_dir $realuid -> $dummy_uid\n")};
165 system("chown -R $dummy_uid $group_dir");
167 my $realgid=get_file_owner_gid($group_dir);
168 if ($gid eq $realgid){
169 system("chgrp $gid $group_dir");
171 if($verbose){print("Changing group of $group_dir $realgid -> $gid\n")};
172 system("chgrp -R $gid $group_dir");
176 #############################
177 # Group Delete Function
178 #############################
180 my ($gname, $x, $gid, $userlist, $counter);
181 my $this_group = shift(@_);
184 if (substr($hostname,0,3) ne "cvs") {
185 if ($verbose) {print("Deleting Group: $this_group\n")};
186 system("/bin/mv /var/lib/gforge/chroot/home/groups/$this_group /var/lib/gforge/chroot/home/groups/deleted_group_$this_group");
187 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");
191 #############################
193 #############################
194 sub get_file_owner_uid {
195 my $filename = shift(@_);
196 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
200 #############################
202 #############################
203 sub get_file_owner_gid {
204 my $filename = shift(@_);
205 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);