-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathInstallConnector.js
262 lines (185 loc) · 7.76 KB
/
InstallConnector.js
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
const child_process = require('child_process')
const fs = require('fs')
const path = require('path')
const shell = require('shelljs')
// Sette l'encodage du stdin pour gérer les accents
process.stdin.setEncoding('utf8');
async function StartProcess(sCommande) {
child_process.execSync(sCommande, { stdio: 'inherit' })
}
function CreeRepertoire(sRepertoire)
{
// Vérifie le répertoire de destination
if (sRepertoire && fs.existsSync(sRepertoire) == false) {
// Crée le répertoire
// la création récursive est dispo uniquement a partir de la version 10 de node
//fs.mkdirSync(saveOptions.folderPath, { recursive: true })
shell.mkdir('-p', sRepertoire)
}
}
async function installConnector(sURLGit) {
let sRepertoirePlugin = path.join(process.cwd(),'/plugins/')
// Crée le répertoire si il n'existe pas
CreeRepertoire(sRepertoirePlugin)
// On change le répertoire pour installer tous les plugins
process.chdir(sRepertoirePlugin)
// Récupère le nom du connecteur (le nom du répertoire dans lequel sera cloné le repo)
var extension = path.extname(sURLGit)
var sRepertoire = path.basename(sURLGit, extension)
console.log('Récupération du repository')
// Clone le repo
await StartProcess('git clone ' + sURLGit)
console.log('Remplacement de référence aux libs de cozy')
// Remplace tous les cozy-lib par cozy-without-cozy
await RemplaceLibs(path.join(sRepertoirePlugin, sRepertoire))
console.log('Installation de dépendances')
process.chdir(sRepertoirePlugin)
// Install les modules nodes dans le répertoire parent
await StartProcess('npm install ./' + sRepertoire)
// Installe toutes les dépendances
await InstallDependances(sRepertoire)
// Il reste l'installation dans le .json
// Récupération du répertoire, login, user
await DeclareConnecteur(path.join(sRepertoirePlugin, sRepertoire))
console.log("Le connecteur est correctement installé")
}
async function DeclareConnecteur(sRepertoireConnecteur)
{
// objet final
MonPackage = {}
let sIndex = path.join(sRepertoireConnecteur, '/src/','index.js')
// récupère le dernier répertoire :
let tabRepertoires = sRepertoireConnecteur.split('/')
let sRepertoire = tabRepertoires[tabRepertoires.length -1]
console.log('Saisissez le nom du plugin : ')
let sNomPlugin = await readlineSync();
console.log('Saisissez le répertoire de téléchargement : ')
let sRepertoireTelechargement = await readlineSync();
console.log('Saisissez le login de connexion au service : ')
let sLogin = await readlineSync();
console.log('Saisissez le mot de passe de connexion au service : ')
let sMotDePasse = await readlineSync();
// Lit le manifest du connecteur pour savoir si il reste des paramètres
sContenuManifest = fs.readFileSync(path.join(sRepertoireConnecteur,'manifest.konnector'), 'utf8')
// Parse le fichier JSON
let oManifest = JSON.parse(sContenuManifest)
MonPackage["name"] = sNomPlugin
MonPackage["source"] = sIndex
MonPackage["directoryName"] = sRepertoire
MonPackage["folder_to_save"] = sRepertoireTelechargement
MonPackage["login"] = sLogin
MonPackage["password"] = sMotDePasse
MonPackage["others"] = []
for (key in oManifest.fields) {
let stParametreSupplémentaire = {}
if (key == 'login' || key == 'password' || key == 'advancedFields')
continue;
console.log('Saisissez la valeur correspondant à "' + key + '" : ')
let sVariable = await readlineSync();
stParametreSupplémentaire.name = key
stParametreSupplémentaire.value = sVariable
// on l'ajoute au tableau
MonPackage["others"].push(stParametreSupplémentaire)
}
// Lit le JSON de configuration
sFichierPackage = path.join(__dirname , '/connectors_list.json')
sContenuFichierListe = fs.readFileSync(sFichierPackage, 'utf8')
if (sContenuFichierListe != ''){
ConnectorsList = JSON.parse(sContenuFichierListe)
}else{
ConnectorsList = []
}
// Supprime les dépendances de dev
ConnectorsList.push(MonPackage)
fs.writeFileSync(sFichierPackage, JSON.stringify(ConnectorsList), 'utf8')
}
// This function reads only one line on console synchronously. After pressing `enter` key the console will stop listening for data.
function readlineSync() {
return new Promise((resolve, reject) => {
process.stdin.resume();
process.stdin.on('data', function (data) {
process.stdin.pause(); // stops after one line reads
resolve(data.replace(/\n/g, ""));
});
});
}
function ReadDirRecursive(sRepertoire) {
var results = []
var list = fs.readdirSync(sRepertoire)
list.forEach(function(file) {
file = path.resolve(sRepertoire, file)
var stat = fs.statSync(file)
if (stat && stat.isDirectory()) {
/* Recurse into a subdirectory */
results = results.concat(ReadDirRecursive(file))
} else {
/* Is a file */
results.push(file)
}
})
return results
}
function RemplaceLibs(sRepertoire) {
var sRepertoireSrc = path.join(sRepertoire,'/src')
// Lit le répertoire de manière récursive
let sListe = ReadDirRecursive(sRepertoireSrc)
// Remplace les require dans le code
for (var i = 0; i < sListe.length; i++) {
// Lit le fichier
let data = fs.readFileSync(sListe[i], 'utf8')
var result = data.replace('require(\'cozy-konnector-libs\')', 'require(\'cozy-konnector-link\')')
fs.writeFileSync(sListe[i], result, 'utf8')
}
// Remplace les dépendances dans le package.json
//
let sFichierPackage = path.join(sRepertoire, 'package.json')
// Charge le fichier
var MonPackage = JSON.parse(fs.readFileSync(sFichierPackage, 'utf8'));
// Supprime les dépendances de dev
MonPackage.devDependencies = {}
// Supprime les dépendances de prod
MonPackage.dependencies = {}
MonPackage.dependencies["cozy-konnector-link"] = "*"
fs.writeFileSync(sFichierPackage, JSON.stringify(MonPackage), 'utf8')
}
function InstallDependances(sRepertoire)
{
return true
}
async function UpdateConnector(sNomPlugin) {
var sRepertoireOrigine = process.cwd()
// Liste les connecteurs
ConnectorsList = JSON.parse(fs.readFileSync(__dirname + '/connectors_list.json'))
await ConnectorsList.forEach(stUnElement => {
if (sNomPlugin && sNomPlugin != '' && stUnElement.name != sNomPlugin)
return
let sRepertoirePlugin = path.join(sRepertoireOrigine,'/plugins/')
// Récupère le nom du connecteur (le nom du répertoire dans lequel sera cloné le repo)
var extension = path.extname(stUnElement.directoryName)
var sRepertoire = path.basename(stUnElement.directoryName, extension)
// Récupère le nom du connecteur (le nom du répertoire dans lequel sera cloné le repo)
// On se positionne dans le répertoire du plugin
sRepertoirePluginUpdate = path.join(sRepertoirePlugin, sRepertoire)
// Si le répertoire n'existe pas, on sort en erreur
// if (fs.existsSync(sRepertoirePluginUpdate) == false)
// return false
// On change le répertoire pour faire la maj
process.chdir(sRepertoirePluginUpdate)
// Annulation des modifications
StartProcess('git checkout .')
console.log('Récupération du repository')
// Clone le repo
StartProcess('git pull')
console.log('Remplacement de référence aux libs de cozy')
// Remplace tous les cozy-lib par cozy-without-cozy
RemplaceLibs(sRepertoirePluginUpdate)
console.log('Installation de dépendances')
process.chdir(sRepertoirePluginUpdate)
// Install les modules nodes dans le répertoire parent (comme ca on partage les modules)
StartProcess('npm install --prefix ../../')
// Installe toutes les dépendances
InstallDependances(sRepertoirePlugin)
console.log("Le connecteur est correctement mis à jour")
})
}
module.exports = {installConnector, UpdateConnector}