_pm2 5.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
#!/bin/zsh -f
#compdef pm2
#autoload

local -a _1st_arguments

_1st_arguments=(
    "start:start and daemonize an app"
    "trigger:trigger process action"
    "deploy:deploy your json"
    "startOrRestart:start or restart JSON file"
    "startOrReload:start or gracefully reload JSON file"
    "pid:return pid of [app_name] or all"
    "stop:stop a process"
    "restart:restart a process"
    "scale:scale up/down a process in cluster mode depending on total_number param"
    "profile\:mem:Sample PM2 heap memory"
    "profile\:cpu:Profile PM2 cpu"
    "reload:reload processes (note that its for app using HTTP/HTTPS)"
    "id:get process id by name"
    "inspect:inspect a process"
    "delete:stop and delete a process from pm2 process list"
    "sendSignal:send a system signal to the target process"
    "ping:ping pm2 daemon - if not up it will launch it"
    "updatePM2:update in-memory PM2 with local PM2"
    "install:install or update a module and run it forever"
    "module\:update:update a module and run it forever"
    "module\:generate:Generate a sample module in current folder"
    "uninstall:stop and uninstall a module"
    "package:Check & Package TAR type module"
    "publish:Publish the module you are currently on"
    "set:sets the specified config <key> <value>"
    "multiset:multiset eg \"key1 val1 key2 val2\""
    "get:get value for <key>"
    "config:get / set module config values"
    "unset:clears the specified config <key>"
    "report:give a full pm2 report for https\://github.com/Unitech/pm2/issues"
    "link:link with the pm2 monitoring dashboard"
    "unlink:unlink with the pm2 monitoring dashboard"
    "monitor:monitor target process"
    "unmonitor:unmonitor target process"
    "open:open the pm2 monitoring dashboard"
    "plus:enable pm2 plus"
    "login:Login to pm2 plus"
    "logout:Logout from pm2 plus"
    "web:launch a health API on 0.0.0.0\:9615"
    "dump:dump all processes for resurrecting them later"
    "cleardump:Create empty dump file"
    "send:send stdin to <pm_id>"
    "attach:attach stdin/stdout to application identified by <pm_id>"
    "resurrect:resurrect previously dumped processes"
    "unstartup:disable the pm2 startup hook"
    "startup:enable the pm2 startup hook"
    "logrotate:copy default logrotate configuration"
    "ecosystem:generate a process conf file. (mode = null or simple)"
    "reset:reset counters for process"
    "describe:describe all parameters of a process id"
    "list:list all processes"
    "jlist:list all processes in JSON format"
    "prettylist:print json in a prettified JSON"
    "monit:launch termcaps monitoring"
    "imonit:launch legacy termcaps monitoring"
    "dashboard:launch dashboard with monitoring and logs"
    "flush:flush logs"
    "reloadLogs:reload all logs"
    "logs:stream logs file. Default stream all logs"
    "kill:kill daemon"
    "pull:updates repository for a given app"
    "forward:updates repository to the next commit for a given app"
    "backward:downgrades repository to the previous commit for a given app"
    "deepUpdate:performs a deep update of PM2"
    "serve:serve a directory over http via port"
    "examples:display pm2 usage examples"
)

local -a id_names

_id_names() {
    local app_list
    app_list=`pm2 list -m`

    local -a names ids 
    names=(`echo $app_list | grep '+---' | awk '{print $2}'`)
    ids=(`echo $app_list | grep 'pm2 id' | awk '{print $4}'`)

    if (( ${#ids} > 0 )); then
        for i in {1..${#ids}}; do
            id_names+=( "${ids[i]}:${names[i]}" )
        done
    fi
}

_arguments \
    '(-v --version)'{-v,--version}'[output version]' \
    '(-h --help)'{-h,--help}'[output usage information]' \
    '*:: :->subcmds' && return 0

if (( CURRENT == 1 )); then
    _describe "command" _1st_arguments
    return
fi

local -a id_comp id_all_comp id_all_files_comp start_options logs_options
id_comp=('1: :->id_comp')
id_all_comp=('1: :->id_all_comp')
id_all_files_comp=('1: :->id_all_files_comp')
start_options=(
    '--watch[Watch folder for changes]'
    '--fresh[Rebuild Dockerfile]'
    '--daemon[Run container in Daemon mode (debug purposes)]'
    '--container[Start application in container mode]'
    '--dist[with --container; change local Dockerfile to containerize all files in current directory]'
    '--image-name[with --dist; set the exported image name]'
    '--node-version[with --container, set a specific major Node.js version]'
    '--dockerdaemon[for debugging purpose]'
    '(-h --help)'{-h,--help}'[output usage information]'
    $id_all_files_comp
)
logs_options=(
    '--json[json log output]'
    '--format[formated log output]'
    '--raw[raw output]'
    '--err[only shows error output]'
    '--out[only shows standard output]'
    '--lines[output the last N lines, instead of the last 15 by default]'
    '--timestamp[add timestamps (default format YYYY-MM-DD-HH:mm:ss)]'
    '--nostream[print logs without lauching the log stream]'
    '(-h --help)'{-h,--help}'[output usage information]'
    $id_all_comp
)

case "$words[1]" in
    start)
        _arguments $start_options && return 0
        ;;
    logs)
        _arguments $logs_options && return 0
        ;;
    stop|restart|delete|reload|reset)
        _arguments $id_all_comp && return 0
        ;;
    env|inspect|monitor|unmonitor|discribe)
        _arguments $id_comp && return 0
        ;;
    deploy|startOrRestart|startOrReload)
        _files ;;
esac

case "$state" in
    id_comp)
        _id_names
        _alternative \
            'args:app args:(($id_names))'
        ;;
    id_all_comp)
        _id_names
        id_names+=(all)
        _alternative \
            'args:app args:(($id_names))'
        ;;
    id_all_files_comp)
        _id_names
        id_names+=(all)
        _alternative \
            'args:app args:(($id_names))' \
            'files:filename:_files'
        ;;
esac