23 Oct 2010

Move to Fedora


Have to forget Gentoo for a while, my laptop just does not work well with source based distro, graphic card is too hot during compiling time, need to replace 3 times on a half year.
Next time, I should take time to look at graphic card type before buying new laptop.
Maybe Fedora is right choice for this time, it was my first Linux distro, bring me to this Linux_World.
See you, Gentoo!

21 Oct 2010

Fabric và ssh_key + passphrase

SSH (OpenSSH client) là công cụ mà bất cứ ai làm việc với Unix, Linux đều phải dùng tới, cho dù là lập trình viên, quản trị hệ thống, hay quản trị cơ sở dữ liệu.
Để ssh tới một máy chủ *nix, thông thường có 2 cách:
1.1. Sử dụng password (Không an toàn, có thể bị lộ, hoặc bị bruteforce, không nên dùng)
1.2. Sử dụng mã hóa công khai (public key authentication, cách này an toàn hơn, tránh được các nguy cơ trên)

Với cách thứ 2, một khi máy làm việc bị nhân nhượng, hoặc đơn giản là ai đó ngồi vào máy tính, lấy được private key, xem như hầu hết mọi server (dùng key này để login) đều bị nguy hiểm (Trừ phi sử dụng truecrypt để mã hóa phân vùng đặc biệt, khi dùng thì mount lên, kẻ nào đó ngồi vào đúng lúc đã mount cũng coi như xong). Do đó, để tăng khả năng an toàn, nên dùng thêm một passphrase cho private key của riêng mình.
Khi dùng private key với passphrase, mỗi khi muốn sử dụng key này, hệ thống sẽ yêu cầu nhập vào một chuỗi password đã ấn định khi tạo key.

30 Sep 2010

CryoPID

Khi làm việc trên hệ thống, ta thường dùng screen hay tmux để duy trì shell session trong trường hợp network xảy ra sự cố, hoặc duy trì nhiều session chỉ với một phiên kết nối ssh.
Tuy nhiên, trong trường hợp nào đó mà
    - có thể command được sử dụng bên ngoài screen hoặc tmux session, hoặc người sử dụng command không nghĩ rằng phải mất một khoảng thời gian lâu hơn dự kiến để tiến trình thực hiện xong.
    - screen và tmux không duy trì được session sau khi hệ thống reboot.
    - screen và tmux chỉ làm việc trên hệ thống cục bộ, không thể tái sử dụng session đã tạo trên hệ thống khác.

Bernard B đã phát triển cryoPID để khắc phục những nhược điểm nói trên. Khi một tiến trình đang thực hiện, mà vì một sự cố nào đó ta cần stop tiến trình này để reboot hệ thống, hoặc khắc phục một lỗi critical nào đó, hoặc chỉ dừng tiến trình để tái sử dụng bên trong screen session, hoặc dùng tiến trình dang dở trên một hệ thống khác, cryoPID có thể làm đóng băng tiến trình đang thực hiện thành một image file có thể tự động extract và execute mà không cần chương trình trợ giúp.

Ví dụ, khi đang thực hiện lênh cp một file có dung lượng khá lớn, chỉ cần dùng ps và grep tìm PID của cp, sau đó:
$ freeze image_name PID
sau khi reboot, chỉ cần run ./image_name là tiến trình được khôi phục với state như cũ, tiện lợi nhỉ?

Tuy nhiên cryoPID còn có nhiều nhược điểm, và nhiều tính năng cần được nâng cấp, mà tác giả có nêu rõ trên cryoPID website.

Bản thân mình cảm thấy rất thích công cụ này ngay từ ý tưởng của nó!
Để cài đặt cryoPID hệ thống cần có gcc, g++ và zlibc.

23 Jul 2010

23072010

Tự nhiên nhỏ em đưa cho mình xem blog của Mẹ, đọc một lúc, đọc xong hết, 21 bài. Lúc con trai đi công tác xa, lúc con gái đi học ĐH, lúc con được tăng lương, lúc cô đơn ở nhà một mình, sao nhỉ?

Tự nhiên buồn ghê gớm, Mẹ mình. 3 đứa con đều đi xa, cả cuộc đời làm lụng vất vả, gấp gáp trong từng phút, dành dụm mãi từng đồng từng cắt lo cho con, đến bây giờ vẫn chưa được phút giây sung sướng nào, có lúc nào Mẹ được giải bày tâm trạng? Cũng may còn có Ba.

Giá như Mẹ mình cũng việt blog nhỉ?

10 Jul 2010

Thời gian

Hôm nay bạn vừa từ xa trở về, trí nhớ chỉ ghi lại bạn đi đã khá lâu, không nhớ chắc chắn là bao nhiêu ngày, tháng, hay năm. Hỏi mới biết là đã 2.5 năm, lâu quá là lâu.

Tự nhiên bất giác nhớ lại, mình ở cái đất sài gòn này 7 năm trời rồi, con của chị hàng xóm từ lúc mới sinh, đầu năm nay đã vào lớp một, mặc áo mới, chạy khoe khắp xóm. Rồi nhớ lại, năm cấp III lớp mình có một cặp yêu nhau, chúng nó vừa phát thiệp mừng, tình yêu đó vỏn vẹn 10 năm, ha ha, thời gian dài mà nhanh tới chóng mặt.

Mình thường sợ khi đứng trước những dự định, kế hoạch lâu năm, kiểu như nếu bây giờ phải học thêm 4 năm nữa thì già mất tiêu rồi, rồi kiểu như gắn bó với nơi A này vài năm thì được hưởng phúc lợi gì đó, sợ rằng trong thời gian dài đằng đẳng đó có xảy ra chuyện gì thì sao? Nên luôn hướng tới những cái ngắn, ít quan tâm đến việc xây dựng cái gì đó lâu bền.

Việc học của mình cũng vậy, nếu (mình ghét khi dùng những cái nếu thì, nhưng đang tâm trạng :"> ) ngày trước mình nhìn ra được hi sinh vài năm mài đũng quần ở ghế giảng đường, thì bây giờ có lẽ khá hơn nhiều, nhưng mình không hối tiếc chút nào, chỉ là suy nghĩ thế thôi.

26 Jun 2010

Down hết hình trên wallbase.net

#!/usr/bin/env python
import re, os
from urllib2 import urlopen
all_tag = []

def search_tag():
    index_page = 'http://wallbase.net'
    try:
        _page_ = urlopen(index_page)
        _html_ = _page_.readlines()
        _page_.close()
        p = re.compile(r'http://wallbase\.net/search/[a-z]+\"')
        for line in _html_:
            tag = p.findall(line)
            if tag:
                for i in tag:
                    all_tag.append(i[:-1a])
            else:
                continue
    except Exception, e:
        print "Connection Error!" + str(e)

def getsession(num):
    org_url = "http://wallbase.net/wallpaper/"
    second_url = org_url + num 
    _prefix = "http://wallpapers.yotoon.pl/rozne/"
    ext = '.jpg'
    fullname = "wallpaper-" + num + ext
    try:
        _page_ = urlopen(second_url)
        _html_ = _page_.readlines()
        _page_.close()
        for line in _html_:
            st = line.find(_prefix)
            nd = line.find(fullname)
            if st <> -1 and nd <> -1: 
                final = line[st:nd] + fullname
                print final
                os.system('wget ' + final)
            else:
                continue
    except Exception, e:
         print "Cannot connect to server!" + str(e)
         pass
                
def getnum(list_tag):
    for page in list_tag:
        try:
            response = urlopen(page)
            content = response.readlines()
            response.close()
            for line in content:
                a = line.find('thumb-')
                b = line.find('jpg') 
                if a <> -1 and b <> -1:
                    c = a + 6
                    d = b - 1
                    number= line[c:d]
                    getsession(number)
                    continue
                else:
                    continue
        except:
            print "May be we got wrong image url!"
        
if __name__ == '__main__':
    search_tag()
    getnum(all_tag)
exit()
Net chậm thì down chắc mất cả tháng :-D

9 Jun 2010

Nagios plugin

1st time I try to write plugin for nagios, it's really easy and simple with python :-). If you dont know how to use, please read this
First, check if we can reach website, then count response time and return nagios status.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Hung Nguyen Van
# 09-06-2010
from urllib2 import urlopen
import time, sys, socket

def timer(_dest):
    timeout = 10
    socket.setdefaulttimeout(timeout)    
    try:
        _response = urlopen(_dest)
    except:
        print "CRITICAL: Cannot connect to server!"
        sys.exit(3)
    start_time = time.time()
    _response = urlopen(_dest)
    end_time = time.time()
    final = end_time - start_time
    return final

if __name__ == '__main__':
    _dest = "https://" + sys.argv[1]
    seconds = timer(_dest)
    if seconds >= 10.0:
        print "CRITICAL: Server took %.2f seconds to response" % (seconds)
        sys.exit(2)
    if seconds >= 7.0:
        print "WARNING: Server took %.2f seconds to response" % (seconds)
        sys.exit(1)
    else:
        print "OK: Server took %.2f seconds to response" % (seconds)
        sys.exit(0)

19 May 2010

Clone hard disk

With dd_rescue, this task becomes more easy.
1. boot into a Linux LiveCD, use fdisk -l to identify your hard disks, if /dev/sda is the old one, and /dev/sdb is the new one, go to next step
2. install sys-fs/ddrescue, and clone the disk
ddrescue -v /dev/sda /dev/sdb
this task will complete after 2 hours or less if the old one is 80GB hard disk (in my case)

3. almost finish, remove the old one, boot into the new one, your os should be ok.

4. another task: if new hard drive is bigger than the old one, free space will not be used, you will see it as free space, create new partition and mount it, or resize current partitions.

5. if you're using LVM2 for your system, read this

11 May 2010

lump



Lâu lắm rồi không cafe về đêm (khoảng giữa 9h đêm cho đến khuya), cũng rất hiếm khi ra ngoài quá 11h, đi chả để làm gì, mà về cũng chả để làm gì, ngoan lạ.

31 Mar 2010

rsync modules

Dùng cái này
#!/usr/bin/python
import os
root = '/home/'
names = os.listdir(root)
#names = open('/mnt/data/names.txt','r')
names.sort()
for line in names:
#    if not line:
#        break
    if not os.path.isdir(root + line):
        continue
    if line == 'lost+found':
        continue
    print "[" "%s" "]" %line
    print '        comment = ''%s' %line
    print '        path ='+root +line
    print """        use chroot = yes  
        max connections=10  
        lock file = /var/lock/rsyncd  
        read only = no  
        list = yes 
              """
    print '        uid= '+line
    print '        gid= '+line
    print """        ignore errors = no  
        ignore nonreadable = yes  
        transfer logging = no  
        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.  
        timeout = 600  
        refuse options = checksum dry-run  
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz  
              """

với cái này sẽ tiết kiệm được chút thời gian và công sức :).

29 Mar 2010

Bị tấn công

Kiểm tra /var/log/messages thì phát hiện ra cái này http://pastebin.com/Wz8LE7tW
Cái hơi hay ho ở đây là log trên của laptop. Không biết bạn nào rảnh đi brute force ssh laptop của mình ;))

6 Mar 2010

Stupid

Just updated my gentoo box and some features get problem. All should be solved by running "revdep-rebuild" to re-install some missing library. But there's an interesting bug (?) of wicd after update :). You cannot start wicd daemon with error
g3n2 ~ # /etc/init.d/wicd restart
/etc/init.d/wicd: line 12: syntax error: unexpected end of file
 * ERROR:  /etc/init.d/wicd has syntax errors in it; aborting ...
Take a look at wicd init script, someone who made update for wicd did make a mistake:
#!/sbin/runscript
 2 # Copyright 1999-2006 Gentoo Foundation
 3 # Distributed under the terms of the GNU General Public License v2
 4 
 5 opts="start stop restart"
 6 
 7 WICD_DAEMON=/usr/sbin/wicd
 8 WICD_PIDFILE=/var/run/wicd/wicd.pid
 9 
10 depend() {

11                   need dbus
Function depend() has no close parenthesis, and where is start() and stop() function? I don't know.I solved it by adding some line like bellow:
1 #!/sbin/runscript
 2 # Copyright 1999-2006 Gentoo Foundation
 3 # Distributed under the terms of the GNU General Public License v2
 4 
 5 opts="start stop restart"
 6 
 7 WICD_DAEMON=/usr/sbin/wicd
 8 WICD_PIDFILE=/var/run/wicd/wicd.pid
 9 
10 depend() {
11     need dbus
12     }
13 start() {
14             ebegin "Starting wicd daemon"
15                     "${WICD_DAEMON}" >/dev/null 2>&1
16                             eend $?
17 }
18 
19 stop() {
20             ebegin "Stopping wicd daemon"
21                     start-stop-daemon --stop --pidfile "${WICD_PIDFILE}"
22                             eend $?
23 }
Who works for the maintenance of wicd on gentoo? wtf

4 Mar 2010

portage-2.1.8 has new --rebuilt-binaries option

In portage-2.1.8 there's a new emerge --rebuilt-binaries
option that is very useful for people who build binary packages and
install them on multiple computers (using PORTAGE_BINHOST or shared
PKGDIR). The option causes packages to be automatically reinstalled in
cases when rebuilt binary packages are available (due to revdep-rebuild
or similar cases).
Rebuilds are detected by comparison of BUILD_TIME package metadata.
This option is enabled automatically when using binary packages
(--usepkgonly or --getbinpkgonly) together with --update and --deep.


http://blogs.gentoo.org/zmedico/2010/03/03/rebuilt_binaries_portage_2_1-8

12 Feb 2010

Love songs

#!/usr/bin/env python
# python script to download love songs from mp3.zing.vn
# hungnv
# license: Public Domain
from urllib2 import urlopen
from urllib import urlretrieve
from os import mkdir
from os.path import join, isdir
import sys
mp3_dir = "/home/hungnv/Music/"
html_source = "http://mp3.zing.vn/mp3/nghe-album/album-hot/love-song.html"
if not isdir(mp3_dir):
    try:
        mkdir(mp3_dir)
    except:
        print "cannot create directory %s" %mp3_dir
        sys.exit(1) 
def getlink():
    try:
        response = urlopen(html_source)
    except:
        print "connection error"
    response = urlopen(html_source)
    content = response.readlines()
    response.close()
    for line in content:
        a = line.find('http://dl.mp3.kapsule.info')
        b = line.find('?')
        if a <> -1 and b <> -1:
            link = line[a:b]
            c = line.find('filename') + 9
            d = line.find('alt') - 2
            filename = line[c:d]
            print "Song named %s will be downloaded at url %s" % (filename,link)
            print "Downloading.....\n"
            abs_path = join(mp3_dir,filename)
            urlretrieve(link,abs_path)
        else:
            continue
if __name__ == '__main__': 
    getlink()
exit()

27 Jan 2010

Indispensable job

I have an account named hungnv on my server - vndev.net which's running Fedora 8. If I want to remote copy, modify, delete... some files on this server , which way is faster:
1. sftp ( known as an extension of secure shell protocol - SSH ) 
hungnv@g3n2 ~ $ sftp vndev.net
Connecting to vndev.net...
sftp>
Browse local file: lls, move to local directory lcd
upload put
download get

2. sshfs (not an ssh extension, we must install fuse-sshfs to use it)
hungnv@g3n2 ~ $ eix sshfs
[I] sys-fs/sshfs-fuse
     Available versions:  1.9 ~2.1 2.2
     Installed versions:  2.2(08:46:14 AM 01/27/2010)
     Homepage:            http://fuse.sourceforge.net/sshfs.html
     Description:         Fuse-filesystem utilizing the sftp service.
hungnv@g3n2 ~ $ sudo emerge -av sys-fs/sshfs-fuse
hungnv@g3n2 ~ $ sshfs vndev.net:/ /vndev
to mount. We browse, cp, edit, delete....like local file and directory.
I didn't use sshfs until yesterday, with me, ssh and sftp are enough. But I should know sshfs and I did not know, so I fail.
We must learn what we never use =.=

22 Jan 2010

Phân hóa thu nhập từ nhiều góc nhìn

Trong một phát biểu của Trần Trọng Thức ở Tuần Việt Nam
Trong khi có những người giàu lên không bằng năng lực cũng chẳng nhờ vào thời cơ, mà nhờ vào các mối quan hệ. Hầu hết các nước kém phát triển, khi quyền lực liên kết với tư bản trong làm ăn thì phân hóa giàu nghèo càng khó giải quyết. Về mặt lý thuyết thì quyền lực chính trị là khả năng quyết định ai sẽ nhận được "cái gì" để làm ra được "cái gì" và cho ai được hưởng.
Thực tế đơn giản là thực tế :-D.

21 Jan 2010

Học python

Sửa lại chút cái shell script hồi xưa Dreammedia , viết lại bằng python.
Bạn nào dùng thì nhớ nếu tên ban nhạc hoặc album có khoảng trắng, thì thêm vào thành "band name" hoặc "album name" :).

#! /usr/bin/env python
# Script to download Music from Dreammedia.ru
# Try to find your favorite Band and Album, then use this script
# hungnv coded 
import os
import urllib2
import sys
def usage():
        print "Usage:",sys.argv[0], "\"bandname\" \"albumname\""    
        
def st_replace(string):
        new = string.replace(' ','%20')
        return new
            
def download(url,pl,band,album):
        band1 = st_replace(band)
        album1 = st_replace(album)
        temp = (url + pl[:8] + '/' + band1 + '/' + album1 + '/' + pl)
        try:
                response = urllib2.urlopen(temp)
        except:
                print 'Connection error'
        response = urllib2.urlopen(temp)
        content = response.readlines()
        for line in content:
                a = line.find('music/')
                b = line.find('.mp3')
                if a <> -1 and b <> -1:
                        path = line[a:b+4]
                        semi = (url + '%s') %path
                        final = st_replace(semi)
                        os.system('wget '+final)
                else:
                        continue
                        
if __name__ == '__main__':
        band = sys.argv[1]
        album = sys.argv[2]
        url = "http://dreammedia.ru/"
        pl = 'playlist.xml'
        if len(sys.argv) <> 3:
                usage()
                exit()
        else:
                download(url,pl,band,album)
exit()


Disqus