G-கோவையால் உரைநிரல் அமர்த்து

G-கோவையால் உரைநிரல் அமர்த்து

Published by Arun Isaac on

In other languages: English

Tags: lisp, scheme, guix, மென்பொருள்

உரைநிரல்களை Guix G-கோவையால் அமர்த்துக. ஏன்? எப்படி?

உரைநிரல்களை வழங்கிகளில் அமர்த்த அவற்றிற்குத் தேவையான நிரல்களையும் சேர்த்து நிறுவ வேண்டும். அன்னிரல்கள் சரியான பதிப்புடையதென உறுதிப்படுத்த வேண்டும். அவ்வப்போது அவற்றைத் திறமுயர்த்தவும் வேண்டும். இன்றுத் தேவைப்படும் நிரல்கள் நாளை தேவைப்படாதாகின் அவற்றை நிறுவகற்ற வேண்டும். இதைத் தொடர்ந்துச் சரியாகச் செய்வது எளிதல்ல. தொலை வழங்கிக்கும் நம் நிலையத்திற்குமிடையே பதிப்பு வேறுபாடு ஏற்படுவது இயல்பு. இதைத் தவிர்ப்பதெப்படி? Guix G-கோவைகளைப் பயன்படுத்தலாம். எப்படியென்றுப் பார்ப்போம்.

G-கோவையால் Guile உரைநிரல் அமர்த்து

வலைவழங்கிகள் உட்பட பல்லிடங்களில் பயனரையும் கடவுச்சொற்களையும் பதிவு செய்ய htpasswd கோப்புகள் பயன்படுத்தப்படுகின்றன. அத்தகைய htpasswd கோப்பில் பயனரைச் சேர்க்கவும் நீக்கவும் பின்வரும் bash உரைநிரலைப் பயன்படுத்தலாம்.

passwd_file=/etc/web/passwd

case $1 in
    add) htpasswd $passwd_file $2
         ;;
    delete) htpasswd -D $passwd_file $2
            ;;
esac

இதை bash இன்றி Guile மொழியில் பின்வரும் Guix G-கோவையாக எழுதலாம். இதில் குறிப்பிடத்தக்கது file-append மற்றும் program-file என்பவையே. file-append httpd நிரல்தொகுப்பில் /bin/htpasswd நிரலைச் சுட்டப் பயன்படுகிறது. program-file நம் G-கோவையை Guix கிடங்கில் புகுக்கப் பயன்படுகிறது.

(use-modules (gnu packages web)
             (guix gexp))

(define webuser-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils)
                     (ice-9 match))

        (define passwd-file "/etc/web/passwd")

        (match (program-arguments)
          ((_ "add" user)
           (invoke #$(file-append httpd "/bin/htpasswd")
                   passwd-file user))
          ((_ "delete" user)
           (invoke #$(file-append httpd "/bin/htpasswd")
                   "-D" passwd-file user))))))

(program-file "webuser" webuser-gexp)

இது webuser.scm என்னும் கோப்பில் இட்டால், தொகுத்து உரைநிரலாக்க

$ guix build -f webuser.scm
/gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser

இக்கோப்பைத் திறந்து என்னவிருக்கிறதெனப் பார்ப்போம்.

$ cat /gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser
#!/gnu/store/cnfsv9ywaacyafkqdqsv2ry8f01yr7a9-guile-3.0.7/bin/guile --no-auto-compile
!#

(eval-when (expand load eval)
  (let ((extensions (quote ()))
        (prepend (lambda (items lst)
                   (let loop ((items items)
                              (lst lst))
                     (if (null? items)
                         lst
                         (loop (cdr items)
                               (cons (car items)
                                     (delete (car items) lst))))))))
    (set! %load-path
          (prepend (cons "/gnu/store/pgj8653w17hsapbd1srlvd44rlnhbx8n-module-import"
                         (map (lambda (extension)
                                (string-append extension
                                               "/share/guile/site/"
                                               (effective-version)))
                              extensions))
                   %load-path))
    (set! %load-compiled-path
          (prepend (cons "/gnu/store/fwzac0aal1y24rx2vn8yhw6hf45kk46j-module-import-compiled"
                         (map (lambda (extension)
                                (string-append extension
                                               "/lib/guile/"
                                               (effective-version)
                                               "/site-ccache"))
                              extensions))
                   %load-compiled-path))))

(begin
  (use-modules (guix build utils)
               (ice-9 match))

  (define passwd-file "/etc/web/passwd")

  (match (program-arguments)
    ((_ "add" user)
     (invoke "/gnu/store/xkmpq6vwhml48bwfn2fxjdvqfmzf9ccb-httpd-2.4.52/bin/htpasswd"
             passwd-file user))
    ((_ "delete" user)
     (invoke "/gnu/store/xkmpq6vwhml48bwfn2fxjdvqfmzf9ccb-httpd-2.4.52/bin/htpasswd"
             "-D" passwd-file user))))

முதல் பத்தி வெவ்வேறு Guile நிரல்கூறுகளை உள்ளிழுக்க பாதைகளை அமைக்கிறது. இரண்டாம் பத்தியில் நாம் எழுதிய G-கோவை உள்ளது. அதில் file-append கூற்றுகளுக்கு மாறாக htpasswd நிரலுக்கான முழுப் பாதையைக் காணலாம்.

இவ்வுரைநிரலை வழங்கியில் அமர்த்தி அதை /usr/local/bin/webuser என்னும் பாதையில் நிறுவி அதை Guix குப்பைத்திரட்டியிடமிருந்து காக்க அதைக் குப்பைத்திரட்டி வேராக பதிவு செய்ய

$ guix copy --to=remote /gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser
$ ssh remote ln --symbolic --force /gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser /usr/local/bin/webuser
$ ssh remote ln --symbolic --force /usr/local/bin/webuser /var/guix/gcroots

இங்கு remote என்பது ஏற்கனவே அமைக்கப்பட்ட ஒரு நிலையமாகயிருக்க வேண்டும். இதைப் பற்றி guix copy ஆவணத்தில் காண்க.

இதையெல்லாம் செய்து என்ன பயன்? நாம் வழங்கியில் அமர்த்திய உரைநிரல் வெறும் உரைநிரலுடன் மட்டும் செல்லவில்லை. அவ்வுரைநிரல் அதற்குத் தேவையான htpasswd நிரலையும் அன்னிரலுக்குத் தேவையான அத்தனை மென்பொருளையும் அழைத்து பெருந்திரளாகச் சென்றது. அத்திரளில் எவையெவை இருக்கின்றனவெனப் பார்த்தால் மொத்தம் 407.9 MiB அளவிற்கு மென்பொருள் உள்ளது.

$ guix size /gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser
கிடங்குருப்படி                      மொத்தம்   தனது
/gnu/store/hy6abswwv4d89zp464fw52z65fkzr7h5-perl-5.34.0            147.7    58.6  14.4%
/gnu/store/rc781v4k0drhaqn90xfwwpspki5x0bvf-binutils-2.37           92.7    54.4  13.3%
/gnu/store/cnfsv9ywaacyafkqdqsv2ry8f01yr7a9-guile-3.0.7            129.1    52.0  12.8%
/gnu/store/1kws5vkl0glvpxg7arabsv6q9vazp0hx-guile-3.0.7            129.1    52.0  12.8%
/gnu/store/5h2w4qi9hk1qzzgi1w83220ydslinr4s-glibc-2.33              38.3    36.6   9.0%
/gnu/store/094bbaq6glba86h1d4cj16xhdi6fk2jl-gcc-10.3.0-lib          71.7    33.4   8.2%
/gnu/store/xkmpq6vwhml48bwfn2fxjdvqfmzf9ccb-httpd-2.4.52           350.1    29.7   7.3%
/gnu/store/vqdsrvs9jbn0ix2a58s99jwkh74124y5-coreutils-minimal-8.32    88.0    16.4   4.0%
/gnu/store/d251rfgc9nm2clzffzhgiipdvfvzkvwi-coreutils-8.32          88.0    16.4   4.0%
/gnu/store/fnr1z6xsan0437r0yg48d0y8k32kqxby-glibc-utf8-locales-2.33    13.9    13.9   3.4%
/gnu/store/4jdghmc65q7i7ib89zmvq66l0ghf7jc4-glibc-2.33-static       46.9     8.6   2.1%
/gnu/store/4ic6244i3ca4b4rxc2wnrgllsidyishv-file-5.39               78.2     6.6   1.6%
/gnu/store/lk3ywzavgz30xrlfcmx2x9rfz3cs7xq6-openssl-1.1.1s          77.2     5.5   1.4%
/gnu/store/690qz3fg334dpwn3pn6k59n4wc943p2b-gawk-5.1.0              76.0     3.3   0.8%
/gnu/store/hkhbq2q1gfs970gsp2nhsmcqb4vmv2xr-libunistring-0.9.10     74.0     2.3   0.6%
/gnu/store/ckh3gy7gpvd4b65s6jsm6f1y9bp460ji-libunistring-0.9.10     74.0     2.3   0.6%
/gnu/store/720rj90bch716isd8z7lcwrnvz28ap4y-bash-static-5.1.8        1.7     1.7   0.4%
/gnu/store/di5bqb45hi5lvp2q08hlxqjdcl9phjb1-pcre-8.45               73.4     1.7   0.4%
/gnu/store/rbb9h501zyf8mg1hz47plql80gsl99za-apr-1.7.0              312.1     1.5   0.4%
/gnu/store/2b3blhwbag1ial0dhxw7wh4zjxl0cqpk-pkg-config-0.29.2       72.8     1.1   0.3%
/gnu/store/lk24spr6hbkzh68s79nzqp9z36nx0m1f-pkg-config-0.29.2       72.8     1.1   0.3%
/gnu/store/c8isj4jq6knv0icfgr43di6q3nvdzkx7-xz-5.2.5                73.7     1.1   0.3%
/gnu/store/chfwin3a4qp1znnpsjbmydr2jbzk0d6y-bash-minimal-5.1.8      72.7     1.0   0.2%
/gnu/store/4y5m9lb8k3qkb1y9m02sw9w9a6hacd16-bash-minimal-5.1.8      39.3     1.0   0.2%
/gnu/store/xjwp2hsd9256icjjybfrmznppjicywf6-grep-3.6                73.5     0.8   0.2%
/gnu/store/wxgv6i8g0p24q5gcyzd0yr07s8kn9680-sed-4.8                 72.5     0.8   0.2%
/gnu/store/r3lv5k4mxaz53f4sr4wf9dqkqadcpms6-apr-util-1.6.1         313.2     0.8   0.2%
/gnu/store/2lczkxbdbzh4gk7wh91bzrqrk7h5g1dl-libgc-8.0.4             72.4     0.7   0.2%
/gnu/store/3pylba5sjy3r7b8fjm9yxz24751721ff-libgc-8.0.4             72.4     0.7   0.2%
/gnu/store/s3hl12jxz9ybs7nsy7kq7ybzz7qnzmsg-bzip2-1.0.8             73.1     0.4   0.1%
/gnu/store/52zhpralb3iimrm7xbc1vf3qsy4gy1vl-expat-2.4.9             72.0     0.4   0.1%
/gnu/store/fwzac0aal1y24rx2vn8yhw6hf45kk46j-module-import-compiled     0.3     0.3   0.1%
/gnu/store/wgqhlc12qvlwiklam7hz2r311fdcqfim-libffi-3.3              71.8     0.2   0.0%
/gnu/store/g000a71kc336795axa3hh1xhd3mfq083-libffi-3.3              71.8     0.2   0.0%
/gnu/store/2i5alw7qcp35x0rn0yqxmvxv3pd6ln3w-libltdl-2.4.6           71.8     0.1   0.0%
/gnu/store/s2pg5k98fl2g2szg9dykxyd9zl3xihv9-ld-wrapper-0           183.5     0.1   0.0%
/gnu/store/k04pcgdvdipdc37cc6xvm33pcglbb8rz-libsigsegv-2.13         71.7     0.1   0.0%
/gnu/store/pgj8653w17hsapbd1srlvd44rlnhbx8n-module-import            0.1     0.1   0.0%
/gnu/store/1d8qs814gi1vgf52n7x0s43ix6rc5qzc-webuser                407.9     0.0   0.0%
மொத்தம்: 407.9 MiB

இவ்வாறு நம் உரைநிரலை மட்டும் நிறுவினால் போதும். நம் உரைநிரலுக்குத் தேவையான மென்பொருள் தானே நிறுவப்படும். நேற்று தேவைப்பட்டு இன்று தேவைப்படா மென்பொருள் பற்றியும் ஏங்கேல். அடுத்த guix gc இயக்கத்தில் அவைத் தானாக அழிக்கப்படும்.

பிற மொழி உரைநிரல்களை அமர்த்தல்

G-கோவையால் bash உரைநிரல் அமர்த்து

Guile மொழி உங்களுக்குப் பிடிக்காதா? உரைநிரல்களை bash மொழியிலேயே எழுத விரும்புகிறீரா? G-கோவையால் bash உரைநிரலையும் அமர்த்த இயலும். அதற்கு உம் bash உரைநிரல்ப் பொதிந்த G-கோவையொன்றை அமைக்க வேண்டும். webuser.sh என்னும் bash உரைநிரலைப் பொதியும் G-கோவையைக் கீழ்க் காண்க. இதில் குறிப்பிடத்தக்கது local-file webuser.sh கோப்பை Guix கிடங்குக்குள் புகுத்துவது. மேலும் htpasswd நிரலைக் கண்டறிய set-path-environment-variable PATH சூழல்மாறியை அமைப்பது.

(use-modules (gnu packages bash)
             (gnu packages web)
             (guix gexp))

(define webuser-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils)
                     (ice-9 match))

        (set-path-environment-variable
         "PATH" (list "bin") (list #$httpd))
        (apply invoke
               #$(file-append bash "/bin/bash")
               #$(local-file "webuser.sh")
               (match (program-arguments)
                 ((arg0 . rest-args)
                  rest-args))))))

(program-file "webuser" webuser-gexp)

G-கோவையால் python உரைநிரல் அமர்த்து

bash என்ன பெரிய bash, python போன்று பிற மொழி உரைநிரலையும் G-கோவையில் பொதிந்து அமர்த்தலாம். ஓர் எடுத்துக்காட்டைக் கீழ்க்காண்க.

(use-modules (gnu packages python)
             (guix gexp))

(define foo-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        (invoke #$(file-append python "/bin/python3")
                #$(local-file "foo.py")))))

(program-file "foo" foo-gexp)

G-கோவையால் பிற நிரல்கூறுகள் தேவைப்படும் python உரைநிரலை அமர்த்து

Python உரைநிரலுக்குப் பிற நிரல்கூறுகள் தேவைப்படின் அவற்றையும் எளிமையாகச் சேர்க்கலாம். எடுத்துக்காட்டாக, python-colorama நிரல்கூறுடை G-கோவையைக் கீழ்க்காண்க.

(use-modules (gnu packages python)
             (gnu packages python-xyz)
             (guix packages)
             (guix gexp)
             (guix utils))

(define foo-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        (set-path-environment-variable
         "GUIX_PYTHONPATH"
         (list #$(string-append "lib/python"
                                (version-major+minor (package-version python))
                                "/site-packages"))
         (list #$python-colorama))
        (invoke #$(file-append python "/bin/python3")
                #$(local-file "foo-color.py")))))

(program-file "foo" foo-gexp)

இவ்வாறு Emacs Lisp, Rust, Ruby என விருப்பத்திற்கேற்ப பன்மொழிகளை ஒருமைப்படுத்தும் பெருந்திறன் படைத்தவை Guix நிரல்நிறுவியும் அதன் G-கோவைகளும்.

வணக்கம்!