From dbdd482e61193818b2ff83c19ef8763c5ca8f7bc Mon Sep 17 00:00:00 2001 From: Veiko Aasa Date: Sat, 23 Nov 2019 12:41:25 +0300 Subject: [PATCH] samba: fixes and improvements Reviewed-by: James Valleroy --- actions/samba | 45 +++++++---- debian/copyright | 7 ++ plinth/modules/samba/__init__.py | 6 +- plinth/modules/samba/templates/samba.html | 17 +++-- plinth/modules/samba/views.py | 1 + static/themes/default/icons/samba.png | Bin 0 -> 8713 bytes static/themes/default/icons/samba.svg | 88 ++++++++++++++++++++++ 7 files changed, 137 insertions(+), 27 deletions(-) create mode 100644 static/themes/default/icons/samba.png create mode 100644 static/themes/default/icons/samba.svg diff --git a/actions/samba b/actions/samba index 3cadf7444..419bc7900 100755 --- a/actions/samba +++ b/actions/samba @@ -24,6 +24,7 @@ import configparser import json import os import shutil +import stat import subprocess import augeas @@ -93,6 +94,11 @@ def parse_arguments(): return parser.parse_args() +def _close_share(share_name): + """Disconnect all samba users who are connected to the share.""" + subprocess.check_call(['smbcontrol', 'smbd', 'close-share', share_name]) + + def _conf_command(parameters, **kwargs): """Run samba configuration registry command.""" subprocess.check_call(['net', 'conf'] + parameters, **kwargs) @@ -103,6 +109,8 @@ def _create_share(mount_point, windows_filesystem=False): open_share_path = os.path.join(mount_point, SHARES_PATH, 'open_share') os.makedirs(open_share_path, exist_ok=True) + _make_mounts_readable_by_others(mount_point) + # FAT and NTFS partitions don't support chown and chmod if not windows_filesystem: shutil.chown(open_share_path, group='sambashare') @@ -112,6 +120,15 @@ def _create_share(mount_point, windows_filesystem=False): _define_open_share(share_name, open_share_path, windows_filesystem) +def _create_share_name(mount_point): + """Create a share name.""" + share_name = os.path.basename(mount_point) + if not share_name: + share_name = 'disk' + + return share_name + + def _define_open_share(name, path, windows_filesystem=False): """Define an open samba share.""" try: @@ -124,20 +141,10 @@ def _define_open_share(name, path, windows_filesystem=False): _conf_command(['setparm', name, 'inherit permissions', 'yes']) -def _create_share_name(mount_point): - """Create a share name.""" - share_name = os.path.basename(mount_point) - if not share_name: - share_name = "disk" - - return share_name - - def _get_shares(): - """Get shares""" + """Get shares.""" shares = [] - command = ['net', 'conf', 'list'] - output = subprocess.check_output(command) + output = subprocess.check_output(['net', 'conf', 'list']) config = configparser.ConfigParser() config.read_string(output.decode()) for name in config.sections(): @@ -148,6 +155,13 @@ def _get_shares(): return shares +def _make_mounts_readable_by_others(mount_point): + """Make mounted devices readable/traversible by others.""" + dirname = os.path.dirname(mount_point) + stats = os.stat(dirname) + os.chmod(dirname, stats.st_mode | stat.S_IROTH | stat.S_IXOTH) + + def _use_config_file(conf_file): """Set samba configuration file location.""" aug = augeas.Augeas( @@ -182,13 +196,12 @@ def subcommand_delete_share(arguments): shares = _get_shares() for share in shares: if share['mount_point'] == mount_point: + _close_share(share['name']) _conf_command(['delshare', share['name']]) - # restart samba to disconnect all users - action_utils.service_restart('smbd') break else: raise RuntimeError( - 'Mount path "{0}" is not shared.'.format(mount_point)) + 'Mount point "{0}" is not shared.'.format(mount_point)) def subcommand_get_shares(_): @@ -197,7 +210,7 @@ def subcommand_get_shares(_): def subcommand_setup(_): - """Configure samba. Use custom samba config file.""" + """Configure samba, use custom samba config file.""" with open(CONF_PATH, 'w') as file_handle: file_handle.write(CONF) _use_config_file(CONF_PATH) diff --git a/debian/copyright b/debian/copyright index a2bca8c0b..9c5eb3ca7 100644 --- a/debian/copyright +++ b/debian/copyright @@ -172,6 +172,13 @@ Copyright: Thomas B. (https://github.com/thomascube) Comment: https://raw.githubusercontent.com/roundcube/roundcubemail/master/skins/elastic/images/logo.svg License: CC-BY-SA-3.0 +Files: static/themes/default/icons/samba.png + static/themes/default/icons/samba.svg +Copyright: None +Comment: 2010 Samba Team + https://commons.wikimedia.org/wiki/File:Samba_logo_2010.svg +License: public-domain + Files: static/themes/default/icons/searx.png static/themes/default/icons/searx.svg Copyright: diff --git a/plinth/modules/samba/__init__.py b/plinth/modules/samba/__init__.py index f18d946a4..c52b1bf2f 100644 --- a/plinth/modules/samba/__init__.py +++ b/plinth/modules/samba/__init__.py @@ -41,11 +41,11 @@ managed_packages = ['samba'] name = _('Samba') -short_description = _('Samba File Sharing') +short_description = _('File Sharing') description = [ - _('Samba allows to share files and folders between computers in your ' - 'local network.'), + _('Samba allows to share files and folders between FreedomBox and ' + 'other computers in your local network.'), format_lazy( _('After installation, you can choose which disks to use for sharing. ' 'Enabled {hostname} shares are open to everyone in your local ' diff --git a/plinth/modules/samba/templates/samba.html b/plinth/modules/samba/templates/samba.html index 2e849d70c..d6760eaa3 100644 --- a/plinth/modules/samba/templates/samba.html +++ b/plinth/modules/samba/templates/samba.html @@ -35,11 +35,11 @@ {{ block.super }} {% if is_enabled %} -

{% trans "Select devices for sharing:" %}

+

{% trans "Select disks for sharing" %}

{% blocktrans trimmed %} - NB! Selecting device does not share the whole disk, only the folder - FreedomBox/shares/open_share will be shared on that disk. + NB! Only the directory FreedomBox/shares/open_share will be shared on + selected disks. The directory will be created if it doesn't exist. {% endblocktrans %}

@@ -71,7 +71,10 @@ + name="mount_point" autocomplete="off" + {% if disk.filesystem_type == 'vfat' %} + title='{% trans "vfat partitions are not supported" %}' disabled + {% endif %}/> {% endif %} @@ -102,11 +105,9 @@
{% if unavailable_shares %} -

Shares configured but the disk is not available:

+

{% trans "Shares configured but the disk is not available" %}

- {% blocktrans trimmed %} - If the disk is plugged back in, sharing will be automatically enabled. - {% endblocktrans %} + {% trans "If the disk is plugged back in, sharing will be automatically enabled." %}

diff --git a/plinth/modules/samba/views.py b/plinth/modules/samba/views.py index 6132340d5..a9cc3c6e0 100644 --- a/plinth/modules/samba/views.py +++ b/plinth/modules/samba/views.py @@ -36,6 +36,7 @@ class SambaAppView(views.AppView): """Samba sharing basic configuration.""" name = samba.name description = samba.description + diagnostics_module_name = 'samba' app_id = 'samba' template_name = 'samba.html' diff --git a/static/themes/default/icons/samba.png b/static/themes/default/icons/samba.png new file mode 100644 index 0000000000000000000000000000000000000000..9e582be961f3495f4b82eba2936d14cf610da1cf GIT binary patch literal 8713 zcmZ`5K>!Uk zWpE3v^P>#ZUY2IY!1;d{_FZiOg+hxmcfLcJG5OyELR@$pMIpk%EUZmnWO^=x}E6Q_k)e8)BO-dJyzZbEjO`!~LrBqZG&RoollVJ1j$2 zud*~WN{kUtU!PI*V~%*AQkni$VJ`Kvuv=Kz)h zOM^DnDx$?gL8!97xTA9t8ZwQU!aL)`3S5Mk=OQU&W#KeS_WUukF1Fvn$OqWAKlS0S zvkiux^pJB}0RtFH1EoxmA_H{~j03szJ7FZa_v28m^Cys4nqtLb#_#(d_2Z=f6W_84 zElm84m&89ra+mxnAh-Q!-LD@Uh2qfz8mt7SvZPL)&c1%AR1MFy=-v9*2T2tWRM{^U zNI5=GY6)`eyAHXC*Tb#~VaPeRF5?|ZZpezv5v#JGr{tDReXiF4e2h2_YxDVs$;LcS z%x3wjJpEnwU(^DavLO#DmqabRFFrPBC)L_o{$kuty6rc4VUiXwC?myMsYh}|>Y-R( z-p1Be2VH-+4f+Fu+o0cJiczK{0TLa-H_hf=VVK@g@=+N#it;61*#;%~96GSh;Ut<- zwTZ4jF!6DiS{%*RO2Iu|C-`LWa7D?J(1=nfW1Q#4h3qhTr2;#NHen*;E?8SQZu{?< z>x(y6$OxeOUsH(l#22q?S@Kz#a+ew95Im+n#lKgWzo4@^KMrE^Mn7)wR76WFaUTLW z`W5P<)Qua*3+&%qn~xg@3IUy?_k*8ON|X#!d;%M2oN23aK7+4yki;HhTKoJLZezY0 z8{>cD3%!X|%0yL?97%-m%uYZJ5I`2Er_uRK$R@N+U+U5(ck;a|T~YeX)J8we+C;bb z;1>KCBP`~0;~X&5+t8;5}4n@PA+db;QS?K3fT^3BYy4$I?&-G zE1Yg#(aOun;H+o(&ihP*vDnw^5#mHu-eHKgq-FBjS=2}W_2)fbgO!1HRltzOWp260 zHc^Oli*y~S&$-{|qbtqID^$aSf%jM|lL>BE?zS0ZPvzx?Fm7olVWpsfZQ_BDs-Z-{ zhvJke0aXQ&Lj4NJ=rBXPm*4I!qigXVi{*cFRE*}JZ>df^NaxjG)&d)nU&S3QRTIEl zD+j`=^g)xEXgcCu9&Q<)^VeJrPo(@?PVHXJGR~o?O|Z;FY8}PHdQxDuwZTEtd zue28@bFTh8lA|^%aC&kOX%2FoCHkrLcuo)H=;4Fyn8A|TA6|CK#B?~Y>v23eS)+fp zEZh@OJ28fz=;<1hHDk9ZUi&Ha~wcWQTJOowfljY=!O$kVJ?eLOd?<<5Qu$D-sh* zRhHy73GcKV%hqq_Dw^?w_56|u!CsRj*_0bWL>beG?Fs!;f~h)e>tjMpHHS>84@#6M zodgiw5OFX0d&m=m>=~^}U6RM9+yk=`*2m|oA!ip)Kc62K4Wt7%6L1<&5!%GyerU=( z?2chMQfN)v<}`y=U9}dZn{>ncnC$_bm!jDPw&A$FTn;m-$2oBB^#|)qQn0`GQ#Y)7 zPPU)hT&Go|4Z9RjQGNHp((sDY@q#zn$OyA}wsrjIqP(~b^q5AJoRIeBEUzHuf}Piv zn<2N~4TJIagq@fVVz&ndN*O&d8IaRle{2N;g74+QXh&n`YB&m-YUV7=V^xYU)Nl z#j4IQ<=g-S{3mjHgo&9`H>nlDu9(DFuTXK7D$c5cUTWdnCwZ!u95I4C%@n)suKaR? z8uB^{P~mlQ7G1jV=09&^cT=cK*y-M(x}PF=(|P4Wqni#eWc9T0!)f=C_SnknGZ@t- zjXU6O@KzRWXCJ*2uDR?$Q|$su3g~sCEM1t>qnW+uAri(ki^Or){fIu5Pb#~(Bge2N zM>|{>u|A0|8+d)j^&ozWdP`tH7O4$|yh=EFWK;{X)S5*En`Yl1YQ;QDr9&T09qgSFJ{SGdI^m0eTC;#b zK4?L{ne+|D80F>cyy=+?jiyD7OEq@E4Bqo zPA(R_qlXn94=-Dil2kh)Qk~dr=>$ORi>eoPCg-9@If>f4aGN{)3HmteE&HXT9@=#< zHP;W+%yHM87Ck2449F`eTJr$yBO75A9}Wd^5FV$k-!u0{wlDwtIa3@%%qx(NNZRy% z@ZofgbsS2b^b^~Y>-@9x`|p{F0x%fSY>!Bi96DnLQHOq9-Nc615sgRiaxp^7DeVycJ+{&qLr{=s(cQN;?g;^M8tAR+Q5qyxfFQ!)`LFX6Z^s~S%)WIzcI z9L&7>-Fnsf78)}Lm7eGC(r+$@Bo?u_VrJ)g5{#&@7CAlIck1J9;hLvxMC}aS;-mBh zfTBIC3IN^nBZWMr?wF6-*R>aR6t;8*=reLtjFBoogewvR4O$LB4`1)i(D>IR(C)M0 zEL!6%`1W`&Z@&F~O*2}WyZdkdE3ZCK#c;mKlKEyJGx1tZQKCOX48*%ffq?>iXM}ZQMcg;UK!T>3Z6DmG z$^vscbzwJzb)08Ej{r(u-3Z^d<6i)A*iZ+VU5LR)luYfzv$}WY2wZRJDoUr}ef<&O?(2Pi?OJI@8UVH0%MnLuZ(F zy6bOdT9Pv8jO^#kr9ot3QIcj&Mb!bkm!MLF2touQvT5Sc! zs2kTuXP{pR)OpxX|NOe4Smls%(3-xU&;09dPNY}%ff?5#Tg8$at&@{5_7P;otP&8v zuMLdVT>@kXHw^)I!xQRVJ}-~pE1_$Quj(?X49rjfoisJ=JkmClD6ef(B`M;XA6$f# z-C`KHnIU*#V|?UrX9UDCSK3c!4ZDg=g;Ul>+6|!Im)&1fx4v6q8AX)m~dW5c;K?9G5g)uKDx+@nhb_ zkQ*Pm(`IYQYNd*^QRz?NtGQ1D95_tYs^HVCA3o#DH5CFr@@xIk#TdSigrZE-huEbi zsbhGsYv=o${2h{u1&I`k`1&m5JbvPm)juDRLEgbmp!3PE9Pi7w-4uX4dV}(&KyziB zdgkXhV7LMh&H>z{e&1?z9xA|%iGIyt|No< zYv-RA)3Jbjb9j^@0SbRh&$e)DLaIe$Q;O|4gd&ZcF%4g`F_vW+`2j@@)QT=xD%(!+ z5KMXci879lBrE7qZooDTOoDSGOQQX9sYIYk-B+JQ&U?+NX zxv+n|k3!QIBQTAE#=wuI8h4rRy$DzQkI@W_y7Wt|Uts9c@U`4W`e%&Xpg}0o7_FZ= z$J8hZ_J?rOD^QnnJ-;L)l{*<5nVXGKT?#Z1#AKZvKcOmvM5uqk@V40Bx@;eP?ZpiT z6A47Uxnr)Z-0QoUo7|TuW=o1e%}AkVam`TTtTmG&)1}iOK$ypP1KE%W|373>p{>?+!@IWCoLI7WLDV zhN0Lj+?~Vd+V^544s-d@GON+TMyEGjbQ1SXzIB8?zI{I0#P=0U@TnlAjPe&Vl!?LF ziA>YkXrOVjkEbQ*PBpxYnhsAeRHgMKm?cE)`A{G#dHggf88T!rS2}p6Z1Kg|zCm#= z`qcmyP!UEew20rV9CPTP0S{iU6J5MvB?Rx@FN91-!Y)T%`x@p! zqxj96@FsL)7$oxgO)nz3~QdcH* zFh4Uk{DMImw8xMDO{asb&Blge^UdxJggOP`JG}{+2IR!1h1?HN6B1z37$u^^Yq%yBz)TF5Ar9tECxq$6aP$j) zd)gIG44GkuJpi(VQQ!(TT&G@>EOQk6TiNE;0n!iOP*0x0Y~L~%d;Hkie4F(zywb79nF)V_-jwix8jZ zLo7Xptagu^U`XVJGplh=D9lqLAaV+uk|5j`Rf<)W%rZUVUdoyTU9$Ok2Xv=*iAD;f zEqwUBbfJ5EPD{?{4l^EInm*k@awJ$K^O{bxx~i=EAiKe&Y)bs^3IzRZs7dxK`7NQ! zX$9C*AjA;bQ(nAA%uigZYCe7YUm11dLm+DE9(iFNIzc@>N@eXwwFhVk!oDMENMa=T zUJaEM_;F%!fN2W?@I8m;70@dyfz&u1YD+%Moo>#(>Z8Fwi2~=5Ckis`IMk+aHraAg zc^Aq63g=^>4P34=4V8bx96^a`@>KQeZoxXl+NA@hr|0Hek5;Rs;}t~CFB{zDA;GmW z4QQ(v>&t^&hW)NL*ijC_<~Eo`)Fn})+H)$@CLBmhRJ!W`3=U~>+flnHW%CZy#3*QC z))i9zOJHnsV^rSDQ4h;f)md9M`8-ho=M@ytTp+eE4njVf0HgU>@aiXHJcTn$U z{@6AMIt1d8A!M(xtx7SdZ1o`r>l4~;+~f;--|`|B0XT@QP;Z#7L!()SP(L{a(Rp5H z$r@M7>`85fHO7I=Uff>vzjR3=^H>}i9*%Br8Ql=xe_EOi{D|CP%WM;CV|HSG3qAp@ zEZt*IuHZ+NMIVCROY|VH6ZZX}N=?Scg_0MeX^ohr*44Es zq^n`f%QAyC&!9ChNzE8w7`YbHo+L$EllTcdCXzFINuE6^Z(UIS>`i?Vok4EQrc+_; z9{)%*YaCBZx{jk}Y^`U1mfQmq1Ul&ANPzT0RSiq1gFm=PL}7%=GxTeQ!F{Mm2HtD@ zNV{sRLH&7S&{g(b`e>zn&>QF*wPUa&qkc*DX^0Rn<4zuJ{EDVoO6OUd%ADH9)L;%)joHMoI6 z-nH1pu^8wT=+hg>$BDW*^Wq!-rM=$girucSxy)4E@P{i*lsd&etBYR=92iQ`HYV?Z ziQhpoMMsIZEnulfJXPgQ6nM0(bo-=vQufM&tTsd)?TX;@y8uPH78vpnB*A8>q^d znMyUOokkb85WmT?0I#|LW@N=kKJW3v+Fx{$SG!)Pk~ShMsEIS3y?V<;-iHPkwg~a7 zW3cKkewOi)L)n3~$@2PnvL-Y<>*l7B0_X12B^zdkr=bUcRh9}_|HeufBB9+HFJz^A zR-!P>) z%5rXmmQMZVp3-({l`7|r(ph*&B?prBEK5~pCWj&w2${B!h|&?gVY=({L4K=OUbsav zBR{VmlO4l~mAMZ^P+BMrPb!BZ#bX;)WST`Gjm4S6l18T|N;K7{%4qb#QzgH|jHE94Cscf7RXO`Z12^&g+tAEI5GxKur6IdG zT>#UL>O3dlQR8cU@H8uh+3-5ZU$*~L(qpT7xH@9Fa_adl0kDKvYjmSerU52(TVeXQvPalnDC{pV^wcFHxI30ifSvVf1MBjNq zwiUiYv2X+1xuaVn8C=+MQg20yvLM{Kcg5f5E+&cpJRlWlc_`Nsm_h%t^V}Y}kJiCu z^yXLQps5L)l$l|B+`d?bppm|B7WjqrpTVDkpVl*-sf|K9mt8F{KO!3AR1=vKml8h> z2`wD^o>WlfPk&t@*F5k&9NOuK@_nRKvag3e z|NQ4ic5<0iL>c{^bFs%a;6IW`2b>s_=S9W#E-K#oMfrbw9Ov_G`Q6va@T%W11}4S! zOZ50(>e-AL%2Hz5{K~>)6@*yx*W5X@=_DhIL|OxJONvK$24XJXw<57V<-rt7gVqrB zUX42y@NXjn;-IUlwxkrTRl4r5sW{W1rfQ9uewg8Pmes1-uD{wgqUQH6;sG(O;Oc){ zx|meiKkW_mA8>(K`b1_(5ld-YTi4nq9Lfr;nC@*Kybpy@?Q zwlx)XEk*L%0bxt-$LO=KTEO1Wem5gqY1vI6m?xnphLDlxSxSVmP*cQ$+|4CP%)(NZx?9xR`GG1t1NYoZ0;GoE%21)8ROiiK! z!p#uApsJdE{PR$-7T%H|On~m1I~D|8IzeEcG0)x%EPceuWKzcHMq8R*oGX1QP#Yj& z@CqqRfJj(`Q;~b2_wCmT;jXAuMEN;y%4s|$sFEoLE(koEGdi>?O8D11e;1$^cIT6< zGpey$7uU-{D~SGHM)#086whoi3OP6Wm{gJ++Mi8K1WkzwBfe~c5ijp?{U=4@DpDUO z*p?sxW=Zs;DQ9*w2}oCC*IyvRP4)q5m4kELCb;nNZC>dam>p*nkPdrn9#f5euOL@UeU>(>1?~8OTLMW$H zCxMU8vBq-|Ktm183jZ3?6al{(i6)r4*aWCe1^#s$UG~ck8X-E{cbJTo&QyE)noqJ< zFPV`c!mQkQ<>zvy!Jy3d)j9fL*mv;`%-)dc_vuEez#gj^>l2}1zREv6P&Il*P(<0& z{z(CPg2v3Dro~`GIR%<2a(A#6_cbT@Na3%ww zg51ug_>$i)(&YJ(n(*<& zpnbufKb=F3hJo?|Rcu{4SuHInphEoVGWKnmdVed#Z;S1YnwWHrVycB85 zPO?tM`GOMdCe1oL*XiFIOk^TAz5@D=spD~BkZuC;N#W_)_HxgH_++eGid6C`qP?=B zfCh@_mL;RfK;Ilb-XlmvnD4(!C1L{E2ZW4;TO~rs`nQ<@86U=^}9^y385x9>a9Gme(h@uyYTR?0%PD8V>*e?dCJ72 zBv@BqvxX<&L#-{jf!o|bZD7mRA3y86)mzW-)muMZiXWHCLDgJj<8DwC;)O50ca8-PMo>Tfqiw=p`KPkZD0Rk{MVHj&Py)3WFo2`{>m~JG0h$7A ziF2$Ck1q<%X^-)60hosejpmX^tTXrB#bDi&A1HkXzW?#sg0052dojSQ+>c*2k_gJlXo>5m)wLW4-iBgK|7XUz(OTX}< zz2cQF)~|O;q_;FG_x1mp{egcFE%GW?dm$yYCYGzor;}c6Y)&;06-UXz++YSsYmrU& z`!ZVM5FsCGT z5A3S!KDrIsq?FtnvMJ(v1@Lxq5@%gW^E2^CgvKFuu8HE^i_&)g9)Ed%z|;ECXCuY1 ziWBSq?N|C+aY{xf98`y%Y&Ai1MbMaE<80JQ`k#Fa|G&S1qvV{K?{U^oCm9A9r9%U- MFtIUyfj}nxAFUQ1?*IS* literal 0 HcmV?d00001 diff --git a/static/themes/default/icons/samba.svg b/static/themes/default/icons/samba.svg new file mode 100644 index 000000000..874472bb7 --- /dev/null +++ b/static/themes/default/icons/samba.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + +