2018년 11월 6일 화요일

[Linux] Shell script for git pull - username & password 자동입력

Linux 환경에서 git pull 명령어 수행시 username & password를 script로 처리하기 위한 작업을 정리한다.

System : Ubuntu 14.04 LTS

==================================================================

script 수행을 위해서는 expect 가 설치되어 있어야 한다.
$ sudo apt-get install expect

expect 명령어는 아래와 같이 정의되어 있다. (자세한 내용은 링크 참조)

  • Expect is a program that "talks" to other interactive programs according to a script. 
  • expect 기본 명령
    • spawn : 명령어를 실행한다.
    • expect “문자열” : “문자열"을 만나면
    • send “문자열\r” : "문자열"을 전송한다.
    • interact : expect를 끝내고 사용자에게 제어권을 넘긴다.
    • expect eof : expect 종료


==================================================================

[ Script Sample ]

사용자 옵션이 없을 경우, script에 정의된 default parameter를 기준으로 동작하도록 정의한다.

$ git-pull -d $HOME/work/project1 -u sisbsoma -p 1234

------------------------------------------------------------------------------------------------

[ Sample code] 


file path : $HOME/bin/git-pull

#!/bin/bash


# Username & Password
USERNAME=USER_NAME  ## set user.name for git repository
PASSWD=PASSWORD    ## set password for git repository

# Default Working directory
WORKDIR=$HOME/work  ## set default working directory

# Help function
usage() {
echo "usage : $0 [OPTIONS]"
echo "  -h : Display Usage"
echo "  -d : Working Directory"
echo "  -u : Username"
echo "  -p : Password"
exit 0
}

# Git pull
func_gitpull() {
cd $WORKDIR

expect <<EOF
spawn git pull
expect "Username"
send $USERNAME\r
expect "Password"
send $PASSWD\r
expect eof
EOF
}

# Update params
while getopts "h:d:u:p:" opt
do
        case $opt in
                d) WORKDIR=$OPTARG
                ;;

                u) USERNAME=$OPTARG
                ;;

                p) PASSWD=$OPTARG
                ;;

                h) usage ;;
                ?) usage ;;
        esac
done

func_gitpull


------------------------------------------------------------------------------------------------

2018년 6월 11일 월요일

[Android] Jack Server : How to support Multi User environment


Android Build System - Jack Server : How to support Multi User environment
#android_jack-server_multi-user
OS : Android 7.1 

Single Build machine & Multi user 환경에서의 Android platform build 시 자동으로 사용자별(user id를 참조하여) jack-server를 구동하는 방법에 대해 기록한다.
- https://github.com/whitemuse/aosp-jack-server

기본적으로 Jack server는 하나의 build machine (computer) single user를 지원하는 구조이다.

By default, the Jack server is mono-user and can be only one user on a computer. To support additional users, select different port number for each user and adjust SERVER_NB_COMPILE accordingly. You can also disable the Jack server by setting SERVER=false in $HOME/.jack

웹 검색을 통해 사용자 별 Jack Server의 포트설정을 다르게 사용하는 것으로 해결이 가능함을 확인 할 수 있다. 다만, jack server 동작을 위한 설정파일($HOME/.jack-server/config.properties, $HOME/.jack-settings) 을 수동으로 편집해야 하는 불편함이 따른다. Build 시 자동으로 설정되도록 아래와 같이 수정한다.

-----------------------------------------------------------------------------------------

Runtime port 설정변경 & New jack server start

1. android/prebuilts/sdk/tools/jack
33 #####################################################
34 # TEAM - SISBSOMA
35 PORT_OFFSET=`id -u`
36 SERVER_PORT_SERVICE=`expr 8076 + ${PORT_OFFSET}`
37 SERVER_PORT_ADMIN=`expr 8077 + ${PORT_OFFSET}`
38 #####################################################

2. android/prebuilts/sdk/tools/jack-admin
45 #####################################################
 46 # TEAM - SISBSOMA
 47 PORT_OFFSET=`id -u`
 48 SERVER_PORT_SERVICE_DEFAULT=8076
 49 SERVER_PORT_ADMIN_DEFAULT=8077
 50
 51 SERVER_PORT_SERVICE=`expr 8076 + ${PORT_OFFSET}`
 52 SERVER_PORT_ADMIN=`expr 8077 + ${PORT_OFFSET}`
 53 ######################################################
 54
 55 #####################################################
 56 # TEAM - SISBSOMA
 57 updatePortNum() {
 58   echo "Update Port Number - Jack Sever"
 59   T_P=`grep SERVER_PORT_SERVICE ~/.jack-settings | cut -d'=' -f2`
 60   if [ "$T_P" -ne "$SERVER_PORT_SERVICE" ]; then
 61     if [ -f "$CLIENT_SETTING" ]; then
 62       sed -i 's/SERVER_PORT_SERVICE.*/SERVER_PORT_SERVICE='$SERVER_PORT_SERVICE'/g' $CLIENT_SETTING
 63       sed -i 's/SERVER_PORT_ADMIN.*/SERVER_PORT_ADMIN='$SERVER_PORT_ADMIN'/g' $CLIENT_SETTING
 64     fi
 65   fi
 66   if [ -d "$JACK_HOME" ]; then
 67     sed -i 's/jack.server.service.port.*/jack.server.service.port='$SERVER_PORT_SERVICE'/g' "$JACK_HOME/config.properties"
 68     sed -i 's/jack.server.admin.port.*/jack.server.admin.port='$SERVER_PORT_ADMIN'/g' "$JACK_HOME/config.properties"
 69   fi
 70 }
 71 #####################################################

216 waitServerStarted () {
217   DONE=1
218   let DATE_TIMEOUT=$(date +%s)+$JACK_CONNECTION_TIMEOUT
219   while [ "$DONE" -ne 0 ]; do
220     HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
221          --cert "${JACK_HOME}/client.pem" \
222          --cacert "${JACK_HOME}/server.pem" \
223          --output /dev/null \
224          --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
225          -X GET \
226          -H "Accept: text/plain$CHARSET_ARGUMENT" \
227          --noproxy ${SERVER_HOST} \
228          https://${SERVER_HOST}:$SERVER_PORT_ADMIN/server \
229          )
230     CURL_CODE=$?
231     if [ $CURL_CODE -eq 7 ] || [ $CURL_CODE -eq 35 ] || [ $CURL_CODE -eq 58 ] || [ $CURL_CODE -eq 60 ] || [ $CURL_CODE -eq 77 ]; then
232       if [ $(date +%s) -ge $DATE_TIMEOUT ]; then
233         echo "Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log" >&2
234         abort
235       else
236         #####################################################
237         # TEAM - SISBSOMA
238         if [ "$CURL_CODE" -eq 7 ]; then
239           if [ -f "$JACK_HOME/config.properties" ]; then
240             JSSP=`grep "jack.server.service.port" "$JACK_HOME/config.properties" | cut -d'=' -f2`
241             if [ "$JSSP" -ne "$SERVER_PORT_SERVICE" ]; then
242               echo "@@ (New) Jack Server start~!!"
243               updatePortNum
244               funcStartServer
245               funcStopServer $JSSP
246             fi
247           fi
248         fi
249         #####################################################
250         sleep 1
251       fi
252     else
253       # A connection was opened, no need to know if it went well
254       DONE=0;
255     fi
256   done
257 }

278 funcStopServer() {
279     echo "Stopping background server : $1"
280     HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
281          --cert "${JACK_HOME}/client.pem" \
282          --cacert "${JACK_HOME}/server.pem" \
283          --output /dev/null \
284          --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
285          -X POST \
286          --noproxy ${SERVER_HOST} \
287          https://${SERVER_HOST}:$1/server/stop \
288          )
289
290     handleHttpErrors $? $HTTP_CODE
291 }
292
293 funcStartServer() {
294    JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
295    echo "Launching Jack server" $JACK_SERVER_COMMAND
296    (
297      trap "" SIGHUP
298      for i in $(seq 3 255); do
299        eval exec "$i"'>&-'
300      done
301      cd "$JACK_HOME"
302      umask $BASE_UMASK
303      exec $JACK_SERVER_COMMAND
304      abort
305    ) >"$JACK_OUT_ERR" 2>&1 &
306 }


[Android] porting - memtester

How to Install memtester on Android system

Memory test를 위한 tool 적용

ref : https://github.com/royzhao/memtester4Android
version : 4.3.0 (32-bit)
=====================================
usage:
 cd android/
 source ./build/envsetup.sh
 lunch xx
 cd android/external/
 git clone  https://github.com/royzhao/memtester4Android.git
 cd memtester4Android
 mm
=====================================

Android.mk
  1 LOCAL_PATH := $(call my-dir)
  2 include $(CLEAR_VARS)
  3
  4 LOCAL_MODULE_TAGS := debug
  5
  6 LOCAL_SRC_FILES:= \
  7     memtester.c tests.c
  8 LOCAL_MODULE:= memtester
  9 LOCAL_MODULE_FILENAME:=memtester
 10 LOCAL_C_INCLUDES:=$(LOCAL_PATH)
 11 #LOCAL_C_INCLUDES :=
 12 #LOCAL_STATIC_LIBRARIES :=
 13 #LOCAL_SHARED_LIBRARIES :=
 14 include $(BUILD_EXECUTABLE)
 15

2018년 3월 30일 금요일

[Android] porting - iperf3

How to Install iperf3 on Android system

- 본 문서는 Iperf3 utility를 Android 개발환경에 적용하기 위한 내용을 기술한다.

Android : 7.1.0
Build System : Ubuntu 14.04 LTS
--------------------------------------------------------------------
ref : https://github.com/esnet/iperf
version : iperf 3.1.3
--------------------------------------------------------------------

소스코드는 github 또는 download 사이트를 통해 다운로드 가능하다.
  1. Project site (source code repository, issue tracker) hosted on GitHub:
    • https://github.com/esnet/iperf
  2. Source code downloads:
    • http://downloads.es.net/pub/iperf/

Android platform build 시 system.img 에 포함되어 릴리즈 되도록 적용한다.
  1. 소스코드 인출
    • git clone https://github.com/esnet/iperf.git
  2. Build
    • copy source files to android/external/iperf-3.1.3
      • $ copy -Rf ./iperf <Android_SRC_Root_DIR>/external/iperf3
    • $ configure - generate iperf_config.h file
      • $ cd <Android_SRC_Root_DIR>/external/iperf3
      • $ ./configure [enter]
    • generate Android.mk
      • $ vi <Android_SRC_Root_DIR>/external/iperf3/Android.mk
      •   1 LOCAL_PATH:= $(call my-dir)
          2 
          3 include $(CLEAR_VARS)
          4 
          5 LOCAL_MODULE_TAGS := optional
          6 
          7 # set SRC_FILES_LIST to all the .c files in $(LOCAL_PATH)/src/
          8 SRC_FILE_LIST := $(wildcard $(LOCAL_PATH)/src/*.c)
          9 
         10 # exclude test files $(LOCAL_PATH)/src/t_timer.c t_units.c t_uuid.c
         11 EXCLUD_FILE_LIST := $(wildcard $(LOCAL_PATH)/src/t_*.c)
         12 
         13 LOCAL_SRC_FILES := $(filter-out $(EXCLUD_FILE_LIST:$(LOCAL_PATH)/%=%),$(SRC_FILE_LIST:$(LOCAL_PATH)/%=%))
         14 
         15 LOCAL_C_INCLUDES :=  \
         16     $(LOCAL_PATH) \
         17     $(LOCAL_PATH)/src
         18 
         19 LOCAL_CFLAGS := -DHAVE_CONFIG_H -g -O2 -Wall -MT
         20 LDFLAGS="-fPIE -pie -fuse-ld=bfd"
         21 
         22 LOCAL_SHARED_LIBRARIES :=
         23 
         24 LOCAL_MODULE:= iperf3
         25 
         26 include $(BUILD_EXECUTABLE)
        3.2.2 partial build
         $ cd [android source root directory]
         $ source ./build/envsetup.sh
         $ mmm ./external/iperf-3.1.3

    • Partial build
      • $ source ./build/envsetup.sh [enter]
      • $ lunch [enter]
        • Select Lunch menu
      • mmm ./external/iperf3/ [enter]
  3. Run-time error 수정
    • case : iperf3: error - unable to create a new stream: No such file or directory
    • resolve : modify iperf_new_stream() at iperf_api.c ( external/iperf3/src/ )
    • 2657 struct iperf_stream *
      2658 iperf_new_stream(struct iperf_test *test, int s)
      2659 { 
      2660     int i;                 
      2661     struct iperf_stream *sp;
      2662   
      2663     char template[1024];
      2664     if (test->tmp_template) {
      2665         snprintf(template, sizeof(template) / sizeof(char), "%s", test->tmp_template);
      2666     } else {             
      2667         /* Android patch :               
      2668          * iperf3: error - unable to create a new stream: No such file or directory
      2669          */
      2670 #ifdef __ANDROID__
      2671         char buf[] = "/system/bin/iperf3.XXXXXX";
      2672 #else
      2673         char buf[] = "/tmp/iperf3.XXXXXX";
      2674 #endif           
      2675         snprintf(template, sizeof(template) / sizeof(char), "%s", buf);
      2676     } 

2018년 2월 27일 화요일

[TIP] CANON MF4800 Ubuntu Driver

Canon MF4800 Printer Driver 다운로드 경로 및 설치 방법

OS : Ubuntu  14.04 LTS

1. Download : http://support-asia.canon-asia.com/contents/ASIA/EN/0100270810.html
2. 설치방법
2-1. 다운로드 받은 linux-UFRII-drv-v340-uken.tar.gz 파일을 압축해제 후 install.sh 실행한다.

  • $ tar xzf linux-UFRII-drv-v340-uken.tar.gz
  • $ cd linux-UFRII-drv-v340-uken
  • $ ./install.sh

2018년 2월 21일 수요일

[MAN] strlcpy


Ref : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205gk/CJAEJFDB.html

strlcpy()

strlcpy() 함수는 NUL 종료 문자열 src에서 dst로 최고 size-1 문자를 복사합니다. 이 함수는 버퍼의 전체 크기(길이만이 아닌)를 차지하며 size가 0을 초과하는 한 NUL을 사용하여 결과를 종료합니다. size 값에 NUL에 해당하는 1바이트를 포함하십시오.
strlcpy() 함수는 공간 제한이 없었다면 복사되었을 문자열의 총 길이를 반환합니다. 이것은 충분한 공간이 있었는지에 따라 실제로 복사된 문자열의 길이와 동일할 수도 있고 그렇지 않을 수도 있습니다. 그러므로 필요한 공간이 어느 정도인지 확인하기 위해 strlcpy()를 한 번 호출한 다음 현재 공간이 충분하지 않을 경우 공간을 할당하고서 마지막에 strlcpy()를 두 번째로 호출하여 필요한 복사를 수행할 수 있습니다.
이 함수는 많은 C 라이브러리에 대한 공통 BSD 파생 확장입니다.

구문

extern size_t strlcpy(char *dst,  const char *src, size_t  size)

2018년 1월 29일 월요일

[Ubuntu16.04] Xshell4에서의 SSH 접속 설정

XShell4 (Xshell5 이하 버전)을 사용하여 Ubuntu16.04 서버에 SSH 접속 시 발생하는 오류 현상 및 해결방법에 대해 기술한다.

1.     현상
Ubuntu16.04 LTS 버전에 sshd 설치 후 Xshell4를 이용한 접속 시 서버에 맞는 outgoing encryption 알고리즘을 찾을 수 없습니다.” 팝업 발생 후 접속 불가

 


2.     대책 (아래 A, B 중 선택할 수 있다)
A.     Xshell5 버전으로 업데이트 한다.
B.     Xshell4 버전에서 지원하는 Ciphers를 서버의 sshd config 파일에 등록해 준다.
                         i.         참조 : http://manpages.ubuntu.com/manpages/zesty/man5/sshd_config.5.html
                        ii.         Xshell에서 지원하는 한 Cipher List 중 선택하여 /etc/ssh/ssh_config에 아래 내용을 추가한다.
$sudo vi /etc/ssh/ssh_config

    Ciphers aes256-cbc
$sudo service ssh restart