let generic_installation
    ~(run_program : Machine.Make_fun.t)
    ~host ~install_path 
    ~install_program ~witness ~url
    ?unarchived_directory
    tool_name =
  let archive = Filename.basename url in
  let archive_kind = 
    if Filename.check_suffix url "bz2" then `Tar "j" 
    else if Filename.check_suffix url "gz"  then `Tar "z"
    else if Filename.check_suffix url "tar" then `Tar ""
    else if Filename.check_suffix url "zip" then `Zip
    else if Filename.check_suffix url "deb" then `Deb
    else `None
  in
  let open KEDSL in
  let unarchival =
    let open Program in
    let and_cd =
      shf "cd %s" (Option.value unarchived_directory
                     ~default:(tool_name ^ "*")) in
    match archive_kind with
    | `Tar tar_option ->
      chain [ shf "tar xvf%s %s" tar_option archive; and_cd ]
    | `Zip ->
      chain [ shf "unzip %s" archive; and_cd]
    | `Deb ->
      chain [
        exec ["ar""x"; archive];
        exec ["tar""xvfz""data.tar.gz"];
      ]
    | `None -> sh "echo Not-an-archive"
  in
  workflow_node
    ~name:(sprintf "Install %s" tool_name)
    witness
    (* (single_file ~host *)
    (*    (Option.value witness ~default:(install_path // tool_name))) *)
    ~edges:[
      on_failure_activate (rm_path ~host install_path);
    ]
    ~make:(
      run_program
        ~requirements:[
          `Internet_access;
          `Self_identification ["generic-instalation"; tool_name];
        ]
        Program.(
          shf "mkdir -p %s" install_path
          && shf "cd %s" install_path
          && Workflow_utilities.Download.wget_program url
          && unarchival
          && install_program
          && sh "echo Done"
        ))