#!/usr/local/bin/perl # save_share.cgi # Create, update or delete a samba share require './file-lib.pl'; $disallowed_buttons{'sharing'} && &error($text{'ebutton'}); &ReadParse(); print "Content-type: text/plain\n\n"; if ($access{'ro'} || $access{'uid'}) { # User has no access to samba print "0\n"; exit; } %minfo = &get_module_info("samba"); &read_acl(\%acl, undef); if (!%minfo || !&check_os_support(\%minfo) || !$acl{$base_remote_user,'samba'}) { # Samba module not installed or supported print "0\n"; exit; } &foreign_require("samba", "samba-lib.pl"); %sconfig = &foreign_config("samba"); &lock_file($sconfig{'smb_conf'}); @shares = &foreign_call("samba", "list_shares"); if ($in{'delete'}) { # Deleting an old share foreach $s (@shares) { &foreign_call("samba", "get_share", $s); if ($samba::share{'path'} && $samba::share{'path'} eq $in{'path'}) { &foreign_call("samba", "delete_share", $s); last; } } print "1\n"; } elsif ($in{'new'}) { # Creating a new share map { $taken{$_}++ } @shares; if ($in{'path'} =~ /\/([^\/]+)$/) { $base = $1; } else { $base = "root"; } if ($taken{$base}) { for($i=2; $taken{$base.$i}; $i++) { } $base = $base.$i; } $samba::share{'path'} = $in{'path'}; $samba::share{'available'} = $in{'available'} ? 'yes' : 'no'; $samba::share{'writeable'} = $in{'writable'} ? 'yes' : 'no'; $samba::share{'comment'} = $in{'comment'}; if ($in{'guest'} == 2) { $samba::share{'public'} = 'yes'; $samba::share{'guest only'} = 'yes'; } elsif ($in{'guest'} == 1) { $samba::share{'public'} = 'yes'; } &foreign_call("samba", "create_share", $base); print "1\n"; } else { # Updating an existing share foreach $s (@shares) { &foreign_call("samba", "get_share", $s); if ($samba::share{'path'} && $samba::share{'path'} eq $in{'path'}) { # found the share to update $samba::share{'available'} = $in{'available'} ? 'yes' : 'no'; $samba::share{'writeable'} = $in{'writable'} ? 'yes' : 'no'; $samba::share{'comment'} = $in{'comment'}; if ($in{'guest'} == 2) { $samba::share{'public'} = 'yes'; $samba::share{'guest only'} = 'yes'; } elsif ($in{'guest'} == 1) { $samba::share{'public'} = 'yes'; delete($samba::share{'guest only'}); } else { delete($samba::share{'public'}); delete($samba::share{'guest only'}); } &foreign_call("samba", "modify_share", $s, $s); last; } } print "1\n"; } &unlock_file($sconfig{'smb_conf'}); &webmin_log($in{'delete'} ? 'delete' : $in{'new'} ? 'create' : 'modify', 'share', $in{'path'});