feedback.sh 5.6 KB
Newer Older
Z
zhouyingfeng 已提交
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 169 170 171 172
#!/bin/bash

ARGPARSE=`getopt -o u:vin:l:e: --long git-user:,help,dry-run,task-name:,log-file:,exit-code:  -- "$@"`
KEEP_ANONYMOUS="A_USER_DOES_NOT_TELL_US"
# paddle config home dir, same as paddle
PADDLE_CONF_HOME="$HOME/.config/paddle"
# api url, mirror url(s) will be append later
PD_URLS="http://api.paddlepaddle.org/version"

usage()
{
    echo "Usage: `basename $0` [options]"
    echo "Options:"
    echo "  -e, --exit-code=EXIT_CODE         The train/predict process's exit code"
    echo "  -l, --log-file=LOG_FILE_PATH      Read which log file to get the duration of process"
    echo "  -n, --task-name=TASK_NAME         The name of demo or example"
    echo "  -u, --git-user=GITHUB_USER        provide contact info, like username or email"
    echo "  -v, -i                            Verbose output and interact with user when necessary"
    echo " --help                             display this help message"
}

eval set -- "${ARGPARSE}"
while true; do
    case "$1" in
        -l|--log-file)
            log_file=$2
            shift 2
            ;;
        -e|--exit-code)
            exit_code=$2
            shift 2
            ;;
        -u|--git-user)
            github_user=$2
            shift 2
            ;;
        -n|--task-name)
            task=$2
            shift 2
            ;;
        -v|-i)
            v=1
            shift
            ;;
        --dry-run)
            dry_run=1
            shift
            ;;
        --)
            shift
            break
            ;;
        --help)
            usage
            exit 0
            ;;
        *)
            echo "Invalid option $1"
            usage
            exit 1
            ;;
    esac
done

# parse the log_file to get the time costs
if [ -s "${log_file}" ]; then
    duration=`awk 'BEGIN{day=0;last_sec=0;min_sec=0;max_sec=0;}
    {if(index($2,":")==3){
        t=substr($2,1,8);
        sec=day*86400+substr(t,1,2)*3600+substr(t,4,2)*60+substr(t,7,2);
        if(sec<last_sec-600){day+=1;sec+=86400;}
        last_sec=sec;
        if(min_sec==0 || min_sec>sec){min_sec=sec;}
        if(max_sec==0 || max_sec<sec){max_sec=sec;}
    }}
    END{print max_sec-min_sec}' ${log_file}`
else
    duration=-1
fi
if [ "${v}" = "1" ]; then echo "duration: ${duration}"; fi

# try find the user/email if not given
if [ -z "${github_user}" ]; then
    # search for cached username
    if [ -s "${PADDLE_CONF_HOME}/github_user" ]; then
        if [ "${v}" = "1" ]; then echo "read github_user from cache..."; fi
        github_user=`cat ${PADDLE_CONF_HOME}/github_user`
    else
        # search the github-user from git config
        if [ "${v}" = "1" ]; then echo "read github_user from git..."; fi
        git_username=`git config --get user.name 2>/dev/null`
        git_url=`git config --get remote.origin.url 2>/dev/null`
        if [ "`echo ${git_url} | cut -b 1-19`" = "https://github.com/" ]; then
            # under a git url, like https://github.com/user_xxx/proj_yyy.git
            if [ "${v}" = "1" ]; then echo " from github url..."; fi
            github_user=`echo ${git_url} | cut -d "/" -f 4`
            if [ "${github_user}" = "PaddlePaddle" ]; then
                github_user=
            fi
        fi
        if [ -n "${git_username}" -a -z "${github_user}" ]; then
            if [ "${v}" = "1" ]; then echo " from global git username..."; fi
            github_user=${git_username}
        fi
    fi
fi
# allow user to set the user name, if it's not found
if [ -z "${github_user}" -a "${v}" = "1" ]; then
    read -p "Please input your github username or email, or just return to keep this feedback anonymous:"
    github_user=${REPLY}
    if [ -z "${github_user}" ]; then
        # empty input, consider as one anonymous user
        github_user="${KEEP_ANONYMOUS}"
    fi
fi
if [ -n "${github_user}" -a -z "${dry_run}" ]; then
    # valid user and not in dry-run mode, then save to cache
    mkdir -p ${PADDLE_CONF_HOME}
    echo "${github_user}" >${PADDLE_CONF_HOME}/github_user
fi
if [ "${v}" = "1" ]; then echo "username: ${github_user}"; fi
if [ "${github_user}" = "${KEEP_ANONYMOUS}" ]; then
    # anonymous user should keep the var empty.
    github_user=
fi

# read local paddle version
paddle_version=`paddle version | grep PaddlePaddle | head -n1 | cut -d " " -f 2 | cut -d "," -f 1`
if [ "${v}" = "1" ]; then echo "version:${paddle_version}"; fi

# read local system time
system_time=`date "+%Y%m%d%H%M%S"`
if [ "${v}" = "1" ]; then echo "system time:${system_time}"; fi

# make empty job_name as default value.
if [ -z "${task}" ]; then
    task="(unknown_task)"
fi
if [ "${v}" = "1" ]; then echo "task: ${task}"; fi

# concat the curl command
params="content={\"data_type\":\"usage\",\
\"system_time\":${system_time},\"paddle_version\":\"${paddle_version}\",\
\"github_user\":\"${github_user}\",\"job_name\":\"${task}\",\
\"duration\":${duration},\"exit_code\":\"${exit_code}\"\
}&type=1"
curl_cmd_prefix="curl -m 5 -X POST -d ${params}\
 -b ${PADDLE_CONF_HOME}/paddle.cookie -c ${PADDLE_CONF_HOME}/paddle.cookie "

if [ "${dry_run}" = "1" ]; then
    first_url=`echo ${PD_URLS} | cut -d " " -f 1`
    echo "(dry-run mode)curl command: ${curl_cmd_prefix} ${first_url}"
    exit 0
else
    for u in ${PD_URLS}; do
        curl_cmd="${curl_cmd_prefix} ${u}"
        if [ "${v}" = "1" ]; then echo "run: ${curl_cmd}"; fi
        ${curl_cmd} >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            if [ "${v}" = "1" ]; then echo "upload OK!"; fi
            exit 0
        else
            if [ "${v}" = "1" ]; then echo "upload failed...try next"; fi
        fi
    done
    if [ "${v}" = "1" ]; then echo "all urls tried but all failed...exit"; fi
    exit 1
fi