nova 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +29 -0
  4. data/bin/nova +8 -0
  5. data/lib/generator/template/new_install/galaxy/some_star.rb +3 -0
  6. data/lib/generator/template/new_install/supernova.yml +16 -0
  7. data/lib/nova.rb +49 -0
  8. data/lib/nova/cli.rb +62 -0
  9. data/lib/nova/commands/server.rb +71 -0
  10. data/lib/nova/common.rb +17 -0
  11. data/lib/nova/common/event_handler.rb +165 -0
  12. data/lib/nova/common/event_handler/event.rb +147 -0
  13. data/lib/nova/common/features.rb +93 -0
  14. data/lib/nova/common/features/feature.rb +65 -0
  15. data/lib/nova/common/metadata.rb +65 -0
  16. data/lib/nova/common/metadata/data.rb +171 -0
  17. data/lib/nova/common/star_management.rb +164 -0
  18. data/lib/nova/constructor.rb +84 -0
  19. data/lib/nova/exceptions.rb +16 -0
  20. data/lib/nova/project.rb +199 -0
  21. data/lib/nova/remote.rb +10 -0
  22. data/lib/nova/remote/fake.rb +51 -0
  23. data/lib/nova/remote/fake/commands.rb +44 -0
  24. data/lib/nova/remote/fake/file_system.rb +76 -0
  25. data/lib/nova/remote/fake/operating_system.rb +52 -0
  26. data/lib/nova/remote/fake/platform.rb +89 -0
  27. data/lib/nova/star.rb +25 -0
  28. data/lib/nova/starbound.rb +14 -0
  29. data/lib/nova/starbound/client.rb +59 -0
  30. data/lib/nova/starbound/encryptor.rb +134 -0
  31. data/lib/nova/starbound/encryptors.rb +13 -0
  32. data/lib/nova/starbound/encryptors/openssl.rb +122 -0
  33. data/lib/nova/starbound/encryptors/plaintext.rb +64 -0
  34. data/lib/nova/starbound/encryptors/rbnacl.rb +67 -0
  35. data/lib/nova/starbound/protocol.rb +81 -0
  36. data/lib/nova/starbound/protocol/encryption.rb +48 -0
  37. data/lib/nova/starbound/protocol/exceptions.rb +38 -0
  38. data/lib/nova/starbound/protocol/messages.rb +116 -0
  39. data/lib/nova/starbound/protocol/packet.rb +267 -0
  40. data/lib/nova/starbound/protocol/socket.rb +231 -0
  41. data/lib/nova/starbound/server.rb +182 -0
  42. data/lib/nova/version.rb +5 -0
  43. data/spec/constructor_spec.rb +20 -0
  44. data/spec/local_spec.rb +26 -0
  45. data/spec/nova_spec.rb +7 -0
  46. data/spec/spec_helper.rb +19 -0
  47. data/spec/star/some_type.rb +27 -0
  48. data/spec/star_spec.rb +107 -0
  49. data/spec/starbound/encryptor_spec.rb +33 -0
  50. data/spec/starbound/openssl_encryptor_spec.rb +80 -0
  51. data/spec/starbound/packet_spec.rb +61 -0
  52. data/spec/starbound/plaintext_encryptor_spec.rb +27 -0
  53. data/spec/starbound/protocol_spec.rb +163 -0
  54. data/spec/starbound/rbnacl_encryptor_spec.rb +70 -0
  55. metadata +166 -0
@@ -0,0 +1,10 @@
1
+ module Nova
2
+ module Remote
3
+
4
+ autoload :Common, "nova/remote/common"
5
+ autoload :Fake, "nova/remote/fake"
6
+ autoload :Local, "nova/remote/local"
7
+ autoload :SSH, "nova/remote/ssh"
8
+
9
+ end
10
+ end
@@ -0,0 +1,51 @@
1
+ require 'nova/remote/fake/commands'
2
+ require 'nova/remote/fake/file_system'
3
+ require 'nova/remote/fake/operating_system'
4
+ require 'nova/remote/fake/platform'
5
+
6
+ module Nova
7
+ module Remote
8
+
9
+ # This is a fake remote. It does nothing. Really. You can trust
10
+ # me.
11
+ class Fake
12
+
13
+ # Returns a platform instance. Caches the instance across
14
+ # method calls.
15
+ #
16
+ # @see Platform
17
+ # @return [Platform]
18
+ def platform
19
+ @_platform ||= Platform.new
20
+ end
21
+
22
+ # Returns a command instance. Caches the instance across method
23
+ # calls.
24
+ #
25
+ # @see Commands
26
+ # @return [Commands]
27
+ def command
28
+ @_command ||= Commands.new
29
+ end
30
+
31
+ # Returns an operating system instance. Caches the instance
32
+ # across method calls.
33
+ #
34
+ # @see OperatingSystem
35
+ # @return [OperatingSystem]
36
+ def operating_system
37
+ @_operating_system ||= OperatingSystem.new
38
+ end
39
+
40
+ # Returns a file system instance. Caches the instance across
41
+ # method calls.
42
+ #
43
+ # @see FileSystem
44
+ # @return [FileSystem]
45
+ def file_system
46
+ @_file_system ||= FileSystem.new
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,44 @@
1
+ require 'command/runner'
2
+
3
+ module Nova
4
+ module Remote
5
+ class Fake
6
+
7
+ # Manages running commands.
8
+ #
9
+ # @abstract
10
+ class Commands
11
+
12
+ # Creates a CommandLine with its default runner.
13
+ #
14
+ # @abstract
15
+ # @note Does nothing. Since we're a fake remote, we'll
16
+ # overwrite the backend with a fake one.
17
+ # @see https://github.com/redjazz96/command-runner
18
+ # @param command [String] the command to run.
19
+ # @param arguments [String] the arguments to be passed to the
20
+ # command.
21
+ # @return [Command::Runner] the runner.
22
+ def line(command, arguments = "", options = {})
23
+ options.merge! :logger => Nova.logger
24
+ c = Command::Runner.new(command, arguments, options)
25
+ c.backend = Command::Runner::Backends::Fake.new
26
+ c
27
+ end
28
+
29
+ # Checks to see if the command exists.
30
+ #
31
+ # @abstract
32
+ # @note Does nothing. Always returns false since this is the
33
+ # fake remote.
34
+ # @param command [String] the command to check the existance
35
+ # of.
36
+ # @return [Boolean]
37
+ def command_exists?(command)
38
+ false
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,76 @@
1
+ module Nova
2
+ module Remote
3
+ class Fake
4
+
5
+ # Handles filesystem stuff, like downloading files and
6
+ # decompressing ifles.
7
+ class FileSystem
8
+ # Grabs the file from file and puts it somewhere else. If
9
+ # it's a local file (checked by #file_exists?), it just copies
10
+ # it. If it's not, it opens a connection to the server to try
11
+ # to download the file.
12
+ #
13
+ # @note Does nothing.
14
+ # @abstract
15
+ # @param file [String] the file to download. Can be a path
16
+ # name or URI.
17
+ # @param options [Hash{Symbol => Object}] the options for
18
+ # grabbing the files.
19
+ # @option options [String] :to the file to save to. If this
20
+ # doesn't exist, it's guessed from the file name.
21
+ # @option options [Boolean, String] :decompress the file after
22
+ # saving it. If it's a string, the decompressed file is
23
+ # extracted there. Otherwise, it's guessed from the
24
+ # filename.
25
+ # @return [Boolean]
26
+ def grab_file(file, options = {})
27
+ false
28
+ end
29
+
30
+ # Checks to see if the file exists on the file system.
31
+ #
32
+ # @note Does nothing.
33
+ # @abstract
34
+ # @param file [String] the file to check.
35
+ # @return [Boolean]
36
+ def file_exists?(file)
37
+ false
38
+ end
39
+
40
+ # Decompress the given file, to the given directory.
41
+ #
42
+ # @note Does nothing.
43
+ # @abstract
44
+ # @param file [String] the file to decompress.
45
+ # @param to [String] the directory to decompress to.
46
+ # @return [void]
47
+ def decompress_file(file, to)
48
+ end
49
+
50
+ private
51
+
52
+ # Untars the given file.
53
+ #
54
+ # @note Does nothing.
55
+ # @abstract
56
+ # @return [void]
57
+ def untar_file(f, to)
58
+ end
59
+
60
+ # Unzips the file.
61
+ #
62
+ # @note Does nothing.
63
+ # @abstract
64
+ def unzip_file(f, to)
65
+ end
66
+
67
+ # Unrars the given file.
68
+ #
69
+ # @note Does nothing.
70
+ # @abstract
71
+ def unrar_file(f, to)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,52 @@
1
+ module Nova
2
+ module Remote
3
+ class Fake
4
+
5
+ # Handles operating system tasks like installing packages or
6
+ # creating users.
7
+ #
8
+ # @abstract
9
+ class OperatingSystem
10
+
11
+ # Creates a user with the given name and options.
12
+ #
13
+ # @abstract
14
+ # @note Does nothing. As such, it always returns false.
15
+ # @param name [String, Symbol] the name of the user.
16
+ # @param options [Hash<Symbol, Object>] the options for the
17
+ # user.
18
+ # @option options [Boolean] :system whether or not the user is
19
+ # a system user. Defaults to +false+.
20
+ # @option options [Boolean] :nologin whether or not the user
21
+ # is able to log in. Defaults to +false+.
22
+ # @option options [String] :password the user's password.
23
+ # Defaults to +nil+.
24
+ # @return [Boolean] whether or not the user creation was
25
+ # successful.
26
+ def create_user(name, options = {})
27
+ false
28
+ end
29
+
30
+ # Installs packages for the corresponding operating system.
31
+ #
32
+ # @abstract
33
+ # @note Does nothing. As such, it always returns false.
34
+ # @param packages [Hash<Symbol, Array<String>>] the symbol is
35
+ # the name of the OS, the array is the packages to install
36
+ # for that OS.
37
+ # @option packages [Array<String>] :ubuntu the packages to
38
+ # install for debian-based OSs (Ubuntu, Debian, Mint).
39
+ # @option packages [Array<String>] :red_hat the packages to
40
+ # install for red hat-based OSs (REHL, Fedora, CentOS).
41
+ # @option packages [Array<String>] :arch the packages to
42
+ # install for arch.
43
+ # @return [Boolean] whether or not the package installation
44
+ # was successful.
45
+ def install_packages(packages)
46
+ false
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,89 @@
1
+ module Nova
2
+ module Remote
3
+ class Fake
4
+
5
+ # The platform information.
6
+ #
7
+ # @abstract
8
+ class Platform
9
+
10
+ # The list of platforms that this platform matches.
11
+ #
12
+ # @abstract
13
+ # @note Since this is a Fake remote, it defaults to none.
14
+ # @return [Array<Symbol>] the platform list.
15
+ def types
16
+ []
17
+ end
18
+
19
+ # Tries to determine the platform version, but if it can't, it
20
+ # defaults to nil.
21
+ #
22
+ # @abstract
23
+ # @note Since this is a Fake remote, it defaults to nil.
24
+ # @return [nil, String]
25
+ def version
26
+ nil
27
+ end
28
+
29
+ # True for linux? or osx?
30
+ # @api public
31
+ # @see OS#posix?
32
+ # @return [Boolean]
33
+ def posix?; false; end
34
+
35
+ # True if the OS is based on the linux kernel, false for
36
+ # windows, OSX, or cygwin.
37
+ # @api public
38
+ # @see OS#linux?
39
+ # @return [Boolean]
40
+ def linux?; false; end
41
+
42
+ # True if the OS is OSX, false for linux, windows, or cygwin.
43
+ # @see OS#osx?
44
+ # @api public
45
+ # @return [Boolean]
46
+ def osx?; false; end
47
+
48
+ # True if the OS is Windows or jruby?, false for linux or
49
+ # windows.
50
+ # @api public
51
+ # @see OS#windows?
52
+ # @return [Boolean]
53
+ def windows?; false; end
54
+
55
+ # True if the ruby is based on the JRuby implementation.
56
+ # @api public
57
+ # @see OS#jruby?
58
+ # @return [Boolean]
59
+ def jruby?; false; end
60
+
61
+ # True if the ruby is based on the Iron Ruby implementation.
62
+ # @api public
63
+ # @see OS#iron_ruby?
64
+ # @return [Boolean]
65
+ def iron_ruby?; false; end
66
+
67
+ # True if ruby is running with cygwin.
68
+ # @api public
69
+ # @see OS#cygwin?
70
+ # @return [Boolean]
71
+ def cygwin?; false; end
72
+
73
+ # The number of bits the processor can handle.
74
+ # @api public
75
+ # @see OS#bits
76
+ # @return [Numeric]
77
+ def bits; 32; end
78
+
79
+ # Where /dev/null is located on the computer (/dev/null for
80
+ # anything but Windows, NUL for Windows).
81
+ # @api public
82
+ # @see OS#dev_null
83
+ # @return [String]
84
+ def dev_null; "/dev/null"; end
85
+
86
+ end
87
+ end
88
+ end
89
+ end
data/lib/nova/star.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'nova/common'
2
+ require 'nova/remote/fake'
3
+
4
+ module Nova
5
+
6
+ # This binds together all of our default includes.
7
+ class Star
8
+
9
+ include Common::EventHandler
10
+ include Common::Metadata
11
+ include Common::StarManagement
12
+ include Common::Features
13
+
14
+ star_type :star
15
+
16
+ # @!parse include Common::EventHandler::InstanceMethods
17
+ # @!parse extend Common::EventHandler::ClassMethods
18
+ # @!parse include Common::Metadata::InstanceMethods
19
+ # @!parse extend Common::Metadata::ClassMethods
20
+ # @!parse include Common::StarManagement::InstanceMethods
21
+ # @!parse extend Common::StarManagement::ClassMethods
22
+ # @!parse include Common::Features::InstanceMethods
23
+ # @!parse extend Common::Features::ClassMethods
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ module Nova
2
+
3
+ # The networking module of Nova. It's meant to be fast,
4
+ # secure, and cross-platform compatible.
5
+ module Starbound
6
+
7
+ autoload :Protocol, "nova/starbound/protocol"
8
+ autoload :Encryptor, "nova/starbound/encryptor"
9
+ autoload :Encryptors, "nova/starbound/encryptors"
10
+ autoload :Client, "nova/starbound/client"
11
+ autoload :Server, "nova/starbound/server"
12
+
13
+ end
14
+ end
@@ -0,0 +1,59 @@
1
+ require 'socket'
2
+
3
+ module Nova
4
+ module Starbound
5
+
6
+ # A client for Nova.
7
+ class Client
8
+
9
+ # The options that were passed to the client on initialization.
10
+ #
11
+ # @return [Hash]
12
+ attr_reader :options
13
+
14
+ # The underlying protocol that powers this client.
15
+ #
16
+ # @return [Protocol]
17
+ attr_reader :protocol
18
+
19
+ # The default options when dealing with this class.
20
+ DEFAULT_OPTIONS = {
21
+ :type => :tcp,
22
+ :host => "127.0.0.1",
23
+ :port => 2010
24
+ }
25
+
26
+ # Initialize with the given options.
27
+ #
28
+ # @param options [Hash]
29
+ def initialize(options = {})
30
+ @options = DEFAULT_OPTIONS.merge(options)
31
+ @protocol_options = (@options.delete(:protocol) || {}).dup
32
+ @protocol = Protocol.new @protocol_options.merge(:type => :client)
33
+ end
34
+
35
+ # Do the handshake with the server.
36
+ #
37
+ # @return [void]
38
+ def handshake
39
+ @protocol.socket = socket
40
+ @protocol.handshake
41
+ end
42
+
43
+ # Create the socket.
44
+ #
45
+ # @return [Object]
46
+ def socket
47
+ @_socket ||= case options[:type]
48
+ when :tcp
49
+ TCPSocket.new(options[:host], options[:port])
50
+ when :unix
51
+ UNIXSocket.new(options[:path])
52
+ when :pipe
53
+ options[:pipe]
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,134 @@
1
+ module Nova
2
+ module Starbound
3
+
4
+ # An encryptor is used to encrypt the data in the exchange for the
5
+ # starbound protocol.
6
+ #
7
+ # @abstract
8
+ class Encryptor
9
+
10
+ # @overload encryptor_name(name)
11
+ # Sets the encryptor's name. Used for negotiation of
12
+ # encryption protocols.
13
+ #
14
+ # @param name [String] the name of the encryptor.
15
+ # @return [void]
16
+ # @overload encryptor_name
17
+ # Gets the encryptor's name.
18
+ #
19
+ # @return [String]
20
+ def self.encryptor_name(name = nil)
21
+ if name
22
+ @encryptor_name = name
23
+ else
24
+ @encryptor_name
25
+ end
26
+ end
27
+
28
+ # Registers a subclass with the Encryptor class for use with the
29
+ # protocol.
30
+ #
31
+ # @param preference [Numeric] a number that is used to sort the
32
+ # encryptors by preference.
33
+ # @return [void]
34
+ def self.register!(preference)
35
+ @preference = preference
36
+ Encryptor.encryptors.push(self)
37
+ end
38
+
39
+ class << self
40
+
41
+ # The preference for this encryptor. Used to sort the
42
+ # encryptors.
43
+ #
44
+ # @return [Numeric]
45
+ attr_reader :preference
46
+ end
47
+
48
+ # The encryptors that are defined.
49
+ #
50
+ # @return [Array<Encryptor>]
51
+ def self.encryptors
52
+ @encryptors ||= []
53
+ end
54
+
55
+ # The encryptors, sorted by preference.
56
+ #
57
+ # @return [Array<Encryptor>]
58
+ def self.sorted_encryptors
59
+ encryptors.sort do |a, b|
60
+ b.preference <=> a.preference
61
+ end
62
+ end
63
+
64
+ # Whether or not this encryptor is available. Defaults to
65
+ # false.
66
+ #
67
+ # @return [Boolean]
68
+ def self.available?
69
+ false
70
+ end
71
+
72
+ # Returns whether or not this is a plaintext encryptor, or one
73
+ # equivalent. Defaults to false, so most encryptors shouldn't
74
+ # have to overwrite this.
75
+ #
76
+ # @return [Boolean]
77
+ def self.plaintext?
78
+ false
79
+ end
80
+
81
+ # The options. These are mostly use internally.
82
+ #
83
+ # @return [Hash<Symbol, Object>]
84
+ attr_reader :options
85
+
86
+ # Initialize the encryptor.
87
+ #
88
+ # @raise [NotImplementedError] if {.available?} returns false.
89
+ def initialize
90
+ @options = {}
91
+
92
+ unless self.class.available?
93
+ raise NotImplementedError,
94
+ "#{self.class.encryptor_name} is not avialable!"
95
+ end
96
+ end
97
+
98
+ # @!method encrypt(packet)
99
+ # Encrypts the given packet with the encryptor.
100
+ #
101
+ # @param packet [Packet] the packet to encrypt.
102
+ # @return [Packet] the encrypted packet.
103
+ # @!method decrypt(packet)
104
+ # Decrypts the given packet with the encryptor.
105
+ #
106
+ # @param packet [Packet] the packet to decrypt.
107
+ # @return [Packet] the decrypted packet.
108
+ # @!method private_key!
109
+ # Generates the private key for this encryptor.
110
+ #
111
+ # @return [void]
112
+ # @!method public_key
113
+ # Returns the public key to be sent to the other remote.
114
+ #
115
+ # @return [String]
116
+ # @!method other_public_key=(pub_key)
117
+ # Sets the public key of the other remote.
118
+ #
119
+ # @param pub_key [String] the public key of the remote.
120
+ # @return [void]
121
+ [:encrypt, :decrypt, :private_key!, :public_key,
122
+ :other_public_key=].each do |m|
123
+
124
+ define_method(m) do |*args|
125
+ raise NotImplementedError,
126
+ "tried to call #{m} on #{self.class.encryptor_name}"
127
+ end
128
+ end
129
+
130
+ end
131
+ end
132
+ end
133
+
134
+ require 'nova/starbound/encryptors'