[PATCH] samba-tool: Easily edit a users object in AD

Rowland Penny rpenny at samba.org
Mon Jul 3 13:57:06 UTC 2017


On Mon, 3 Jul 2017 16:50:28 +0300
Alexander Bokovoy <ab at samba.org> wrote:

> On ma, 03 heinä 2017, Rowland Penny via samba-technical wrote:
> > On Sat, 1 Jul 2017 18:08:10 +0100
> > Rowland Penny via samba-technical <samba-technical at lists.samba.org>
> > wrote:
> > 
> > > On Sat, 1 Jul 2017 13:27:07 +1200
> > > Douglas Bagnall <douglas.bagnall at catalyst.net.nz> wrote:
> > > 
> > > > On 01/07/17 00:43, Rowland Penny via samba-technical wrote:
> > > > > On Wed, 28 Jun 2017 12:27:53 +0300
> > > > > Alexander Bokovoy <ab at samba.org> wrote:
> > > > > 
> > > > >> On ke, 28 kesä 2017, Andrew Bartlett via samba-technical
> > > > >> wrote:
> > > > 
> > > > >>> You replace the EDITOR with a script that modifies the
> > > > >>> object's LDIF.
> > > > >> Yes, something like
> > > > >> EDITOR="sed -i -e 's/attribute: foo/attribute: bar/'"
> > > > >>
> > > > > 
> > > > > OK, this doesn't work, but if I create a dummy editor script,
> > > > > it does.
> > > > 
> > > > Yes, that isn't going to work because you are calling the editor
> > > > using a list, exactly like so
> > > > 
> > > >        call([editor, t_file.name])
> > > > 
> > > > which is interpreted as an exec-style argument list, meaning it
> > > > will look for an editor called "sed -i -e ...", not one called
> > > > "sed".  In this case it is probably mostly safe to change it to
> > > > 
> > > >        call("%s %s" % (editor, t_file.name), shell=True)
> > > > 
> > > > which will use a shell to split the string.
> > > > 
> > > > > This is what I came up with:
> > > > > 
> > > > > #!/bin/sh
> > > > > user_ldif="$1"
> > > > > SED=$(which sed)
> > > > > $SED -i -e \'s/userAccountControl: 512/userAccountControl:
> > > > > 514/\' $user_ldif
> > > > > 
> > > > > If I create the above script as /tmp/editor.sh, make it
> > > > > executable and then pass it to 'samba-tool user USER' with
> > > > > '--editor=/tmp/editor.sh' it works.
> > > > > 
> > > > > Problem is, how do I either get the python test script to
> > > > > create the bash script and then use it, or how do I create
> > > > > the bash script somewhere in the source (if so where?) and
> > > > > then get the python test script to use it ?
> > > > 
> > > > Why not use tempfile.NamedTemporaryFile() again? and
> > > > subprocess.call()?
> > > > 
> > > > Douglas
> > > > 
> > > > > 
> > > > > Rowland
> > > > > 
> > > > 
> > > 
> > > I have tried what Douglas suggested, but I am getting nowhere, I
> > > do not want to alter the 'samba-tool user edit', I just want to
> > > get a python test script to run it and hopefully pass.
> > > 
> > > edit.py uses an editor and a human intervention to work, I can
> > > automate this with a simple bash script. What I cannot do is to
> > > get a python test script to fully automate this.
> > > 
> > > I think if I was to create the bash script in the source code it
> > > would work, but where would be the best place to put it ? and how
> > > would I obtain the path to it ?
> > > 
> > > Rowland
> > >   
> > > 
> > 
> > I couldn't get the python script to work, so I dumped it, in favour
> > of a bash script and this seems to work, but I don't fully
> > understand the output, here is a sample:
> > 
> > testsuite: samba.tests.samba_tool.edit(fl2008r2dc)
> > progress: push
> > time: 2017-07-03 13:27:14.000000Z
> > User 'sambatool1' created successfully
> > Modified User 'sambatool1' successfully
> > Deleted user sambatool1
> > teardown_env(fl2008r2dc)
> > samba: EOF on stdin - PID 2302 terminating
> > time: 2017-07-03 13:27:14.000000Z
> > progress: pop
> > command: /root/samba-master/python/samba/tests/samba_tool/edit.sh
> > $SERVER $USERNAME $PASSWORD 2>&1
> > | /root/samba-master/selftest/filter-subunit --fail-on-empty
> > --prefix="samba.tests.samba_tool.edit." --suffix="(fl2008r2dc)"
> > expanded
> > command: /root/samba-master/python/samba/tests/samba_tool/edit.sh
> > dc7 Administrator locDCpass7 2>&1
> > | /root/samba-master/selftest/filter-subunit --fail-on-empty
> > --prefix="samba.tests.samba_tool.edit." --suffix="(fl2008r2dc)"
> > testsuite-failure: samba.tests.samba_tool.edit(fl2008r2dc) [ Exit
> > code was 1
> > 
> > ]
> > 
> > samba child process 2302 exited with value 0
> > samba: EOF on stdin - PID 2234 terminating
> > SAMBA LOG of: DC7 pid 2302
> > samba: EOF on stdin - PID 2302 terminating
> > TOP 10 slowest tests
> > samba.tests.samba_tool.edit(fl2008r2dc) -> 0
> > 'testonly' finished successfully (29.037s)
> > 
> > The script creates the user, modifies the user and then deletes the
> > user, the script then exits with the exit code '0', but there is
> > this:
> > 
> > testsuite-failure: samba.tests.samba_tool.edit(fl2008r2dc) [
> > Exit code was 1
> > 
> > ]
> > 
> > Is this something to worry about ?
> > Where does the '1' exit code come from ?
> I think the script 'edit.sh' needs to return its output in a format
> expected by selftest/filter-subunit which is a normal subunit format.
> 
> source3/script/tests/test_preserve_case.sh is one of examples on how
> we do that in shell.
> 

Thanks, that helps a lot ;-)

Just need to rewrite my bash script using that as a template.

Rowland




More information about the samba-technical mailing list