aboutsummaryrefslogtreecommitdiff
path: root/lib/leap_cli/path.rb
blob: 1f6726ac87f80d784b56022d98a9ae7329e75322 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
require 'fileutils'

module LeapCli; module Path

  def self.platform
    @platform
  end

  def self.provider_base
    "#{platform}/provider_base"
  end

  def self.provider_templates
    "#{platform}/provider_templates"
  end

  def self.provider
    @provider
  end

  def self.set_provider_path(provider)
    @provider = provider
  end
  def self.set_platform_path(platform)
    @platform = platform
  end

  #
  # Tries to find a file somewhere.
  # Path can be a named path or a relative path.
  #
  # relative paths are checked against
  # provider/<path>
  # provider/files/<path>
  # provider_base/<path>
  # provider_base/files/<path>
  #
  #
  def self.find_file(arg)
    [Path.provider, Path.provider_base].each do |base|
      if arg.is_a?(Symbol) || arg.is_a?(Array)
        named_path(arg, base).tap {|path|
          return path if File.exists?(path)
        }
      else
        File.join(base, arg).tap {|path|
          return path if File.exists?(path)
        }
        File.join(base, 'files', arg).tap {|path|
          return path if File.exists?(path)
        }
      end
    end
    return nil
  end

  #
  # Three ways of calling:
  #
  # - named_path [:user_ssh, 'bob']  ==> 'users/bob/bob_ssh.pub'
  # - named_path :known_hosts        ==> 'files/ssh/known_hosts'
  # - named_path '/tmp/x'            ==> '/tmp/x'
  #
  def self.named_path(name, provider_dir=Path.provider)
    if name.is_a? Array
      if name.length > 2
        arg = name[1..-1]
        name = name[0]
      else
        name, arg = name
      end
    else
      arg = nil
    end

    if name.is_a? Symbol
      Util::assert!(Leap::Platform.paths[name], "Error, I don't know the path for :#{name} (with argument '#{arg}')")
      filename = eval('"' + Leap::Platform.paths[name] + '"')
      return provider_dir + '/' + filename
    else
      return name
    end
  end

  def self.exists?(name, provider_dir=nil)
    File.exists?(named_path(name, provider_dir))
  end

  def self.defined?(name)
    Leap::Platform.paths[name]
  end

  def self.relative_path(path, provider_dir=Path.provider)
    if provider_dir
      path = named_path(path, provider_dir)
      path.sub(/^#{Regexp.escape(provider_dir)}\//,'')
    else
      path
    end
  end

end; end