Então eu tenho o seguinte código que deve verificar se um pacote npm está instalado:
def is_installed(name, as_global=True):
# Returns whether NPM package is installed.
s = shell(_get_npm_command("ls -p --depth 0", as_global))
match = re.search(r'\b%s\b' % (name), s['stdout'])
if match:
return True
return False
Com a função shell sendo um wrapper subprocess.Popen ():
def shell(c, stdin=None, env={}):
# Simplified wrapper for shell calls to subprocess.Popen()
environ = os.environ
environ["LC_ALL"] = "C"
for x in env:
environ[x] = env[x]
if not "HOME" in environ:
environ["HOME"] = "/root"
p = subprocess.Popen(shlex.split(c),
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
env=environ)
data = p.communicate(stdin)
return {"code": p.returncode, "stdout": data[0],
"stderr": data[1]}
e com um get_npm_command assim:
def _get_npm_command(command, as_global, path=None):
# returns npm command
if as_global:
return _get_global_npm_command(command)
else:
return _get_local_npm_command(command, path)
def _get_global_npm_command(command):
# returns global npm command
os.chdir(NPM_PATH)
return "gksu -u npm 'npm " + command + " -g'"
def _get_local_npm_command(command, install_path):
# returns local npm command
if install_path:
os.chdir(install_path)
return "npm " + command + " "
Como você pode ver, o comando eventual é:
gksu -u npm npm ls -p --depth 0
Em outras palavras, criei um usuário chamado npm para instalar pacotes npm globais, porque não há muito tempo o npm recomendava que não se deveria usar privilégios de root para usá-lo. Eles mudaram de ideia, mas pretendo continuar com essa solução que encontrei na Web e que surgiu com alguém.
De qualquer forma, o gksu me pede uma senha para este comando, mas o npm não tem uma senha e eu gostaria de poder executar este comando sem receber uma senha.
Eu tentei o seguinte:
/etc/sudoers.d/arkos.sudo
npm ALL=(ALL) NOPASSWD: /usr/bin/npm
.. mas isso não parece ter qualquer efeito.