From 58c22835e5fa67753cee88d16d083e6c72692826 Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Wed, 25 Dec 2024 00:35:44 +0700 Subject: [PATCH] initial commit --- Makefile | 35 +++++++ README.md | 25 +++++ src/pm | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 346 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100755 src/pm diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f7252ab --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +DESTDIR=/ + + +install: + if [ ! -d ${DESTDIR}/etc/pm ]; then \ + mkdir -pv ${DESTDIR}/etc/pm; \ + touch ${DESTDIR}/etc/pm/repo; \ + fi + if [ ! -d ${DESTDIR}/tmp ]; then \ + mkdir -pv ${DESTDIR}/tmp; \ + fi + if [ ! -d ${DESTDIR}/usr/bin ]; then \ + mkdir -pv ${DESTDIR}/usr/bin; \ + fi + if [ ! -d ${DESTDIR}/usr/share/pm ]; then \ + mkdir -pv ${DESTDIR}/usr/share/pm/{packages,repos}; \ + touch ${DESTDIR}/usr/share/pm/query; \ + fi + if [ ! -d ${DESTDIR}/var/cache/pm/pkg ]; then \ + mkdir -pv ${DESTDIR}/var/cache/pm/pkg; \ + fi + +uninstall: + if [ -d ${DESTDIR}/etc/pm ]; then \ + rm -rv ${DESTDIR}/etc/pm; \ + fi + if [ -d ${DESTDIR}/usr/share/pm ]; then \ + rm -rv ${DESTDIR}/usr/share/pm; \ + fi + if [ -d ${DESTDIR}/var/cache/pm ]; then \ + rm -rv ${DESTDIR}/var/cache/pm; \ + fi + if [ -f ${DESTDIR}/usr/bin/pm ]; then \ + rm -v ${DESTDIR}/usr/bin/pm; \ + fi \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..04396fc --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# PM - package manager for simple linux + +## Filetree + +``` +/ +├── etc +│ └── pm +│ └── repo +├── tmp +├── usr +│ ├── bin +│ │ └── pm +│ └── share +│ └── pm +│ ├── packages +│ ├── query +│ └── repos +│ └── localhost +│ └── query +└── var + └── cache + └── pm + └── pkg +``` diff --git a/src/pm b/src/pm new file mode 100755 index 0000000..5c3c746 --- /dev/null +++ b/src/pm @@ -0,0 +1,286 @@ +#!/bin/sh + +########## #### #### +########## #### #### +## ## ## ## ## ## +## ## ## ## ## ## +########## ## ## ## - PACKAGE MANAGER FOR SIMPLE LINUX +########## ## ## ## - AUTHOR -- TOLA MIRONCENKO +## ## ## +## ## ## +## ## ## +## ## ## + +#---------------- variables -------------------------- +rootdir=/home/tola/Documents/linux/pm/rootfs +repofile=$rootdir/etc/pm/repo +packagesqueryfile=$rootdir/usr/share/pm/query +reposquerydir=$rootdir/usr/share/pm/repos +cachedpkgdir=$rootdir/var/cache/pm/pkg +installedpackagesdir=$rootdir/usr/share/pm/packages +#----------------------------------------------------- + +#----- colors ------- +RESET="\033[0m" +GREEN="\033[0;32m" +RED="\033[0;31m" +BRED="\033[1;31m" +YELLOW="\033[1;33m" +BWHITE="\033[1;37m" +#-------------------- + +#---------------- check root priveleges function ------------------------ +checkroot() { + if [[ $(id -u) != 0 ]]; then + printf "$YELLOW**$BRED error:$RESET you must be root\n" + exit 1 + fi +} + +checkroot +#------------------------------------------------------------------------ + +#----------------- add(install) package function ------------------------ +add() { + if [[ "$1" == "" ]]; then + help + exit 0 + fi + for i in $*; do + if [[ "$i" == "add" ]]; then + continue + fi + + done + for i in $*; do + if [[ "$i" == "add" ]]; then + continue + fi + down $i + done + for i in $*; do + if [[ "$i" == "add" ]]; then + continue + fi + unpack $cachedpkgdir/$i.pkg.gz + done +} +#------------------------------------------------------------------------ + +#-------------------- download package without install function --------- +down() { + if [[ ! $1 ]]; then + help + exit 0 + fi + servers=$(/usr/bin/cat $repofile) + for i in $servers; do + serverdir=$(echo $i | sed -e "/http:\/\//s///") + repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///') + for j in $repoquery; do + if [[ $j == $1 ]]; then + if [ ! -f $cachedpkgdir/$1.pkg.gz ]; then + printf "$YELLOW**$RESET Downloading $YELLOW$serverdir: $Bwhite$j\n$RESET" + wget $i/$1.pkg.gz -P $cachedpkgdir + if [[ "$?" == "0" ]]; then + printf "$YELLOW**$GREEN successful downloaded $1\n$RESET" + return + else + printf "$YELLOW**$RED error:$RESET can't download package\n" + exit 1 + fi + else + printf "$YELLOW**$GREEN successful downloaded $1\n$RESET" + return + fi + # exit 0 + fi + done + done + printf "$YELLOW**$RED error:$RESET can't find package $1\n" + exit 1 +} +#------------------------------------------------------------------------ + +#-------------------- unpack local package archive ---------------------- +unpack() { + packagename=$(echo $1 | sed -e "/.gz/s///") + packagename=${packagename#*pkg/} + printf "$YELLOW**$GREEN Installing ${packagename%.pkg*}\n$RESET" + if [[ "$(/usr/bin/cat $packagesqueryfile | grep ${packagename%.pkg*})" != "" ]]; then + printf "$YELLOW**$RESET Package already installed:$YELLOW reinstalling\n" + fi + tar -xvf $1 -C $rootdir/tmp &> /dev/null + cd $rootdir/tmp/$packagename + mkdir $installedpackagesdir/$packagename &> /dev/null + mv -v list $installedpackagesdir/$packagename &> /dev/null + cp -rv ./* $rootdir &> /dev/null + if [ -f $rootdir/tmp/$packagename/post_install ]; then + sh -c $rootdir/tmp/$packagename/post_install + fi + if [[ "$(/usr/bin/cat $packagesqueryfile | grep ${packagename%.pkg*})" == "" ]]; then + echo ${packagename%.pkg*} >> $packagesqueryfile + fi + rm -rv $rootdir/tmp/$packagename &> /dev/null + printf "$YELLOW**$GREEN Installed ${packagename%.pkg*} successful\n$RESET" +} +#------------------------------------------------------------------------ + +#------------------ delete package function ----------------------------- +del() { + printf "$YELLOW**$GREEN deleting\n$RESET" + for i in $*; do + if [[ "$i" == "del" ]]; then + continue + fi + printf "$YELLOW**$GREEN deleting $i\n$RESET" + if [ ! -f $installedpackagesdir/$i.pkg/list ]; then + printf "$YELLOW**$BRED error:$RESET package not installed\n" + exit 0 + fi + rm -v $rootdir/$(/usr/bin/cat $installedpackagesdir/$i.pkg/list) &> /dev/null + rm -rv $installedpackagesdir/$i.pkg &> /dev/null + sed -i "/$i/d" $packagesqueryfile + printf "$YELLOW**$GREEN delete $i successful\n$RESET" + done +} +#------------------------------------------------------------------------ + +#------------------- list files in package function --------------------- +list() { + if [[ "$1" == "" ]]; then + help + exit 0 + fi + if [[ "$(/usr/bin/cat $packagesqueryfile | grep $1)" == "" ]]; then + printf "$YELLOW**$BRED error:$RESET package is not installed\n" + exit 1 + fi + filelist=$(/usr/bin/cat $installedpackagesdir/$1.pkg/list) + for i in $filelist; do + printf "$YELLOW$1: $BWHITE$i$RESET\n" + done +} +#------------------------------------------------------------------------ + +#------------------- show installed packages function ------------------- +query() { + packagesquery=$(/usr/bin/cat $packagesqueryfile) + if [[ "$packagesquery" == "" ]]; then + printf "$YELLOW**$BWHITE No installed packages\n" + exit 0 + fi + printf "$packagesquery\n" +} +#------------------------------------------------------------------------ + +#--------------------- show help function ------------------------------- +help() { + printf " + $YELLOW**$GREEN pm usage$RESET : + $BWHITE pm add [package name] - download and install from repository + pm unpack [/path/to/package/archive] - unpack(install) from local package archive + pm down [package name] - download package from repository without install + pm del [package name] - delete package + pm list [package name] - list files in package + pm search [package name] - search package in repository + pm query - show installed packages + pm help - this help message + pm clear - clear all package archives from cached packages directory + pm sync - synchronize repository + + $YELLOW**$GREEN examples$RESET : + $BWHITE pm add dnsmasq + pm unpack ./dnsmasq.pkg.gz + pm down dnsmasq + pm search dnsmasq + pm help + pm clear + pm sync + pm del dnsmasq + pm list dnsmasq + pm query + \n$RESET" +} +#------------------------------------------------------------------------ + +#------------------- sync repo function --------------------------------- +sync() { + servers=$(/usr/bin/cat $repofile) + for i in $servers; do + serverdir=$(echo $i | sed -e "/http:\//s///") + mkdir $reposquerydir/$serverdir &> /dev/null + wget $i/query -O $reposquerydir/$serverdir/query &> /dev/null + done +} +#------------------------------------------------------------------------ + +#----------------- search package in repo function ---------------------- +search() { + servers=$(/usr/bin/cat $repofile) + if [[ ! $1 ]]; then + for i in $servers; do + serverdir=$(echo $i | sed -e "/http:\/\//s///") + repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///') + for j in $repoquery; do + printf "$YELLOW$serverdir: $BWHITE$j\n$RESET" + done + done + exit 0 + fi + + for i in $servers; do + serverdir=$(echo $i | sed -e "/http:\/\//s///") + repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///') + for j in $repoquery; do + if [[ $j == $1 ]]; then + printf "$YELLOW$serverdir: $BWHITE$j\n$RESET" + exit 0 + fi + done + done + printf "$YELLOW**$RED error:$RESET can't find package ($1)\n" +} +#------------------------------------------------------------------------ + +#------------------- clear cached packages directory -------------------- +clear() { + rm -v $cachedpkgdir/* +} +#------------------------------------------------------------------------ + +case "$1" in + add|a|-a) + add $* + ;; + down|download) + down $2 + ;; + unpack|u|-u) + unpack $2 + ;; + del|d|-d) + del $* + ;; + list|l|-l) + list $2 + ;; + query|q|-q) + query + ;; + help) + help + ;; + sync) + sync + ;; + search) + search $2 + ;; + clear) + clear + ;; + *) + help + ;; +esac