diff --git a/rattail_fabric2/nodejs.py b/rattail_fabric2/nodejs.py new file mode 100644 index 0000000..16d6444 --- /dev/null +++ b/rattail_fabric2/nodejs.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8; -*- +################################################################################ +# +# Rattail -- Retail Software Framework +# Copyright © 2010-2019 Lance Edgar +# +# This file is part of Rattail. +# +# Rattail is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# Rattail. If not, see . +# +################################################################################ +""" +Fabric library for Node.js +""" + +import os + +from rattail_fabric2 import append, exists +from rattail_fabric2.util import get_home_path + + +def install(c, user=None): + """ + Install nvm and node.js for given user, or else "connection" user. + """ + home = get_home_path(c, user) + nvm = os.path.join(home, '.nvm') + + if not exists(c, nvm): + cmd = "bash -c 'curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.5/install.sh | bash'" + if user: + c.sudo(cmd, user=user) + else: + c.run(cmd) + + profile = os.path.join(home, '.profile') + kwargs = {'use_sudo': bool(user)} + append(c, profile, 'export NVM_DIR="{}"'.format(nvm), **kwargs) + append(c, profile, '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"', **kwargs) + append(c, profile, '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"', **kwargs) + + cmd = "bash -l -c 'nvm install node'" + if user: + c.sudo(cmd, user=user) + else: + c.run(cmd) diff --git a/rattail_fabric2/util.py b/rattail_fabric2/util.py index 6f7453c..acd776c 100644 --- a/rattail_fabric2/util.py +++ b/rattail_fabric2/util.py @@ -119,7 +119,10 @@ def append(c, filename, text, use_sudo=False, partial=False, escape=True, and contains(c, filename, regex, use_sudo=use_sudo, escape=False, shell=shell)): continue - line = line.replace("'", r"'\\''") if escape else line + if escape: + line = line.replace("'", r"'\\''") # TODO: does this one even work? + line = line.replace('"', r'\"') + line = line.replace('$', r'\$') func("""bash -c "echo '%s' >> %s" """ % (line, _expand_path(c, filename))) @@ -178,3 +181,14 @@ def _expand_path(c, path): This function is derived from one copied from fabric v1. """ return path if is_win(c) else '"$(echo %s)"' % path + + +def get_home_path(c, user=None): + """ + Retrieve the path to the home folder for the given user, or else the + "connection" user. + """ + user = user or c.user + home = c.run('getent passwd {} | cut -d: -f6'.format(user)).stdout.strip() + home = home.rstrip('/') + return home