NETGEAR is aware of a growing number of phone and online scams. To learn how to stay safe click here.
Forum Discussion
EtherZhang
Mar 17, 2017Aspirant
Auto clean "Recycle bin" on OS6.6 ?
I have looked though this post: https://community.netgear.com/t5/Using-your-ReadyNAS/Can-Recycle-Bin-be-enabled-for-CIFS-and-OS-6-1-2-on-a-314/td-p/856707 And I have successfully enabled the ...
- Apr 05, 2017
So the conclusion of the solution is here:
1. Create file:
/etc/frontview/samba/addons/addons.conf
2. Edit addons.conf according to your existing shares, if you want hide the recycle bin folder, add "." as I did:
[share1] vfs objects = recycle recycle:repository = .Recycle Bin recycle:keeptree = yes recycle:versions = no [share2] vfs objects = recycle recycle:repository = .Recycle Bin recycle:keeptree = yes recycle:versions = no
3. Reload the config file by go to the frontview web interface -> Shares and edit one of your current shares and change something then press OK. The recycle bin will now working on your NAS. Next are how to enable autoclean function for the recycle bin.
4. Create file
/frontview/bin/clean_recycle_bins
and edit it as below:
#!/usr/bin/perl #------------------------------------------------------------------------- # Copyright 2007, NETGEAR # All rights reserved. #------------------------------------------------------------------------- # # exit if( -f "/ramfs/.clean_recycle_bins.lock" ); # open(LOCK, ">/ramfs/.clean_recycle_bins.lock"); # close(LOCK); # while ( -f "/ramfs/spindown" ) { # local $/; # open(SPIN, "/ramfs/spindown"); # if( <SPIN> =~ ":1" ) { # sleep(530); # } # else { # last; # } # } use lib qw( /frontview/lib ); # use Frontview; # # my $fv = new Frontview; # $fv->Account_get_info(); # $fv->Service_get_info(); open(IN, "/etc/frontview/recycle.conf") || exit; my @dirlist = <IN>; close(IN); # if( $fv->{Service}{USER_HOME_DIRECTORY} && # $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE} ) # { # my $path; # my $recycle_max_days = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_DAYS}; # $recycle_max_days = $HOME_RECYCLE_AGE_LIMIT if( !$recycle_max_days ); # my $recycle_max_size = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_SIZE}; # $recycle_max_size = $HOME_RECYCLE_MB_LIMIT if( !$recycle_max_size ); # # foreach my $user( sort keys %{ $fv->{Account}{user} } ) # { # if( -d "$fv->{Account}{user}{$user}{home}/.Recycle Bin" ) # { # $path = $fv->{Account}{user}{$user}{home}; # push @dirlist, "$user!!$path!!$recycle_max_size!!$recycle_max_days"; # } # } # } foreach (@dirlist) { chomp; my ($share, $path, $mb_limit, $age_limit) = split('!!'); if( $age_limit ) { system("find '$path/.Recycle Bin' -type f -ctime +$age_limit -exec rm -rf {} \\; &>/dev/null"); } if( $mb_limit ) { my $dev = `df $path | tail -1 | awk '{print \$1}'`; chomp $dev; my $blocksize = `dumpe2fs -h $dev 2>/dev/null | grep 'Block size' | awk '{print \$3}'`; chomp $blocksize; my $recycle_mb = `du -sm '$path/.Recycle Bin' 2>/dev/null`; chomp $recycle_mb; if( $recycle_mb > $mb_limit ) { my %files; open(FIND, "find '$path/.Recycle Bin' -type f -printf '%p!=!=%C@!=!=%s\n' |"); while(<FIND>) { chomp; my ($name, $time, $size) = split('!=!='); while( exists $files{$time} ) { ++$time; } $files{$time}{name} = $name; $files{$time}{size} = $size > $blocksize ? $size : $blocksize; } close(FIND); my $total_size = 0; my $byte_limit = ($mb_limit * 1024 * 1024); foreach my $time (reverse sort keys %files) { $total_size = ($total_size + $files{$time}{size}); if( $total_size > $byte_limit ) { unlink("$files{$time}{name}"); } } } } # Do a reverse sort so we can rmdir child directories before the parents. open(FIND, "find '$path/.Recycle Bin' -type d 2>/dev/null | sort -r |"); while(<FIND>) { chomp; rmdir; } close(FIND); } close(IN); # unlink("/ramfs/.clean_recycle_bins.lock");
PS: You can modify all the '$path/.Recycle Bin' by using your own recycle bin name you used in file addons.conf at the beginning.
5. Create file:
/etc/frontview/recycle.conf
then edit it like this:
share1!!/data/share1!!0!!1 share2!!/data/share2!!0!!1
The last digit "1" I use here represent the how old of the files inside the recycle bin you want to delete when this scrip runs, 1 means older than 1 day, you can set it to 30 then it will only clean files that stays in the recycle bin folder more than one month.
6. Create a Cron by adding a file called "autoclean" or whatever into "/etc/cron.d" folder, then edit the file as below:
0 1 * * * root /frontview/bin/clean_recycle_bins start
Then run
/etc/init.d/cron force-reload
and
/etc/init.d/cron restart
This will allow the scrip to run at every day's 01:00 am and clean the recycle bin according to the "recycle.conf". You can modified it if you know how to write a cron script.
7. Remember all the files that you created here should have 0755 permissions, check this first if you received a error on anything.
Sandshark
Mar 23, 2017Sensei - Experienced User
OK, so the problem is that the "at" sign has special meaning in the forum software and some important things got deleted from the orignally posted code because of it. Here is clean_recycle_bins from OS4.2.28 with the with the at sign replaced by [AT].. Do a search and replace to put back in the at sign instead of [AT].
Frontview.pmc (compiled .pm) does not live anywhere in OS6.6.x, so all references to it and variables from it are commented out. [AT] dirlist is referenced in the commented code, but that part is just adding the home directories to the list already in /etc/frontview/recycle.conf. I don't think we need use lib qw( /frontview/lib );, either, but it shouldn't hurt to have it and not use it. I have not added any of the OP's other edits, at least assuming the other differences are his and not just changes made in OS4.2.28 vs. whatever he got it from.
I have not tried this myself, though. And as previously stated, I'm not really a Pearl coder, I've just modified a few lines of code now and then using examples I Googled.
#!/usr/bin/perl #------------------------------------------------------------------------- # Copyright 2007, NETGEAR # All rights reserved. #------------------------------------------------------------------------- use lib qw( /frontview/lib ); # use Frontview; # # my $fv = new Frontview; # $fv->Account_get_info(); # $fv->Service_get_info(); open(IN, "/etc/frontview/recycle.conf") || exit; my [AT]dirlist = <IN>; close(IN); # if( $fv->{Service}{USER_HOME_DIRECTORY} && # $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE} ) # { # my $path; # my $recycle_max_days = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_DAYS}; # $recycle_max_days = $HOME_RECYCLE_AGE_LIMIT if( !$recycle_max_days ); # my $recycle_max_size = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_SIZE}; # $recycle_max_size = $HOME_RECYCLE_MB_LIMIT if( !$recycle_max_size ); # # foreach my $user( sort keys %{ $fv->{Account}{user} } ) # { # if( -d "$fv->{Account}{user}{$user}{home}/Recycle Bin" ) # { # $path = $fv->{Account}{user}{$user}{home}; # push [AT]dirlist, "$user!!$path!!$recycle_max_size!!$recycle_max_days"; # } # } # } foreach ([AT]dirlist) { chomp; my ($share, $path, $mb_limit, $age_limit) = split('!!'); if( $age_limit ) { system("find '$path/Recycle Bin' -type f -ctime +$age_limit -exec rm -rf {} \\; &>/dev/null"); } if( $mb_limit ) { my $recycle_mb = `du -sm '$path/Recycle Bin' 2>/dev/null`; chomp $recycle_mb; if( $recycle_mb > $mb_limit ) { my %files; open(FIND, "find '$path/Recycle Bin' -type f -printf '%p!=!=%C[AT]!=!=%s\n' |"); while(<FIND>) { chomp; my ($name, $time, $size) = split('!=!='); while( exists $files{$time} ) { ++$time; } $files{$time}{name} = $name; $files{$time}{size} = $size; } close(FIND); my $total_size = 0; my $byte_limit = ($mb_limit * 1024 * 1024); foreach my $time (reverse sort keys %files) { $total_size = ($total_size + $files{$time}{size}); if( $total_size > $byte_limit ) { unlink("$files{$time}{name}") or system("rm -f \'$files{$time}{name}\'"); } } } } # Do a reverse sort so we can rmdir child directories before the parents. open(FIND, "find '$path/Recycle Bin' -type d 2>/dev/null | sort -r |"); while(<FIND>) { chomp; rmdir; } close(FIND); } close(IN);
EtherZhang
Mar 24, 2017Aspirant
Thank you so much! I ran this script without an erro, so I think it's working now! I'll wait for one more day and test whether it can auto clean files older than 1 day.
One more question, if I ran this scrip, is the autoclean schedual will automatically go on forever, or I need to add this scrip into a cron, otherwise it will only clean the recycle bin once when I run it mannually?
- SandsharkMar 24, 2017Sensei - Experienced User
Glad I could help, please keep me updated. I didn't end up having to break out my NVX, I just extracted the files from the OS 4.2.28 update package. Once I saw the previously missing "ats", the code made more sense and I was pretty sure that was the key.
It will need to be a cron job to keep deleting files regularly.
- SandsharkMar 25, 2017Sensei - Experienced User
I originally just looked where the other poster said clean_recycle_bins existed. But it turns out that the file in /etc/cron.daily doesn't just point to the one in /frontview/bin, it's a slightly different file. Some of it won't work in OS6 because OS6 doesn't use the /ramfs directory for flags. You could create one or use another directory and some of the added code looks like it will lock clean_recycle_bins so that if it hangs you won't have a bunch of them hanging. But you can't implement the wait for the drives to be spun up because nothing in OS6 creates that flag. If OS6 has a similar flag elsewhere, I haven't found it. I've commented out those parts of the code, too. But there are a couple other small changes associated with not letting the recycle bin get bigger than the specified size that may be needed to make that part work. Once again, the at sign is replaced with [AT].
#!/usr/bin/perl #------------------------------------------------------------------------- # Copyright 2007, NETGEAR # All rights reserved. #------------------------------------------------------------------------- # # exit if( -f "/ramfs/.clean_recycle_bins.lock" ); # open(LOCK, ">/ramfs/.clean_recycle_bins.lock"); # close(LOCK); # while ( -f "/ramfs/spindown" ) { # local $/; # open(SPIN, "/ramfs/spindown"); # if( <SPIN> =~ ":1" ) { # sleep(530); # } # else { # last; # } # } use lib qw( /frontview/lib ); # use Frontview; # # my $fv = new Frontview; # $fv->Account_get_info(); # $fv->Service_get_info(); open(IN, "/etc/frontview/recycle.conf") || exit; my [AT]dirlist = <IN>; close(IN); # if( $fv->{Service}{USER_HOME_DIRECTORY} && # $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE} ) # { # my $path; # my $recycle_max_days = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_DAYS}; # $recycle_max_days = $HOME_RECYCLE_AGE_LIMIT if( !$recycle_max_days ); # my $recycle_max_size = $fv->{Service}{USER_HOME_DIRECTORY_RECYCLE_MAX_SIZE}; # $recycle_max_size = $HOME_RECYCLE_MB_LIMIT if( !$recycle_max_size ); # # foreach my $user( sort keys %{ $fv->{Account}{user} } ) # { # if( -d "$fv->{Account}{user}{$user}{home}/Recycle Bin" ) # { # $path = $fv->{Account}{user}{$user}{home}; # push [AT]dirlist, "$user!!$path!!$recycle_max_size!!$recycle_max_days"; # } # } # } foreach ([AT]dirlist) { chomp; my ($share, $path, $mb_limit, $age_limit) = split('!!'); if( $age_limit ) { system("find '$path/Recycle Bin' -type f -ctime +$age_limit -exec rm -rf {} \\; &>/dev/null"); } if( $mb_limit ) { my $dev = `df $path | tail -1 | awk '{print \$1}'`; chomp $dev; my $blocksize = `dumpe2fs -h $dev 2>/dev/null | grep 'Block size' | awk '{print \$3}'`; chomp $blocksize; my $recycle_mb = `du -sm '$path/Recycle Bin' 2>/dev/null`; chomp $recycle_mb; if( $recycle_mb > $mb_limit ) { my %files; open(FIND, "find '$path/Recycle Bin' -type f -printf '%p!=!=%C[AT]!=!=%s\n' |"); while(<FIND>) { chomp; my ($name, $time, $size) = split('!=!='); while( exists $files{$time} ) { ++$time; } $files{$time}{name} = $name; $files{$time}{size} = $size > $blocksize ? $size : $blocksize; } close(FIND); my $total_size = 0; my $byte_limit = ($mb_limit * 1024 * 1024); foreach my $time (reverse sort keys %files) { $total_size = ($total_size + $files{$time}{size}); if( $total_size > $byte_limit ) { unlink("$files{$time}{name}"); } } } } # Do a reverse sort so we can rmdir child directories before the parents. open(FIND, "find '$path/Recycle Bin' -type d 2>/dev/null | sort -r |"); while(<FIND>) { chomp; rmdir; } close(FIND); } close(IN); # unlink("/ramfs/.clean_recycle_bins.lock");
- EtherZhangMar 27, 2017Aspirant
Thanks a lot! I have added this scrip into the /etc/cron.daily, and will see if it can work automatically.
And BTW there is another mistake of the file '/etc/frontview/recycle.conf' in the original post, the directory should be '/data/blabla' rather than "/c/blabla", like this:
media!!/data/media!!0!!360 media-other!!/data/media-other!!0!!180
Otherwise the scrip will end up cannot find directory.
Related Content
NETGEAR Academy

Boost your skills with the Netgear Academy - Get trained, certified and stay ahead with the latest Netgear technology!
Join Us!