Thứ Sáu, 21 tháng 3, 2014

Cơ bản về Wget

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ man Wget

WGET(1)                            GNU Wget                            WGET(1)

NAME
       Wget - The non-interactive network downloader.

SYNOPSIS
                     wget [option]... [URL]...


Nhiều tùy chọn V~
Đây là bài giới thiệu một số tính năng cơ bản với Wget

Wget là cái khỉ gì????

GNU Wget is a free utility for non-interactive download of files from
the Web.  It supports HTTP, HTTPS, and FTP protocols, as well as
retrieval through HTTP proxies.

Nó là một ứng dụng FREE, là chương trình non-interactive tải file từ web
Wget là một chương trình tải dữ liệu không tương tác (non-interactive) nghĩa là nó có thể chạy nền (background) trong khi user không đăng nhập vào hệ thống

Cấu trúc sử dụng wget:

                     wget [option]... [URL]
Trong đó:
  • Các tham số (option) dùng tùy vào hoàn cảnh.
  • URL là đường link tới file (nội dung) cần tải.

1. tải một file đơn:
                                               ~$ wget URL

2. Tải file đơn và lưu nó dưới tên tùy chọn
                                             ~$ wget -O tên-file URL

3. Tải file trong chế độ nền với tùy chọn -b
Giả sử bạn cần tải một file dung lượng lớn và không dùng máy tính trong thời gian đó, wget hỗ trợ một tính năng rất hay là tải file trong chế độ nền. Câu lệnh bạn sẽ sử dụng là:
                                           ~$ wget -b tên-file URL

4. Kiểm tra URL với tùy chọn –spider
Để kiểm tra sự tồn tại của URL trước mỗi lần tải, tránh các sự cố do link không tồn tại... bạn chỉ cần dùng tùy chọn –spider.  
                                            ~$ wget -spider tên-file URL

5. Tăng số lần retry download bằng tùy chọn –tries
Mặc định thì wget sẽ thử tới 20 lần retry nếu việc tải dữ liệu không thành công. Nếu bạn muốn thay đổi số lần retry thành 50 lần thì câu lệnh sẽ như sau:
                                           ~$ wget --tries=50 URL 
 

Quản lý package trên ubuntu/debian

Nguồn
http://www.familug.org/2013/09/cli-cac-lenh-quan-ly-package-tren.html#more

1. Tìm tên Package:

                 ~ $ apt-cache search ten-chuong-trinh

Tên của chương trình không có nghĩa là tên của package đó
mà muốn cài đặt một chương trình thì bạn phải biết được tên package của chương trình đó

ví dụ bạn muốn cài flak - một micro web flamework

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ sudo apt-get install flask
[sudo] password for thanhnguyen1010:
Reading package lists... Done
Building dependency tree      
Reading state information... Done
E: Unable to locate package flask

không có tên package nào là flask
để tìm tên package:

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ apt-cache search flask
libselinux1 - SELinux runtime shared libraries
libselinux1-dev - SELinux development headers
libsepol1 - SELinux library for manipulating binary security policies
checkpolicy - SELinux policy compiler
libsemanage-common - Common files for SELinux policy management libraries.
libsemanage-ruby1.8 - Ruby bindings to for SELinux policy management
libsemanage1 - SELinux policy management library.
libsemanage1-dev - Header files and libraries for SELinux policy manipulation
policycoreutils - SELinux core policy utilities
python-flask - micro web framework based on Werkzeug, Jinja2 and good intentions
python-flaskext.wtf - Simple integration of Flask and WTForms
python-selinux - Python bindings to SELinux shared libraries
python-semanage - Python bindings for SELinux policy management
python-uwsgicc - uWSGI control center
ruby-selinux - Ruby bindings to SELinux shared libraries

==> để cài flask, bạn phải cài:
~$ apt-cache search python-flask

done

bonus: bạn có thể dùng ' | grep  keyword' để kết quả chi tiết hơn
vd :

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ apt-cache search flask | grep python
python-flask - micro web framework based on Werkzeug, Jinja2 and good intentions
python-flaskext.wtf - Simple integration of Flask and WTForms
python-selinux - Python bindings to SELinux shared libraries
python-semanage - Python bindings for SELinux policy management
python-uwsgicc - uWSGI control center



2. Hiện thông tin về một package
     
                           ~$ apt-cache show tên-package

ví dụ:
thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ apt-cache show python-flask
Package: python-flask
Priority: optional
Section: universe/python
Installed-Size: 596
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Piotr Ożarowski <piotr@debian.org>
Architecture: all
Source: flask
Version: 0.8-1
Depends: python2.7, python (>= 2.7.1-0ubuntu2), python (<< 2.8), python-werkzeug (>= 0.8), python-jinja2 (>= 2.4)
Recommends: python-pkg-resources
Filename: pool/universe/f/flask/python-flask_0.8-1_all.deb
Size: 71162
MD5sum: 4fdf6149d8517e7f9fe18075de845e72
SHA1: 9c2081930892e72298101001cfb6bb8fda56220a
SHA256: a14dd76a725c1cd2b3140c264fd6ff3fbf8e2147e6bd09daca866e50a27d0d0a
Description-en: micro web framework based on Werkzeug, Jinja2 and good intentions
 Flask is a micro web framework for Python based on Werkzeug, Jinja 2 and good
 intentions. A minimal Flask application looks like that:
 .
   from flask import Flask
   app = Flask(__name__)
 .
   @app.route("/")
   def hello():
       return "Hello World!"
 .
   if __name__ == '__main__':
       app.run()
Homepage: http://flask.pocoo.org/
Description-md5: af80b4121514ac9080cae2382910000f
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu

Tương tự, để tìm hiểu chi tiết hơn về một attribute của package đó bạn dùng
 "| grep"
ví dụ:
thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ apt-cache show python-flask | grep Version
Version: 0.8-1

3. Danh sách các package đã cài:

                                       ~$ dpkg -l

chi tiết hơn về các package có liên quan đến vim, nghĩa là có từ Vim trong tên package hoặc phần mô tả:
$ dpkg -l '*vim*'
ví dụ:

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ dpkg -l '*vim*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  vim            2:7.3.429-2ubu Vi IMproved - enhanced vi editor
un  vim-athena     <none>         (no description available)
ii  vim-common     2:7.3.429-2ubu Vi IMproved - Common files
un  vim-doc        <none>         (no description available)
un  vim-gnome      <none>         (no description available)
un  vim-gtk        <none>         (no description available)
un  vim-nox        <none>         (no description available)
ii  vim-runtime    2:7.3.429-2ubu Vi IMproved - Runtime files
un  vim-scripts    <none>         (no description available)
ii  vim-tiny       2:7.3.429-2ubu Vi IMproved - enhanced vi editor - compact v

hoặc

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ dpkg -l | grep vim
ii  vim                                         2:7.3.429-2ubuntu2.1                        Vi IMproved - enhanced vi editor
ii  vim-common                                  2:7.3.429-2ubuntu2.1                        Vi IMproved - Common files
ii  vim-runtime                                 2:7.3.429-2ubuntu2.1                        Vi IMproved - Runtime files
ii  vim-tiny                                    2:7.3.429-2ubuntu2.1                        Vi IMproved - enhanced vi editor - compact version


4. Tên các thư mục trong package

         ~$ dpkg -L ten_package


ví dụ:
thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ dpkg -L Vim
/.
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
/usr/share/bug/vim/presubj
/usr/share/bug/vim/script
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/vim
/usr/share/doc
/usr/share/doc/vim

Với các package có nhiều file, ban có thể thêm "| head" để hiển thị 10 file đầu tiên

thanhnguyen1010@thanhnguyen1010-Satellite-L640:~$ dpkg -L ipython | head
/.
/usr
/usr/bin
/usr/bin/ipcluster
/usr/bin/ipcontroller
/usr/bin/ipengine
/usr/bin/iplogger
/usr/bin/ipython
/usr/bin/irunner
/usr/bin/pycolor



Thứ Năm, 20 tháng 3, 2014

20 phút học config fstab file

start: 2h20pm

# file /etc/fstab
Là file chưa các thông tin cần thiết để tự động hóa quá trình mountting partitions (  nghĩa là built thêm một partition/divice và gắn nó vào directory tree? directory tree là tập hợp của các directory trên máy mình)

Cú pháp của một fstab entry:

[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]

trong đó:

Device: là thiết bị hoặc partitions chứa file system
ví dụ: ổ C
Mount point: là thư mục trong hệ thống file root mà thiết bị được mount vào đó
File System Type: lạo của file System
Option: Các tùy chọn khi mount thiết bị hoặc Partitions
Dump: kích hoạt hoặc vô hiêụ hóa việc sao lưu Device hoặc Partitions. Thường sử dụng là 0 - disable
Pass: điều khiển yêu cầu fsck  kiểm tra thiết bị hoặc Partitions khi có lỗi xảy ra trong thời gian khởi động. Root device là 1, còn các partition là 2, hoặc là 0 khi disable checking
(fsck: công cụ dò lỗi trên filesystem )

lệnh mkfs:
mkfs - build a Linux filesystem
syntax:
mkfs [options] [-t type fs-options] device [size]
ví dụ:
#mkfs -v -t ext4 /dev/vdb1 1

Device:


mặc định, ubuntu sẽ dùng UUID đối với các Partition
UUID=xxx.yyy.zzz
để lấyUUID:
sudo blkid
 
Mount point:

Trước hết bạn phải tạo ra mount point với tên tùy chọn:
ví dụ : tên MP là  /var/lib/graphite
 
sudo mkdir /var/lib/graphite

File System Type

ví dụ
ext4, ext3, ext2, jfs, reiserfs, etc.

Options:
auto: tự động mount thiết bị khi máy tính khởi động.
noauto: không tự động mount, nếu muốn sử dụng thiết bị thì sau khi khởi động vào hệ thống bạn cần chạy lệnh mount.
user: cho phép người dùng thông thường được quyền mount.
nouser: chỉ có người dùng root mới có quyền mount.
exec: cho phép chạy các file nhị phân (binary) trên thiết bị.
noexec: không cho phép chạy các file binary trên thiết bị.
ro (read-only): chỉ cho phép quyền đọc trên thiết bị.
rw (read-write): cho phép quyền đọc/ghi trên thiết bị.
sync: thao tác nhập xuất (I/O) trên filesystem được đồng bộ hóa.
async: thao tác nhập xuất (I/O) trên filesystem diễn ra không đồng bộ.
defaults: tương đương với tập các tùy chọn rw, suid, dev, exec, auto, nouser, async  

chú ý: Nếu có nhiều tùy chọn thì chúng được phân cách bởi dấu phẩy 

Pass (fsck order)

0 == do not check.
1 == check this partition first.
2 == check this partition(s) next

Khi đã config xong file /etc/fstab, để thiết bị thực hiện quá trình mount:

$ sudo mountall 

2h 50
Trễ 10phút

Thứ Hai, 17 tháng 3, 2014

Minion không trỏ tới master

Đây là trường hợp sau khi install salt-minion và config, minion vẫn không trỏ tới master
Sau khi cài salt-minion trên instance 10.2.20.19
Config file /etc/salt/minion trên salt-minion:
# Set the location of the salt master server, if the master server cannot be
# resolved, then the minion will fail to start.
master: 10.2.23.32
# Set whether the minion

.....
 và
 .....
# Set the location of the salt master server, if the master server cannot be
# resolved, then the minion will fail to start.
master: 10.2.23.32
# Set whether the minion

.....
sau đó restart lại salt-minion
salt-master vẫn không nhận key của salt-minion đó:
root@salt-master-thanhnt:/srv/salt# salt-key -L                                
Accepted Keys:
cabot
graphite_cloud
shinken-thanhnh
Unaccepted Keys:
Rejected Keys:

log salt-minion báo:
2014-03-13 08:13:45,812 [salt.crypt       ][ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
 2014-03-13 08:13:55,843 [salt.crypt       ][ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
2014-03-13 08:14:05,863 [salt.crypt       ][ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
 2014-03-13 08:14:15,883 [salt.crypt       ][ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate

Nghĩa là trên salt-master đã cache public key của con salt-minion mới tạo này
Để fix lỗi này có hai cách:
1. Vào /etc/salt/pki/master/minions/ và xóa public key của con bblm-graphite-instances đã được cache trong salt-master  đi, restart lại salt-master và salt-minion là ok
2. Gỡ bỏ salt-minion đã cài đặt trên instance 10.2.20.19 và reinstall, restart lại salt-minion là ok

Thứ Sáu, 14 tháng 3, 2014

SMTYF - sent mail from python script

Với cái ý tưởng là tạo được một chương trình gửi mail cho bạn bè với nội dung và  mục đích tùy ý . Ý tưởng này lấy tên là SMTYF
Bắt đầu các bài học:
Bài 1. sent mail from python script

Để làm được bài này , chúng ta cần học  về python smtplib module:
http://docs.python.org/2/library/smtplib.html

Một ví dụ đơn giản:

import smtplib

# Định nghĩa email của bạn và email bạn muốn gửi nội dung tới

fromaddr = 'ngtthanh1010@gmail.com'
toaddrs  = 'toaddrsemail@gmail.com'

# Nhập nội dung email

msg = 'Enter you message here'

# Định nghĩa user và pass email của bạn

username = 'ngtthanh1010'
password = 'password'

# Sent mail
# xác nhận server gửi mail
server = smtplib.SMTP('smtp.gmail.com:587')

# start tls - cái này dùng để bảo mật cho email của bạn
server.starttls()

# login vào email account của bạn
server.login(username,password)

# sent mail
server.sendmail(fromaddr, toaddrs, msg)

# Thoát khỏi send mail server 
server.quit()

Túm lại: Chúng ta dùng module smtplib để sent một email