ArchLinux Users Repository (AUR)

expand_circle_right

Linux ခရီးကို သူလိုငါလို Ubuntu နဲ့ စခဲ့သည်။ ထို့နောက် DebianFedoraSlackwareGentoo စတာတွေကို စမ်းခဲ့သည်။ နောက်ဆုံး ArchLinux ကိုသာ သုံးဖြစ်နေခဲ့သည်။ ၁၀ နှစ်ကျော်ရှိခဲ့ပြီ။ Archlinux သည် ကောင်းလွန်းသည်။ လိုချင်သလို တည်ဆောက်၍ ရသည်။ ထားသလိုနေသည်။ Learning curve ကို အဆင့်တစ်ခုအထိ သင်ယူပြီးပြီဆိုလျှင် တခြား Distro များထက်ပင် လွယ်ကူသည်။ Install လုပ်ရာမှာလည်း လိုချင်သလို ထိန်းချုပ်ရ လွယ်ကူသည်။ ထို့ကြောင့်လည်း Archlinux ကို နောက်ပိုင်း လူကြိုက်များလာခဲ့သည်။ YouTube ပေါ်တွင် Technology ၊ open source ၊ programming စသည့် အကြောင်းအရာများတင်သော Content Creator များမှာ Archlinux သုံးစွဲသူများ ဖြစ်နေတတ်သည်။

Archlinux ကို လူကြိုက်များရခြင်းမှာ AUR ဟုခေါ်ကြသော Archlinux Users Repository ကြောင့်ဟု မကြာခဏ ကြားရသည်။ AUR ဟူသည် နာမည်၏အဆိုအတိုင်း Archlinux သုံးစွဲသူများက မိမိတို့ ကြိုက်နှစ်သက်ရာ software များကို အများလည်းသုံးနိုင်ရန် တင်ထားသော နေရာဖြစ်သည်။ Archlinux တွင် install လုပ်ရန်လိုသည့် PKGBUILD ဖိုင်များရေး၍ တင်ထားကြခြင်းဖြစ်သည်။ အချိန်ကြာလာသည်နှင့်အမျှ AUR တွင် software များ များလာသည်။ AUR တွင် ရှာ၍မရသည့် software မရှိသလောက်ဖြစ်လာသည်။ ထိုအချက်က Archlinux ကို ပိုမို လူကြိုက်များလာစေသည်။ သုံးချင်သော software ကို official repository တွင်မတွေ့လျှင် AUR တွင် တွေ့နိုင်သည်သာ ဖြစ်သည်။ သို့သော် ထိုအချက်ကပင် Archlinux အတွက် တိုက်ခိုက်ခံရစရာ မျက်နှာစာတစ်ခုဖြစ်လာခဲ့သည်။

၂၀၂၆ ခုနှစ်၊ ဇွန်လဆန်းပိုင်းတွင် သတင်းများ တက်လာသည်။ AUR တိုက်ခိုက်ခံရသည်။ တိုက်ခိုက်သူများက AUR ဝက်ဘ်ဆိုက်တွင် User Account များဖွင့်၍ Package Maintainer မရှိသော software (AUR Package) များကို Maintainer အဖြစ် claim လုပ်၍ ရယူကြသည်။ ထို့နောက် သက်ဆိုင်ရာ PKGBUILD ဖိုင်များထဲတွင် မလိုလားအပ်သော packaging/building command များ ထည့်သွင်းရေးသားကြသည်။ အများအားဖြင့် nodenpmbun စသည်တို့ကို အသုံးပြု၍ မလိုလားအပ်သော၊ ဖျက်ဆီးတတ်သော software များကို install လုပ်စေခြင်းဖြစ်သည်။ ထိုနည်းဖြင့် တိုက်ခိုက်ကြခြင်းဖြစ်သည်။

လူ၏ မနာလိုစိတ် သည် ကမ္ဘာဦးအစကတည်းက ရှိသော အခြေခံအကျဆုံးနှင့် အားအကောင်းဆုံး သဘာဝ အဇ္ဈတ္တစိတ် ဖြစ်သည်။ လူ့သမိုင်းတစ်လျှောက် မည်သို့ပင် ယဥ်ကျေးမှုမြင့်မားလာစေကာမူ ကွယ်ပျောက်သွားခြင်းမရှိ။ အသွင်အမျိုးမျိုးဖြင့် ရှိတတ်သည်။ ငုံ့လျှိုးနေတတ်သည်။ အကြောင်းတိုက်ဆိုင်လျှင် ထိန်းမနိုင်သိမ်းမရ ပေါ်တတ်သည်။ လူတိုင်းတွင် ရှိသည်။ မိမိတွင် ရှိသကဲ့သို့ ဘုရားလိုလို တရားလိုလို လူကြီးတစ်ယောက်တွင်လည်း ရှိသည်။ AUR ကိစ္စသည်လည်း မနာလို၍ လုပ်ကြခြင်းသာ ဖြစ်လိမ့်မည်။

သုံးစွဲသူတစ်ဦးချင်းအနေဖြင့် AUR ပြဿနာဖြေရှင်းရန် အကောင်းဆုံး အကြံပြုချက်မှာ AUR Package များ မသုံးခြင်းသာ ဖြစ်သည်။ သို့သော် AUR Pacakge များကို ရှောင်၍မလွယ်။ ဥပမာ Printer Driver software များသည် AUR တွင်သာ ရှိကြသည်။ သို့ဆိုလျှင် AUR ကို ရှောင်နိုင်သမျှ ရှောင်ရန်သာ ဖြစ်သည်။ မလွှဲသာ၍ သုံးရမည်ဆိုလျှင် AUR Package ကို install မလုပ်ခင် PKGBUILD ဖိုင်ကို ဖတ်ရမည်။ Download ရယူမည့် source url ကို ကြည့်ရမည်။ ၎င်းနှင့်အတူ install လုပ်ပေးမည့် dependency software များကို ကြည့်ရမည်။ package() နှင့် build() function များအတွင်းရှိ command များကို ကြည့်ရမည်။ အခြား အချက်အလက်များကိုလည်း ကြည့်ရမည်။ မိမိ install လုပ်မည့် software နှင့် PKGBUILD အတွင်း ရေးထားသည်များ သက်ဆိုင်မှုရှိမရှိ၊ သဘာဝကျမကျ၊ အဓိပ္ပါယ်ရှိမရှိ ကြည့်ရမည်။ ဤသည်ပင်လျှင် BTW, I use Arch ဟု ပြောရလောက်သော power user တစ်ယောက်၏ ဘဝဖြစ်သည်။

မိမိသည်လည်း နှစ်လများစွာသုံးခဲ့သော ကိုယ်တိုင် ရေးသားပြီး murd ဟုအမည်ပေးထားသည့် AUR Helper dash script ကို update လုပ်ခဲ့သည်။ PKGBUILD ကို စစ်ဆေးနိုင်မည့် code snippet ကို aurinstall_func() ဟူသော function အတွင်း ဖြည့်စွက်ရေးသားခဲ့သည်။

~
aurinstall_func () {
    local BDIR=$(basename -- "$PWD")
    if [ "$BDIR" != "murdbui" ]; then
        cd "$MURBUI"
    fi
    if [ -d "$1" ]; then
        cd "$1"
        if [ ${CHECKPKGBUILD:-true} = "true" ]; then
            echo "\n::: "$1" is about to install/update\n"
            read -p "Check PKGBUILD? [Y/n] or No to All? [a]: " CPB < /dev/tty
            case "$CPB" in
                a|A|all|All)
                    CHECKPKGBUILD="false"
                    echo "::: Skipped for checking PKGBUILD for all"
                    ;;
                n|N|no|No)
                    echo "::: Skipped for checking PKGBUILD for "$1""
                    ;;
                *)
                    if [ -f ./PKGBUILD ]; then
                        nvim -R ./PKGBUILD < /dev/tty > /dev/tty
                    else
                        echo "::: Oops!, no PKGBUILD file"
                    fi
                    ;;
            esac
            read -p "Continue? [Y/n] or exit? [e/q]: " YNE < /dev/tty
            case "$YNE" in
                n|N|no|No) echo "::: Skipped "$1" to install/update" ;;
                e|E|exit|Exit|q|Q|quit|Quit) : ;;
                *) makepkg -isc < /dev/tty ;;
            esac
        else
            makepkg -isc < /dev/tty
        fi
    fi
}

murd (အပြည့်အစုံ)

~
#!/bin/dash

# check if root and exit 0
[ "$(id -u)" -eq 0 ] && exit 0
# check if in terminal or exit
case "$(ps -o stat= -p "$$")" in
    *+*) : ;;
    *) notify-send -t 9000 "clean exit" "please run it in terminal."; exit 0 ;;
esac
# check if already running and exit 0
SCRIPTNAME="$(basename -- "$0")"
if pidof -x "$SCRIPTNAME" -o "$$" >/dev/null 2>&1; then
    echo "the script is alrady running"
    exit 0
fi

MURTMP=/tmp/minsoehan.msh.9.d/murdtmp
MURBUI=${HOME}/.cache/minsoehan.msh.9.d/murdbui
mkdir -p "$MURTMP"
mkdir -p "$MURBUI"

updqmipac_func () {
    QMIPAC="$MURTMP"/qmipaclist
    pacman -Qmi | awk -F ' : ' '
        /Name/ {n=$2}
        /Version/ {v=$2}
        /Install Date/ {
            d=$2;
            gsub(/\+[0-9]{4}/, "GMT&", d)
            print n "\t" v "\t" d
        }
    ' | while read -r n v d; do
        GTZ=$(date +'GMT%z')
        e=$(TZ="$GTZ" date +'%s' -d "$d")
        printf "%s\t%s\t%s\t%s\n" "$n" "$v" "$d" "$e"
    done > "$QMIPAC"
}
updaurinfo_func () {
    AURINFO="$MURTMP"/curlaurinfo
    ARGSTRING=$(grep -v "^.*-debug" "$QMIPAC" | cut -f 1 | while read -r LINE; do echo -n "&arg[]="$LINE""; done)
    curl -s "https://aur.archlinux.org/rpc/?v=5&type=info"$ARGSTRING"" > "$AURINFO"
}

aursearch_func () {
    if [ -n "$1" ]; then
        curl -s "https://aur.archlinux.org/rpc/?v=5&type=search&arg="$1"" | jq -r '. | .results[] | " ",.Name,.Description," "'
    fi
}
aurdownload_func () {
    if [ -n "$1" ]; then
        if git ls-remote --quiet https://aur.archlinux.org/"$1".git; then
            cd "$MURBUI"
            if [ -d "$1" ]; then
                rm -rf "$1"
            fi
            git clone https://aur.archlinux.org/"$1".git
            echo "::: cloned @ "$MURBUI"/"$1""
        fi
    fi
}
aurinstall_func () {
    local BDIR=$(basename -- "$PWD")
    if [ "$BDIR" != "murdbui" ]; then
        cd "$MURBUI"
    fi
    if [ -d "$1" ]; then
        cd "$1"
        if [ ${CHECKPKGBUILD:-true} = "true" ]; then
            echo "\n::: "$1" is about to install/update\n"
            read -p "Check PKGBUILD? [Y/n] or No to All? [a]: " CPB < /dev/tty
            case "$CPB" in
                a|A|all|All)
                    CHECKPKGBUILD="false"
                    echo "::: Skipped for checking PKGBUILD for all"
                    ;;
                n|N|no|No)
                    echo "::: Skipped for checking PKGBUILD for "$1""
                    ;;
                *)
                    if [ -f ./PKGBUILD ]; then
                        nvim -R ./PKGBUILD < /dev/tty > /dev/tty
                    else
                        echo "::: Oops!, no PKGBUILD file"
                    fi
                    ;;
            esac
            read -p "Continue? [Y/n] or exit? [e/q]: " YNE < /dev/tty
            case "$YNE" in
                n|N|no|No) echo "::: Skipped "$1" to install/update" ;;
                e|E|exit|Exit|q|Q|quit|Quit) : ;;
                *) makepkg -isc < /dev/tty ;;
            esac
        else
            makepkg -isc < /dev/tty
        fi
    fi
}
aurclean_func () {
    cd ~
    if [ -d "$MURBUI" ]; then
        echo "::: content of "$MURBUI"\n"
        ls --color=never "$MURBUI"
        echo "\n::: "$MURBUI" will be deleted."
        read -p "Continue? [Y/n]: " DYN
        case "$DYN" in
            n|N|no|No) echo "::: "$MURBUI" is intact." ;;
            *) rm -rf "$MURBUI" ;;
        esac
    fi
}
aurupdate_func () {
    [ -f "$QMIPAC" ] && rm "$QMIPAC"
    [ -f "$AURINFO" ] && rm "$AURINFO"
    updqmipac_func
    while true; do
        updaurinfo_func
        if [ -f "$AURINFO" ]; then
            CHKAURINFO=$(cat "$AURINFO")
            if [ -z "$CHKAURINFO" ]; then
                echo "::: Oops!, AUR info is empty. Trying again."
                sleep 1
                continue
            else
                break
            fi
        else
            echo "::: Oops!, AUR Info file was not generated. Check updaurinfo_func, plesse."
            exit 0
        fi
    done
    grep -v "^.*-debug" "$QMIPAC" | while read -r LINE; do
        local INSTNAME=$(echo "$LINE" | cut -f 1)
        local INSTVER=$(echo "$LINE" | cut -f 2)
        local INSTDATE=$(echo "$LINE" | cut -f 3)
        local INSTDNUM=$(echo "$LINE" | cut -f 4)
        local AURVER=$(jq -r '. | .results[] | select(.Name == '\"$INSTNAME\"') | .Version' "$AURINFO")
        local AURLMNUM=$(jq -r '. | .results[] | select(.Name == '\"$INSTNAME\"') | .LastModified' "$AURINFO")
        if [ -z "$AURVER" ] || [ -z "$AURLMNUM" ]; then
            msgnotfound_func
            continue
        fi
        if [ "$INSTVER" = "$AURVER" ] && [ "$INSTDNUM" -gt "$AURLMNUM" ]; then
            msguptodate_func
            continue
        fi
        if [ "$INSTVER" != "$AURVER" ] && [ "$INSTDNUM" -lt "$AURLMNUM" ]; then
            echo "::: "$INSTNAME" is going to be updated."
            aurdownload_func "$INSTNAME"
            aurinstall_func "$INSTNAME"
            continue
        fi
        if [ "$INSTVER" != "$AURVER" ] || [ "$INSTDNUM" -lt "$AURLMNUM" ]; then
            msgtocheck_func
            continue
        fi
    done
}

msgnotfound_func () {
    echo "
    "$INSTNAME" seems not in AUR
    AURVER: "$AURVER" or AURLMNUM: "$AURLMNUM" is empty
    please check @ https://aur.archlinux.org
    "
}
msguptodate_func () {
    echo "
    "$INSTNAME" is up-to-date.
    "$INSTVER" = "$AURVER"
    Installed: $(date --date=@"$INSTDNUM")
    AURLastMd: $(date --date=@"$AURLMNUM")
    "
}
msgtocheck_func () {
    echo "
    Oops! check "$INSTNAME" @
    ? "$INSTVER" = "$AURVER"
    ? "$INSTDNUM" > "$AURLMNUM"
    Installed: $(date --date=@"$INSTDNUM")
    AURLastMd: $(date --date=@"$AURLMNUM")
    "
}
msgusage_func () {
    echo "
    \$ murd s <pkgName>
    \$ murd d <pkgName>
    \$ murd u # update
    \$ murd c # clean
    \$ murd i <pkgName>
    "
}

case "$1" in
    s) aursearch_func "$2" ;;
    d) aurdownload_func "$2" ;;
    u) aurupdate_func ;;
    i) aurdownload_func "$2"; aurinstall_func "$2"; cd ~ ;;
    c) aurclean_func ;;
    *) msgusage_func ;;
esac

အထက်ပါ dash script သည် AUR Package များကို search, download, install နှင့် update လုပ်နိုင်သော AUR Helper script ဖြစ်သည်။ လွတ်လပ်စွာ ရယူသုံးစွဲနိုင်သည်။ အဆိုးဖြစ်လျှင်လည်း ကိုယ်ဖြစ်ကိုယ်ခံ ဖြစ်ပါသည်။

ArchLinux User တစ်ယောက်အနေဖြင့် AUR မရှိတော့သည့်တစ်နေ့ မိမိအသုံးပြုလိုသော software ကို မိမိဘာသာရှာ၍ မိမိဘာသာ PKGBUILD ဖိုင်ရေးရမည်သာ ဖြစ်တော့သည်။
↳ https://wiki.archlinux.org/title/PKGBUILD
↳ https://wiki.archlinux.org/title/Makepkg

ထိုမျှပင်မကသေး ArchLinux ကို သုံးရန် မသင့်တော့ဟု ခံစားရလာရသည့်တစ်နေ့ အခြား Linux distro သို့မဟုတ် အခြား operation system တစ်ခုကို ပြောင်းသုံးရန်လည်း တွေးထားရမည်။ မိမိအနေဖြင့် ArchLinux မဟုတ်တော့သည့်နေ့ Crux သို့မဟုတ် FreeBSD ကို သုံးမည်။

Categories   •  Open Diary  •  Linux
Tags   •  Archlinux  •  Linux  •  Dash  •  Aur