All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pallet.resource.directory.clj Maven / Gradle / Ivy

(ns pallet.resource.directory
  "A directory manipulation resource, to create and remove directories
   with given ownership and mode."
  (:require
   [pallet.utils :as utils]
   [pallet.stevedore :as stevedore]
   [pallet.script :as script])
  (:use
   [pallet.resource :only [defresource]]
   [pallet.resource.file :only [chown chgrp chmod]]
   clojure.contrib.logging))

(script/defscript rmdir
  "Remove the specified directory"
  [directory & options])

(stevedore/defimpl rmdir :default [directory & options]
  ("rmdir" ~(stevedore/map-to-arg-string (first options)) ~directory))

(script/defscript mkdir
  "Create the specified directory"
  [directory & options])
(stevedore/defimpl mkdir :default [directory & options]
  ("mkdir" ~(stevedore/map-to-arg-string (first options)) ~directory))

(script/defscript make-temp-dir
  "Create a temporary directory"
  [pattern & options])
(stevedore/defimpl make-temp-dir :default [pattern & options]
  @("mktemp" -d
    ~(stevedore/map-to-arg-string (first options))
    ~(str pattern "XXXXX")))

(defn adjust-directory
  "Script to set the ownership and mode of a directory."
  [path opts]
  (stevedore/chain-commands*
   (filter
    (complement nil?)
    [(when (opts :owner)
       (stevedore/script
        (chown ~(opts :owner) ~path  ~(select-keys opts [:recursive]))))
     (when (opts :group)
       (stevedore/script
        (chgrp ~(opts :group) ~path  ~(select-keys opts [:recursive]))))
     (when (opts :mode)
       (stevedore/script
        (chmod ~(opts :mode) ~path  ~(select-keys opts [:recursive]))))])))

(defn make-directory
  "Script to create a directory."
  [path opts]
  (stevedore/checked-commands
   (str "Directory " path)
   (stevedore/script
    (mkdir ~path ~(select-keys opts [:p :v :m])))
   (adjust-directory path opts)))

(defresource directory
  "Directory management.

   For :create and :touch, all components of path are effected.

   Options are:
    - :action     One of :create, :touch, :delete
    - :recursive  Flag for recursive delete
    - :force      Flag for forced delete"
  (directory*
   [request path & {:keys [action] :or {action :create} :as options}]
   (case action
     :delete (stevedore/checked-script
              (str "Delete directory " path)
              (rm ~path ~{:r (get options :recursive true)
                          :f (get options :force true)}))
     :create (make-directory path (merge {:p true} options))
     :touch (make-directory path (merge {:p true} options)))))

(defresource directories
  "Directory management of multiple directories with the same
   owner/group/permissions.

   `options` are as for `directory` and are applied to each directory in
   `paths`"
  (directories*
   [request paths & options]
   (stevedore/chain-commands*
    (map #(apply directory* request % options) paths))))




© 2015 - 2025 Weber Informatics LLC | Privacy Policy