반응형
반응형

Oracle Jdk 1.8버전을 받아서 내부 시스템에서 활용을 하고 있었는데, SNS나 여기저기 커뮤니티에서 Oracle이 야금야금 라이센스를 걸고 넘어지기 시작했다는 소문을 접수하고, OpenJdk로 전부 다 갈아버리기도 마음을 먹었다.


Oracle Jdk 1.8은 Binary 형태로 압축을 풀어서 환경변수만 맞춰서 사용했었는데, OpenJdk 1.8 버전은 아직 Binary로 제공하진 않는 것처럼 보여서, 패키지 설치로 진행하기로 했다.


일반적으로 다 잘 동작했는데, 서버 간 Https 통신하는 부분에서 아래와 같은 에러가 발생함.

...
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
...

구글링을 좀 해보니, java 인증서가 설치되어 있지 않은 이슈였다.

실제로 /etc/ssl/certs/java/ 경로에 가보니 아무것도 없어서, SSL 통신이 안됐던 거였음.


아래와 같은 명령어로 기존에 있던 인증서를 정리한 후, 다시 설치 해주면 해결 된다. (Ubuntu 14.04 기준)

$ sudo dpkg --purge --force-depends ca-certificates-java
$ sudo apt-get install ca-certificates-java


어플리케이션 종류에 따라, 어플리케이션 재실행을 해야 될 수도 있음.

반응형
,
반응형

Windows환경에서 git bash를 이용해서, Linux 서버에 배포를 하는 작업을 주로 하는데, add 하는 과정에서 CRLF가 붙어버려서, 일반적으로는 문제가 없지만, 쉘 스크립트 등은 치명적일 수 있기 때문에, 이를 방지하는 설정이 있다는 걸 알게 되었다.


사실 문제가 생겨서는 아니고, add 할때마다 아래와 같은 Warning 메시지가 나오는게 거슬려서 찾아보게 됨.

warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory.


git bash를 띄워서, 아래와 같은 명령어를 입력하면 자동으로 CRLF가 생성되는 것을 방지한다.

$ git config --global core.autocrlf false


반응형
,
반응형

args 부분에 bootindex=99를 추가해주면 됨.

# /etc/pve/qemu-server/100.conf
# Before
args: -device 'piix3-usb-uhci,addr=0x18' -drive 'id=synoboot,file=/var/lib/vz/images/100/synoboot.img,if=none,format=raw' -device 'usb-storage,id=synoboot,drive=synoboot'
# After
args: -device 'piix3-usb-uhci,addr=0x18' -drive 'id=synoboot,file=/var/lib/vz/images/100/synoboot.img,if=none,format=raw' -device 'usb-storage,id=synoboot,drive=synoboot,bootindex=99'


noVNC들어가서 부팅순서 아무리 변경하고 boot, bootOrder 옵션 아무리 바꿔줘봐도 적용이 안되는데, args에다가 index 지정해주니깐 원하는대로 동작한다.

반응형
,
반응형

Native를 사용하다가 Proxmox환경에 올려봤는데, 시리얼 넘버가 이상해서 변경할 일이 생겼다.


virtio driver만 사용할 수 있는 부트로더를 받았기 때문에, 시리얼 넘버가 ds3615xs의 시리얼 넘버 포맷 (xxxxLWN00xxxx)과 맞지 않아서 썸네일 생성이 안됨.


Native나 vmware에 올린 경우는 그냥 USB나 iso 파일 열어서 grub.cfg 파일을 수정하면 되지만, proxmox의 경우 usb drive를 hotplug방식으로 bootup될때 mount하는 방식이라서, ssh 레벨에서 컨트롤 해주어야 한다. 


일단 dsm에서 ssh 접근 후, /dev/ 경로 아래에 synoboot(숫자)를 일일히 mount하여 grub.cfg 파일을 찾아내야 한다. (일반적으로 synoboot1인듯)

아래 예제는 synoboot1이 grub.cfg를 가지고 있는 파티션이라 가정한다.

$ cd /dev/
$ mkdir /mnt/synoboot1
$ mount /dev/synoboot1 /mnt/synoboot1


grub폴더의 grub.cfg파일을 열어서, set sn1 부분을 변경 후 재부팅하면 된다.

(참고 링크 : http://xpenology.me/how-to-generate-synology-mac-and-serial-valid-pair/)

정품 시리얼을 구해서 넣어야 함.. 정품 시리얼을 입력하지 않으면 동영상 파일들의 썸네일 생성과 Transcoding이 제한된다.


주의할 점은, mac 주소는 그대로 유지해두어야 한다. 괜히 real mac으로 변경했다가 부팅이 안됬던 참사가 발생함; (참사가 발생한 경우는 아래 빨간글씨 이하를 참고하자.)


혹시나 real mac으로 변경해서 부팅이 안되는 경우는, proxmox에서 vm을 잠시 내린 후에 아래와 같이 하면 된다.


1. kpartx를 설치 (kpartx는 img 파일을 리눅스 파일시스템으로 mount할 수 있게 해주는 프로그램이다.)

$ apt-get install kpartx


2. kpartx를 이용하여 bootloader를 풀어 준다. (/dev/mapper/ 경로에 하나씩 매핑된다.)

$ kpartx -a -v 부트로더가 위치한 경로/synoboot.img
add map loop0p1 (253:7): 0 30720 linear 7:0 2048
add map loop0p2 (253:8): 0 61440 linear 7:0 32768
add map loop0p3 (253:9): 0 8159 linear 7:0 94208


3. 생성된 파티션을 mount한다. (보통 첫번째 파티션이 grub.cfg 파일이 존재하는 파티션이지만, 아닐 경우 나머지도 시도해본다.)

$ mkdir /mnt/loop0p1
$ mount /dev/mapper/loop0p1 /mnt/loop0p1


4. 이제 /mnt/loop0p1 폴더로 이동해서 grub파일을 수정한다.


5. grub.cfg 파일을 수정했으면, umount 해준다. (umount 전에 디렉토리를 지워버리면, bootloader 자체가 망가져버리는 참사가 발생하니 주의하자.)

$ umount /mnt/loop0p1
$ rm -rf /mnt/loop0p1
$ kpartx -d -v 부트로더가 위치한 경로/synoboot.img


6. vm 부팅



반응형
,
반응형

코인거래소의 API를 연동할 일이 생겨서, 작업을 해서 최종적으로 github에 올리게 되었는데, 이전 직장에서 사용하던 git 사용 습관상 master branch는 건드리지 않고, master branch를 새롭게 clone떠서 다른 branch로 만든 후 push, 그 후 master branch의 내용을 다른 branch와 rebase 하는 작업을 하다보니..


rebase 특성 상, commit 을 일렬로 쭉 나열하기 때문에, 테스트간 API Key를 넣어서 로컬에서 commit했던 이력도 전부 다 github에 올라가게 되버리는 참사가 일어나게 되었다. 


이게 SVN만 사용하다보니, 로컬 commit이 같이 push가 될거라고는 생각을 못했는데, 치명적인 실수였던 것 같다.


당장 Key가 노출되었기 때문에, 거래소 API Key는 바로 삭제처리하고, 조금 더 완벽하게 하기 위해 github에 이미 올라간 API Key가 노출된 commit(HEAD 기준 바로 전 커밋)도 같이 없애 보기로 하였다.


아래와 같이 작업을 계획했고, 그 결과 자연스럽게 내가 노출한 Commit을 Commit을 안한거처럼 보이게 할 수 있었다.


1. remote repo 현재 버전을 로컬에 clone

$ git clone <Remote REPO URL>

2. 로컬에서 git rebase 명령어를 통해 HEAD와 바로 전 Commit을 합침

$ git rebase -i HEAD~2   # HEAD 포함 2개까지의 Commit을 하나의 Commit으로 만들겠다.
# 위 명령어를 치면 editor가 열리며 아래와 같이 해당되는 Commit들이 목록에 보여짐
# 아래부터는 전부 Editor 메시지
pick 111111 HEAD 바로 이전 Commit
pick 222222 HEAD Commit

# HEAD 바로 이전 Commit과 HEAD를 합치기로 했으므로, HEAD 부분의 커밋에 해당하는 라인의 가장 앞에 있는 pick을 squash로 바꿔주고, 저장 후 빠져나온다.
pick 111111 HEAD 바로 이전 Commit
squash 222222 HEAD Commit

# 이제 다시 editor가 뜨며, 새로운 commit 메시지를 입력하라고 나온다. 2개의 Commit을 자연스럽게 합치고, 메시지를 뭘로 할지 결정해서 입력해주고, 저장 후 빠져나온다.
# 주의사항이 있다면, 주석을 제외한 모든 텍스트가 Commit 메시지가 된다.
# This is the 1st commit message:
HEAD 바로 이전 Commit

# This is the commit message #2:
HEAD Commit

3. remote repo에 push (github 정책 상 커밋 이력을 수정하게 되면 다른 사용자가 pull을 받은 경우 conflict이 날 수 있기 때문에, 기본적으로 허용을 안한다고함.. 이런 경우 --force 옵션을 사용하여 강제로 덮어버릴 수 있다.)

$ git push origin master --force



반응형
,
반응형

Dapp이나 블록체인 기술이 요즘 핫하기 때문에, geth 라는 Go언어로 만들어진 이더리움 네트워크에서 사용할 수 있는 기능들을 제공하는 콘솔? 데몬? 프로그램? (애매함..)을 세팅해보았다.


Windows에서 잘될거란 기대는 처음부터 안했고, Background 지원 등 복잡한 부분이 많기 때문에, 처음부터 Linux환경에서 docker container를 통해 띄워보는 것으로 결정하였다.


Dockerfile을 아래와 같이 작성해주었다.

ENTRYPOINT 부분이 조금 긴데.. 옵션값들을 입맛에 맞게 수정해주면 된다. 여기서는 개발용으로 띄울 것이고 (--dev), rpc 프로토콜을 이용할 것이며(--rpc), rpcapi를 통해 이용할 기능 몇가지(--rpcapi=...)를 명시해주었고, rpcapi는 localhost 뿐만이 아닌, 외부에서도 접근이 가능하게 해주었다. (--rpcaddr=0.0.0.0)

ip를 외부로 열었지만 혹시나 모를 crossdomain이슈를 방지하기 위한 옵션과(--rpccorsdomain=*), Data경로도 변경해주었다. (--datadir) 

FROM golang:1.7

# for faster download of container, run all commands at once to create only one docker filesystem layer
RUN \
  go get github.com/ethereum/go-ethereum/cmd/geth && \
  rm -rf /go/pkg /go/src && \
  mkdir /blockchain

VOLUME /blockchain

EXPOSE 30303
EXPOSE 8545

ENTRYPOINT ["/go/bin/geth", "--dev", "--rpc", "--rpcapi=db,eth,net,web3,personal", "--rpcaddr=0.0.0.0", "--rpccorsdomain=*", "--datadir=/blockchain"]


docker-compose.yml는 아래와 같이 작성해주었다.

8545포트는 rpc api를 이용하기 위해 host 머신과 연결해주었다.

version: '2'
services:
  geth:
    build: .
    ports:
      - 8545:8545


docker를 사용해본 사람은 알겠지만, Dockerfile과 docker-compose.yml은 같은 경로에 위치해야 위 파일들이 제 역할을 하게 된다.


그리고, docker-compose up -d 를 통해 geth를 띄워준다.

$ docker-compose up -d


여기까지 rpc 통신 허용은 완료되었고, 이제 ipc 콘솔에 직접 붙어서 테스트를 해야 하는데, docker에 올렸기 때문에 당연하겠지만, 컨테이너 내부의 shell로 진입하여 작업을 해야 한다.

$ docker-compose exec geth sh
# cd /blockchain
# geth attach ipc:./geth.ipc


여기까지 진행하면, ipc 콘솔에서 이더리움 네트워크에서 제공하는 여러가지 기능들을 이용해볼 수 있게 된다.

반응형
,
반응형

Docker image나 pull을 private registry에서 이용하는 경우, private registry에서 https 프로토콜을 지원하지 않거나 사설인증서를 사용하는 경우 아래와 같은 에러가 발생할 수 있다.

root@u-01:~# docker pull abc.iptime.org:5000/helloWorld
Using default tag: latest
Error response from daemon: Get https://abc.iptime.org:5000/v1/_ping: http: server gave HTTP response to HTTPS client


기본적으로 registry와의 통신은 https 프로토콜을 이용하기 때문인데, 이를 무시하고 http프로토콜을 사용하게 하려면, /etc/default/docker 파일에서 DOCKER_OPTS 항목을 아래와 같이 수정하면 된다.

# /etc/default/docker
...
DOCKER_OPTS="--insecure-registry abc.iptime.org:5000"
...


수정 후 docker 서비스를 재시작해준다.

service docker restart


반응형
,
반응형

일단 DSM 버전은 6.1.4를 사용하고 있고, Linux에 대해서 기본적인 건 안다는 가정하에 설명하고, 본인의 포스팅을 따라하다가 발생하는 문제는 본인이 책임지지 않음.. (댓글 문의는 받아요)


아래는 실패 과정이라 쪼끄맣게..

Download Station에서 완료 후 계속 shell 실행을 못하길래.. (apparmor 이슈..) apparmor 설정을 바꿔서 리붓도 해보고 별짓을 다해보고, Transmission도 설치해봤지만, docker로 올려서 그런건지 Transmission 자체가 문제인건지, DSM에서 인덱싱을 못하는 문제가 발생하여 결국 Download Station을 다시 설치 후 시도했더니 성공하여 히스토리를 남길 겸 포스팅을 하게 됨.


조금 복잡하기 때문에, Telegram Bot을 만드는 과정 및, Bot Token, Chat ID를 알아내는 방법은 생략한다. (구글링해보면 많이 나올것임)


전체적인 매커니즘은 아래와 같다.


1. Download Station을 이용하여 다운로드를 함.


2. 다운로드가 완료되는 순간 내부적으로 동작하는 transmissiond의 기능인 script-torrent-done-enabled를 통하여, 쉘 스크립트 실행


3. 쉘 스크립트는 텔레그램 메신저로 메시지 발송하고, 완료된 목록을 postgresql에 쿼리를 날려서 지움.


내가 다룰 내용은 2~3번에 해당하는 내용임.

서두가 길었고, 이제부터 해야할 작업을 설명해보겠음.


1. Download Station을 패키지센터에서 종료한다.


2. ssh를 이용하여 쉘로 진입하여, Root권한을 획득한다.

$ sudo su -


3. Download Station 재부팅 간 설정파일을 초기화하지 않도록 변경하기 위해, 아래 명령어로 스크립트 파일을 연다.

$ vi /var/packages/DownloadStation/scripts/start-stop-status


4. rm ${PACKAGE_DIR}/etc/download/settings.json 이라고 적혀있는 부분을 찾아서, 앞에 #을 붙여 주석처리해주고 저장한다.

# rm ${PACKAGE_DIR}/etc/download/settings.json


5. 설정 변경을 위해 아래 명령어로 설정 파일을 열어준다.

$ vi /usr/syno/etc/packages/DownloadStation/download/settings.json


6. script-torrent-done-enabled, script-torrent-done-filename을 찾아서 아래와 같이 변경해준다. (volume경로는 본인이 사용중인 경로에 맞게..)

"script-torrent-done-enabled": true,
"script-torrent-done-filename": "/volume1/@appstore/DownloadStation/bin/tr_complete.sh",


7. postgresql의 계정정책 관련 설정을 변경해준다.

$ vi /etc/postgresql/pg_hba.conf


8. 파일을 열어보면 아래와 같이 되어 있을텐데, 변경해준다.

Before)

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             postgres                                peer map=pg_root
local   all             all                                     peer

After)

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             postgres                                trust
local   all             all                                     peer

이걸 안하면, OS계정과 postgresql 계정이 다른 상황에서 원격 쿼리를 날리는 경우 아래와 같은 에러가 발생하기 때문이다. 

psql: FATAL:  Peer authentication failed for user "postgres"


9. 설정을 변경했으니, postgresql을 재시작 해주자.

$ /usr/syno/etc.defaults/rc.sysv/pgsql.sh restart


10. 이제 6번 과정에서 script-torrent-done-filename 부분에 입력했던 경로로 이동하여, 쉘 스크립트를 만들어주자.

$ vi /volume1/\@appstore/DownloadStation/bin/tr_complete.sh

스크립트내용)

#!/bin/sh

TOKEN='당신이 만든 BOT의 BOT Token 입력'
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage?disable_notification=true&chat_id='
CHAT_ID='당신이 만든 BOT의 CHAT ID 입력'

function send_message {
  res=$(/usr/bin/curl --data-urlencode "text=[DS Get] $TR_TORRENT_NAME download complete." "$MSG_URL"$CHAT_ID"&")
}

send_message
/bin/psql -U postgres -d download -c "DELETE FROM Download_queue WHERE status IN ('5','7','8')"


11. 패키지센터에서 DownloadStation을 시작해준다.


12. DownloadStation에서 다운로드 완료 후, 당신이 개설한 텔레그램 방에 [DS GET] 토렌트명 download complete 라고 메시지가 오고, 완료된 목록은 자연스럽게 사라지면 성공!


공식적으로 DownloadStation에서 제공해줘야 할 기능을 제공을 안해줘서, 이렇게 삽질을 하다니... 뭐 그래도 무료니까 봐줌.

반응형
,
반응형
adb shell am start -n {패키지명}/{메인 액티비티명}


사용하던 매크로에서 기능 패치가 안되서 찾아봤는데 이 쪽도 재미있어보인다.

반응형
,
반응형

윈도우 환경에서 Batch를 짜서 작업 스케줄러에 등록하면, 기본적으로 명령프롬프트 윈도우가 하나 뜨기 때문에, 실제 사용하고 있는 컴퓨터에서 돌아가고 있다면 거슬릴 것이고, 서버라고 하더라도 보기가 안좋다.


이런 경우에는 VB Script를 이용해서 Batch 스크립트를 실행하면 깔끔하다.


아래와 같이 작성하고, 파일명.vbs 로 저장해서 실행하면 됨.

Set WinScriptHost = CreateObject( "WScript.shell" )
WinScriptHost.Run Chr(34) & "C:\실행할배치파일.bat" & Chr(34), 0
Set WinScriptHost = Nothing



반응형
,
반응형