Advertisement
s243a

Draft: slack2pup_gawk

Dec 6th, 2019
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 9.98 KB | None | 0 0
  1. #!/bin/ash
  2.  
  3. # slack2pup
  4. # convert a Slackware PACKAGES.TXT repo file, into a Puppy compatible repo file.
  5.  
  6. # @TODO1 - get package categories from /usr/local/petget/categories.dat
  7. # @TODO2 - fix field 11 of package entries (should show 'slackware64' on x64?)
  8.  
  9. . /etc/DISTRO_SPECS
  10.  
  11. #if [ "$DISTRO_BINARY_COMPAT" != "slackware" ];then #@TODO2
  12. #  echo "Sorry, you must be running a Slackware compatible Puppy Linux"
  13. #  echo "to use this tool. Your Puppy is based on '$DISTRO_BINARY_COMPAT'"
  14. #  exit 1
  15. #fi
  16.  
  17.  
  18. if [ "$1" = '-h' ] || [ "$1" = '-help' ] || [ "$1" = '--help' ] || [ "$(echo $1 | grep '^http')" = "" ];
  19. then
  20.   echo "slack2pup - convert Slackware repos to Puppy repo files"
  21.   echo ""
  22.   echo "Usage examples:"
  23.   echo ""
  24.   echo "  slack2pup http://site.com/path/to/PACKAGES.TXT"
  25.   echo
  26.   echo "  slack2pup http://site.com/path/to/PACKAGES.TXT.gz"
  27.   echo
  28.   exit 1
  29. fi
  30.  
  31.  
  32. rm /tmp/PACKAGES.TXT /tmp/PACKAGES.TXT.gz &>/dev/null
  33.  
  34. output_file="/tmp/PACKAGES.TXT"
  35. if [ "$(echo $1 | grep 'PACKAGES.TXT.gz')" != "" ];then
  36.   output_file="/tmp/PACKAGES.TXT.gz"
  37. fi
  38.  
  39. wget --quiet "$1" -O "$output_file" 1>/dev/null || download_failed=true
  40.  
  41. if [ ! -f "$output_file" ] || [ "$download_failed" = true ];then
  42.   echo
  43.   echo "ERROR: the Slackware repo $1 not found"
  44.   echo
  45.   $0 -h
  46.   exit 1
  47. fi
  48.  
  49. echo "Found URL:"
  50. echo
  51. echo "  ${1}"
  52.  
  53.  
  54. # we may have been given as repo name ($2)
  55. if [ "$2" != "" ];then
  56.   repo_name="$2"
  57. fi
  58.  
  59. while [ "$repo_name" = "" ]
  60. do
  61.   # get repo name and filename
  62.   echo
  63.   echo "Choose a repo name (something like 'fatdog-720', 'alienbob-14.2', etc)"
  64.   bash -c 'read -e -p "Enter a repo name: " repo_name; echo $repo_name > /tmp/pkg/repo_name'
  65.   repo_name=$(cat /tmp/pkg/repo_name)
  66. done
  67.  
  68. # replace any spaces or underscores with dashes, all lower case
  69. repo_name="$( echo "${repo_name// /-}" | tr '_' '-' | tr '[:upper:]' '[:lower:]' )"
  70.  
  71. # if this repo is already added (its being updated), then we can get the repo filename
  72. repo_filename="$(cat ~/.pkg/sources-all | grep -m1 "^$repo_name|" | cut -f3 -d'|')"
  73.  
  74. if [ "$DISTRO_BINARY_COMPAT" = "slackware" ];then
  75.   slackware_version=$DISTRO_FILE_PREFIX
  76. else
  77.   slackware_version="$(cat /root/.packages/$repo_filename | head -1 | cut -f12 -d'|')"
  78. fi
  79.  
  80. # if we dont have a repo filename in ~/.pkg/sources-all, ask for one
  81. if [ "$(echo $repo_filename | grep '^Packages')" = "" ];then
  82.   echo
  83.   bash -c 'read -e -p "Enter a repo file name: " -i "Packages-slackware-$repo_name" repo_filename; echo $repo_filename > /tmp/pkg/repo_filename'
  84.   repo_filename=$(cat /tmp/pkg/repo_filename)
  85.  
  86.   # replace any spaces or underscores with dashes, all lower case
  87.   repo_filename="$( echo "${repo_filename// /-}" | tr '_' '-' )"
  88.  
  89.   # also ask for a slackware version
  90.   while [ "$slackware_version" = "" ]
  91.   do
  92.     echo
  93.     bash -c 'read -e -p "Enter the compatible Slackware version (14.0, 14.2, etc): " slackware_version; echo $slackware_version > /tmp/pkg/slackware_version'
  94.     slackware_version=$(cat /tmp/pkg/slackware_version)
  95.   done
  96. fi
  97.  
  98.  
  99. if [ "$output_file" = "/tmp/PACKAGES.TXT.gz" ];then
  100.   gunzip "$output_file"
  101. fi
  102.  
  103. # we have the /tmp/PACKAGES.TXT file, lets convert it
  104.  
  105. rm /tmp/slackrepo /tmp/slackpkg* /tmp/slack_pkgext &>/dev/null
  106. count=1
  107. PACKAGES_PATH=PACKAGES.TXT
  108. echo
  109. echo "Processing packages, please wait... This may take a while.."
  110.  
  111.             cat "$PACKAGES_PATH" | awk -v PKGOS="$distro" -v PKGOSVER="$distro_ver" \
  112. 'function parse_pkg_name(s,        txz_split,arch_build){
  113.     match(s,/^([^\-]*)-([^\-]*)(\-.*)(/\.([^\.]*)$/,txz_split)
  114.     PKG=txz_split[1]
  115.     PKGVER=txz_split[2]
  116.     split(txz_split[3],arch_build,"-")
  117.     len=length(arch_build)
  118.    if (if (len == 3) ){
  119.         BUILD_NO=arch_build[len-1]
  120.         ARCH=arch_build[len-2]
  121.    }
  122.    else if(len == 2){
  123.       if (arch_build[len-1] ~ [\d]){
  124.         BUILD_NO=arch_build[len-1]
  125.        }
  126.        else{
  127.            ARCH=arch_build[len-1]
  128.       }
  129.     }  
  130.    }
  131.  }
  132. }
  133. function maybe_parse_dec(s,        line_split){
  134.  if( PARSE_DEC_FLAG == 1){
  135.     match($0,/(\S+):\s+(.*)$/,line_split)
  136.     if(length(line_split) > 0){
  137.       if (line_split[1] == PKG){
  138.         PKGINFO=substr(line_split[2],1,200)
  139.         PARSE_DEC_FLAG=0
  140.       }
  141.    }
  142.  }
  143. /^PACKAGE NAME:/     { sub(/^PACKAGE NAME:\s*/,"");  parse_pkg_name($0); }
  144. /^PACKAGE LOCATION:/     { sub(/^PACKAGE LOCATION:\s*/,"");  PKGPATH=$0; }\
  145. /^PACKAGE SIZE (uncompressed):/ { sub(/^PACKAGE SIZE (uncompressed):\s*/,"");  PKGSIZE=$0; }
  146. /^PACKAGE DESCRIPTION:/ { PARSE_DEC_FLAG=1}
  147. {maybe_parse_dec($0)}                      
  148. /^$/            { print PKG "_" PKGVER "|" PKG "|" PKGVER "|"  BUILD_NO "|" PKGSECTION "|" PKGSIZE "K|" PKGPATH "|" PKGFILE  "|" PKGDEP "|" PKGINFO "|" PKGOS "|" PKGOSVER  "|" ;
  149.    
  150.                  PKG=""; PKGVER=""; PKGSECTION="CATEGORY"; PKGSIZE=""; PKGFILE=""; PKGPATH=""; PKGDEP=""; PKGINFO=""; PKGPRIO="";   BUILD_NO='';  ARCH='' PARSE_DEC_FLAG=0; }
  151. ' > /tmp/$repo_filename
  152.  
  153. #cat /tmp/PACKAGES.TXT | while read line
  154. #do
  155. #   pkginfo="$(echo "$line" \
  156. #                | grep -v '^PACKAGES.TXT;' \
  157. #                | grep -m1 -E '^PACKAGE |)$' \
  158. #                | grep -v '^PACKAGE DESCRIPTION:')"
  159. #
  160. #   if [ "$pkginfo" != "" ];then
  161. #
  162. #      echo "$line" >> "/tmp/slackpkg${count}"
  163. #
  164. #      #pkgname=''
  165. #      #pkgname="$(echo "$pkginfo" | grep 'PACKAGE NAME' | cut -f4 -d' ')"
  166. #      #[ "$pkgname" != '' ] && echo "Processing $pkgname"
  167. #
  168. #   fi
  169. #
  170. #   if [ "$line" = "" -o "$line" = "\n" -o ! "$line" ] && \
  171. #      [ -f "/tmp/slackpkg${count}" ];then
  172. #
  173. #     pkgdesc=''
  174. #     pkgdesc="$(cat "/tmp/slackpkg${count}" 2>/dev/null \
  175. #                  | grep -E ')$' \
  176. #                  | cut -f2 -d'(' \
  177. #                  | cut -f1 -d')')"
  178. #
  179. #     if [ "pkgdesc" != "" -a "$pkgdesc" != "\n" -a "$pkgdesc" != " " ];then
  180. #       echo "PACKAGE DESCRIPTION: $pkgdesc" >> "/tmp/slackpkg${count}"
  181. #     fi
  182. #
  183. #     pkgfile="$(cat /tmp/slackpkg${count} | grep -E "^PACKAGE")"
  184. #     echo "$pkgfile" > /tmp/slackpkg${count}
  185. #
  186. #    # we now have file like:
  187. #    #  /tmp/slackpkg13
  188. #    #
  189. #    # containing stuff like:
  190. #    #
  191. #    #  PACKAGE NAME:  eudev32-1.7-i686-1.txz
  192. #    #  PACKAGE LOCATION:  .
  193. #    #  PACKAGE SIZE (compressed):  75 K
  194. #    #  PACKAGE SIZE (uncompressed):  260 K
  195. #    #  PACKAGE REQUIRED:  kmod32
  196. #    #  PACKAGE CONFLICTS:
  197. #    #  PACKAGE SUGGESTS:
  198. #    #  PACKAGE DESCRIPTION: Device management
  199. #
  200. #    # we need to convert each of them into pet.spec entries, and add all
  201. #    # those into a Puppy compatible repo file:
  202. #
  203. #    pkginfo="$(cat /tmp/slackpkg${count})"
  204. #    pkg_fname="$(echo  "$pkginfo" | grep -m1 '^PACKAGE NAME' | cut -f4 -d' ')"
  205. #    pkg_name="${pkg_fname//.txz/}"
  206. #    pkg_ext="txz"
  207. #
  208. #    if [ "$pkg_name" = "$pkg_fname" ];then
  209. #      pkg_name="${pkg_fname//.tar.xz/}"
  210. #      pkg_ext="tar.xz"
  211. #    fi
  212. #    if [ "$pkg_name" = "$pkg_fname" ];then
  213. #      pkg_name="${pkg_fname//.tgz/}"
  214. #      pkg_ext="tgz"
  215. #    fi
  216. #    if [ "$pkg_name" = "$pkg_fname" ];then
  217. #      pkg_name="${pkg_fname//.tar.gz/}"
  218. #      pkg_ext="tar.gz"
  219. #    fi
  220. #
  221. #    [ ! -f /tmp/slack_pkgext ] && echo -n "$pkg_ext" > /tmp/slack_pkgext
  222. #
  223. #    pkgname_only="$(echo ${pkg_name} | sed -e 's/-[0-9].*//g')"
  224. #    dashes_in_name=$(echo "$pkgname_only" | tr '-' '\n' | wc -l)
  225. #    cut_at=$((1 + ${dashes_in_name:-0}))
  226. #    pkg_ver="$(echo ${pkg_name} | cut -f${cut_at} -d'-')"
  227. #    pkg_build_no="$(echo ${pkg_name} | sed -e 's/.*-//' -e 's/_.*//g')"
  228. #    pkg_cat="CATEGORY"
  229. #    pkg_size="$(echo  "$pkginfo" | grep -m1 '^PACKAGE SIZE'    | cut -f5 -d' ')K"
  230. #    pkg_path="$(echo "$pkginfo" | grep -m1 '^PACKAGE LOCATION' | cut -f4 -d' ' | sed -e 's/^\.//g' -e 's/^\///g')"
  231. #    [ "$pkg_path" = "." ] && pkg_path=''
  232. #    pkg_deps="$(echo "$pkginfo" | grep -m1 '^PACKAGE REQUIRED' | cut -f4-99 -d' ' | sed -e 's/,/,+/g' -e 's/,$//g' -e 's/ >= /-/g' -e 's/ <= /-/g' -e 's/ //g')"
  233. #    [ "$pkg_deps" != "" ] && pkg_deps="+${pkg_deps}"
  234. #    pkg_desc="$(echo  "$pkginfo" | grep -m1 '^PACKAGE DESCR' | cut -f3-200 -d' ')"
  235. #    pkg_os="$DISTRO_BINARY_COMPAT"
  236. #    pkg_os_ver="$DISTRO_FILE_PREFIX"
  237. #
  238. #    # @TODO2
  239. #    entry="$pkg_name|$pkgname_only|${pkg_ver:-no_ver}|$pkg_build_no|$pkg_cat|$pkg_size|$pkg_path|$pkg_fname|$pkg_deps|$pkg_desc|slackware|${slackware_version:-$pkg_os_ver}|"
  240. #
  241. #    [ "$pkg_name" != "" ] && echo "$entry" >> /tmp/slackrepo
  242. #
  243. #    count=$(($count + 1))
  244. #
  245. #   fi
  246. #
  247. #   #[ $count -gt 5 ] && break # for testing only
  248. #
  249. #done
  250.  
  251. # get the pkg extension
  252. pkg_ext=$(cat /tmp/slack_pkgext 2>/dev/null)
  253. [ "$pkg_ext" = '' ] && pkg_ext=txz
  254.  
  255. if [ ! -f /tmp/slackrepo ];then
  256.   echo
  257.   echo "Repo file could not be generated, exiting.."
  258.   exit 1
  259. fi
  260.  
  261.  
  262. # repo file created - move it to the repo files dir
  263. mv /tmp/slackrepo /root/.packages/$repo_filename
  264.  
  265.  
  266. # build repo entry for ~/.pkg/sources
  267. repo_url="${1//PACKAGES.TXT.gz/}"
  268. repo_url="${repo_url//\/.gz/}"
  269. repo_url="${repo_url//.gz\//}"
  270. repo_url="${repo_url//\/PACKAGES.TXT/}"
  271. repo_url="${repo_url//PACKAGES.TXT/}"
  272.  
  273. # add trailing slash, if needed
  274. if [ "$(echo "$repo_url" | grep -m1 "/$")" = '' ];then
  275.   repo_url="${repo_url}/"
  276. fi
  277. # create the repo entry for ~/.pkg/sources
  278. fallback_repos="$(pkg repo-list | grep -v $repo_name | tr '\n' ' ')"
  279.  
  280. repo_entry="$repo_name|$pkg_ext|$repo_filename|$repo_url||||$fallback_repos"
  281.  
  282. # if already added to ~/.pkg/sources[-all], remove it
  283. if [ "$(cat ~/.pkg/sources     | grep -m1 "^$repo_name|")" != "" ] || \
  284.    [ "$(cat ~/.pkg/sources-all | grep -m1 "^$repo_name|")" != "" ];then
  285.   cat ~/.pkg/sources | grep -v "^$repo_name|" > /tmp/pkgsources
  286.   cat ~/.pkg/sources-all | grep -v "^$repo_name|" > /tmp/pkgsources-all
  287.   mv /tmp/pkgsources ~/.pkg/sources
  288.   mv /tmp/pkgsources-all ~/.pkg/sources-all
  289. fi
  290.  
  291. # add repo entry to ~/.pkg/sources
  292. echo
  293. pkg add-source "$repo_entry"
  294. echo
  295.  
  296. # refresh list of available repos
  297. pkg update-sources
  298. echo
  299. echo "Repo info:"
  300. pkg repo-info $repo_name
  301. echo
  302.  
  303.  
  304. if [ "$(cat ~/.pkg/sources | grep -m1 "^$repo_name|")" != "" ];then
  305.   echo "Success! Repo added and available to use."
  306.   echo
  307.   echo "To use this repo, simply type the following and hit ENTER:"
  308.   echo "  pkg repo $repo_name"
  309.   echo
  310. fi
  311.  
  312. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement