Network and Storage Protocols

Renaming CIFS shares

rafael_varela

Hi,

As far as I know is not possible to rename a CIFS share, i.e., I have to delete the share and recreate it with the new name and set all the permissions again.

Does anyone know if this *very useful* feature is in the product roadmap? I cannot see why it hasn't been implemented yet...

Regards,

Rafael Varela

2 REPLIES 2

FRAGTZACK

Hi,

  Got tired of the manual steps to rename and found frequently needing to rename cifs share. Wrote the below short script tonight to rename a cifs share, preserving the access permissions and any comments. Other settings are not preserved.  This script requires linux/perl and ssh pki authorized_keys equivalence to the filer. This could be converted to probably any OS by changing the $err_file path in sub run_cmd. The $err_file path is to simply capture STDERR as the script performs robust error checking for each ontap command.

#!/usr/bin/perl -w

##########################################################

# cifs_share_rename

# rename a netapp cifs share

#Michael.S.Denney@gmail.com

$version=1.0;

##########################################################

#TO DO:

use strict;

use warnings;

use Getopt::Long;

use POSIX;

##################Global VARS#################################

use vars qw($version $verbose $debug $filer $share $new_share);

##################Predeclare SUBS#############################

use subs qw(run_cmd);

##############################################################

GetOptions(

          'f=s' => \$filer,

          'filer=s' => \$filer,

          's=s' => \$share,

          'share=s' => \$share,

          'n=s' => \$new_share,

          'new_share=s' => \$new_share,

          'v' => \$verbose,

          'd' => \$debug

);

my $t=' ';

print "verbose on\n" if $verbose;

print "debug on\n" if $debug;

$verbose=1 if $debug;

unless ($filer and $share and $new_share) {

   print "Usage: cifs_share_rename -f <filer_name> -s <share_name> -n <new_share_name>\n";

   print "Usage: cifs_share_rename --filer <filer_name> --share <share_name> --new_share <new_share_name>\n";

   exit 1 ;

}

 

my $cmd="ssh $filer cifs shares $share";

print "$cmd\n";

my ($stdout,$stderr)=run_cmd $cmd;

if (@$stderr){

    print "$_\n" foreach (@$stderr);

    exit 1;

}

my $path;my $comment;my $access;my %security;

 

print "search share=>$share\n";

foreach (@$stdout){

   print "$_\n" ;

   if (/^\S+\s+(\/vol\/\S+\s+|\/vol\/\S+\/\S+\s+)(.*)?/){

      $path=$1;

      $comment=$2;

   }#end if regex

   if ( /\s+(.+)\s+\/\s+Read/g){

        push @{$security{read}},$1;

   }

   if ( /\s+(.+)\s+\/\s+Change/g){

      push @{$security{change}},$1;

   }

   if ( /\s+(.+)\s+\/\s+Full\sControl/g){

      push @{$security{'full control'}},$1;

   }

 

}

print "path=>$path\n" if $path;

print "comment=>$comment\n" if $comment;

print "cifs read=>$_ \n" foreach (@{$security{read}});

print "cifs full control=>$_ \n" foreach (@{$security{'full control'}});

print "cifs change=>$_ \n" foreach (@{$security{change}});

 

 

$cmd="$t ssh $filer cifs shares -add $new_share $path -comment \'$comment\'" if ($comment);

$cmd="$t ssh $filer cifs shares -add $new_share $path" unless ($comment);

print "$cmd\n";

($stdout,$stderr)=run_cmd $cmd;

if (@$stderr){

    print "$_\n" foreach (@$stderr);

    unless ((grep /MS-DOS/,@$stderr)and @$stderr == 1){

       exit 1;

    }

}

print "$_\n" foreach (@$stdout);

 

$cmd="$t ssh $filer cifs access -delete $new_share everyone";

print "$cmd\n";

($stdout,$stderr)=run_cmd $cmd;

if (@$stderr){

    print "$_\n" foreach (@$stderr);

    exit 1 unless (grep /successfully modified/,@$stderr);

}

print "$_\n" foreach (@$stdout);

 

foreach my $type ('read','change','full control'){#type

   print "type=$type\n";

   foreach (@{$security{$type}}){

      $cmd="$t ssh $filer cifs access $new_share \'$_\' $type";

      print "$cmd\n";

      ($stdout,$stderr)=run_cmd $cmd;

      if (@$stderr){

          print "$_\n" foreach (@$stderr);

          exit 1 unless (grep /successfully modified/,@$stderr);

      }

      print "$_\n" foreach (@$stdout);

   }

}#end foreach type

$cmd="$t ssh $filer cifs shares -delete $share";

print "$cmd\n";

($stdout,$stderr)=run_cmd $cmd;

if (@$stderr){

    print "$_\n" foreach (@$stderr);

    exit 1;

}

print "$_\n" foreach (@$stdout);

##########################################################

sub run_cmd{

##########################################################

   my $cmd=" @_";

   my $err_file="/dev/shm/err.$$";

   $cmd.=" 2>$err_file";

   my @stdout=qx($cmd);

   chomp @stdout;

   my @stderr;

   if (-s $err_file) { #if the error file has messages

      open ERR,"$err_file";

      @stderr=(<ERR>);

      close ERR;

      chomp @stderr;

      #print "$_\n" foreach (@stderr);

   }

   unlink ($err_file);

   return (\@stdout,\@stderr);

}

scottgelb

Agreed... I never thought about it after years of brute force with it... the good news is you can have multiple shares to the same target...so you can create the new then delete the old, but a rename would be a nice to have feature.

Announcements
NetApp on Discord Image

We're on Discord, are you?

Live Chat, Watch Parties, and More!

Explore Banner

Meet Explore, NetApp’s digital sales platform

Engage digitally throughout the sales process, from product discovery to configuration, and handle all your post-purchase needs.

NetApp Insights to Action
I2A Banner
Public