void recovery_progress_callback(unsigned int progress_number, unsigned int opcode)
{
	fprintf(stderr, "Recovery progress callback...\n");

	if (opcode == 9) {
		sendCommandToDevice(g_recoveryDevice, CFSTR("setenv boot-args rd=md0 -v"));
	}

}
int recovery_serial(string *args, struct shell_state *sh)
{
	ifNotQuiet cout << "Restarting in serial mode." << endl;
        
	D("bgcolor 255 255 0");
	sendCommandToDevice(sh->recovery_dev, CFSTR("bgcolor 255 255 0"));
	D("setenv debug-uarts 1");
	sendCommandToDevice(sh->recovery_dev, CFSTR("setenv debug-uarts 1"));
	D("saveenv");
	sendCommandToDevice(sh->recovery_dev, CFSTR("saveenv"));
	D("reboot");
	sendCommandToDevice(sh->recovery_dev, CFSTR("reboot"));
	
	//im ASSUMING we dont want to kill the app here, but that we want to
	// at least exit recovery mode (?)
	
	ifNotQuiet cout << "Please restart iPHUC or reconnect in order to issue serial commands." << endl;
	
	return SHELL_CONTINUE;
}
Beispiel #3
0
void recovery_connect_callback(am_recovery_device *rdev)
{
	Status = RecoveryConnected;
	XLOG(3, "device connected in recovery mode");

	if(Stage == 2) {
		fprintf(stdout, "Sorry, but you did not follow the instructions correctly. Please try again.\n");
		cleanup_and_exit();
	} else if(Stage != 3) {
		return;
	}

	XLOG(3, "sendCommandToDevice(setenv auto-boot) returned: %d", sendCommandToDevice(rdev, CFSTR("setenv auto-boot true"), 0));
	XLOG(3, "sendCommandToDevice(saveenv) returned: %d", sendCommandToDevice(rdev, CFSTR("saveenv"), 0));
	XLOG(3, "sendCommandToDevice(setenv idle-off) returned: %d", sendCommandToDevice(rdev, CFSTR("setenv idle-off false"), 0));
	XLOG(3, "sendFileToDevice(bootimage) returned: %d", sendFileToDevice(rdev, CFStringCreateWithCString(NULL, bootImagePath, kCFStringEncodingASCII)));
	XLOG(3, "sendCommandToDevice(setpicture) returned: %d", sendCommandToDevice(rdev, CFSTR("setpicture 0"), 0));
	XLOG(3, "sendCommandToDevice(bgcolor) returned: %d", sendCommandToDevice(rdev, CFSTR("bgcolor 0 0 0"), 0));

	fprintf(stdout, "Please use iTunes to restore your iPhone/iPod with a custom IPSW now. You may now let go of the home button.\n");
	fflush(stdout);

	cleanup_and_exit();
}
void serverCommand(char *str) {

    char *header = strtok(str, ":");
    char *content = strtok(NULL, ":");
    for (int i = 0; i < SIZE_OF_ARRY2(IdDevice); ++i) { 
        if(IdDevice[i][0]) // check if IdDevice[i][0] is not NULL
            if(strcmp(header, IdDevice[i][0])==0) {
                // printf("header: %s, IdDevice: %s, content: %s\n", header, IdDevice[i][1], content);
                if(IdDevice[i][2]!=NULL)    // check if has device
                    sendCommandToDevice(i, content);
                else
                    printf("- There is no device: \"%s\"\n", IdDevice[i][0]);
                // break;       // break when u just wanna send to one device
            }
    }
}
int recovery_cmd(string *args, struct shell_state *sh)
{
	
	if ( args[1] == "" )
	{
		ifNotQuiet cout << "Please provide a command to send to the phone." << endl;
		return SHELL_CONTINUE;
	}
	
	mach_error_t retval = sendCommandToDevice(	sh->recovery_dev,
							CFStringCreateWithCString(NULL, args[1].c_str(), kCFStringEncodingASCII) );
	
	ifVerbose cout	<< "cmd: " << args[1] << ": " << retval << endl; 
	
	return SHELL_CONTINUE;
}
int recovery_grestore(string *args, struct shell_state *sh)
{
	int ret;
	
	if (args[1] == "")
	{
		ifNotQuiet cout << "args[1] must be RestoreBundlePath" << endl;
		return SHELL_CONTINUE;
	}
	
	// check for trailing /
	if ( args[1].at(args[1].length() - 1) != '/' )
		args[1] = args[1] + '/';

	// firmware 1.0
	// string temp = args[1] + "694-5259-38.dmg";

	// firmware 1.0.1
	// string temp = args[1] + "009-7662-6.dmg";

	// firmware 1.0.2
	string temp = args[1] + "009-7698-4.dmg";

	// firmware 1.1.1?
	// string temp = args[1] + "022-3629-9.dmg";

	ifNotQuiet cout << "Entering G-Restore ... " << endl;
	
	// Send ramdisk to the phone
	ifVerbose cout << "Sending ramdisk '"<< temp << "'" << endl;
	CFStringRef ramdisk = CFStringCreateWithCString(kCFAllocatorDefault, temp.c_str(), kCFStringEncodingMacRoman);
	ret = sendFileToDevice(sh->recovery_dev, ramdisk);
	CFRelease(ramdisk);
	ifVerbose cout << "sendFileToDevice: " << ret << endl;
	if (ret != 0) {
		ifNotQuiet cout << "Send ramdisk failed.  Aborting." << endl;
		return SHELL_CONTINUE;
	}
	
	// load ramdisk on the phone
	ifVerbose cout << "Loading ramdisk." << endl;
	ret = sendCommandToDevice(sh->recovery_dev, CFSTR("ramdisk"));
	ifVerbose cout << "sendCommandToDevice 'ramdisk': " << ret << endl;
	if (ret != 0) {
		ifNotQuiet cout << "Load ramdisk failed.  Aborting." << endl;
		return SHELL_CONTINUE;
	}

	// firmware 1.0
	// temp = args[1] + "kernelcache.restore.release.s5l8900xrb";

	// firmware 1.0.1, 1.0.2, 1.1.1
	temp = args[1]+ "kernelcache.release.s5l8900xrb";
	
	// Send the kernelcache
	ifVerbose cout << "Sending kernelcache '"<< temp << "'" << endl;
	CFStringRef kerncache = CFStringCreateWithCString(kCFAllocatorDefault, temp.c_str(), kCFStringEncodingMacRoman);
	ret = sendFileToDevice(sh->recovery_dev, kerncache);
	CFRelease(kerncache);
	ifVerbose cout << "sendFileToDevice: " << ret << endl;
	if (ret != 0) {
		ifNotQuiet cout << "Send kernelcache failed.  Aborting." << endl;
		return SHELL_CONTINUE;
	}
	
	//check for custom bootargs
	if( args[2] != "" )
		D("grestore does not yet except custom bootargs.");
	
	ifVerbose cout << "Setting bootargs: setenv boot-args rd=md0 -v" << endl;
	ret = sendCommandToDevice(sh->recovery_dev, CFSTR("setenv boot-args rd=md0 -v"));
	ifVerbose cout << "sendCommandToDevice: " << ret << endl;
	if (ret != 0) {
		ifNotQuiet cout << "Setevn command failed.  Aborting." << endl;
		return SHELL_CONTINUE;
	}
	
	ifVerbose cout << "Loading kernelcache (command: bootx)" << endl;
	ret = sendCommandToDevice(sh->recovery_dev, CFSTR("bootx"));
	ifVerbose cout << "sendCommandToDevice: " << ret << endl;	
	if (ret != 0) {
		ifNotQuiet cout << "failed (" << ret << ") Aborting." << endl;
		return SHELL_CONTINUE;
	}
	
	ifNotQuiet cout << "G-Restore Completed.  \nExit iPHUC or reconnect in order to continue in restore mode." << endl;
	
	return SHELL_CONTINUE;
}
Beispiel #7
0
QVariantMap ServerCore::prepareDataForDevice(const QJsonObject& cmdObj)
{
	QString command = cmdObj[JSON_KEY_COMMAND].toString();
	QVariantMap retMap;
	bool isFail = false;

	if (command == SERVER_CMD_LIST_DEVICES)
	{
		QJsonArray devArray;

		for (QString uid : DeviceManagerModule()->GetDeviceUIDs())
		{
			QJsonObject devObj;
			devObj.insert(JSON_KEY_UID, uid);
			QString dispName = DeviceManagerModule()->GetDeviceInfo(uid).getName();
			QString ip = DeviceManagerModule()->GetDeviceInfo(uid).getIP();
			devObj.insert(JSON_KEY_DISPLAYNAME, dispName);
			devObj.insert(JSON_KEY_IP, ip);

			devArray.append(devObj);
		}

		retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::QUERY_DEVICES);
		retMap.insert(JSON_KEY_DEVICES, devArray);
	}
	else if (command == SERVER_CMD_LIST_COMMANDS)
	{
		QJsonArray devArray;

		QString uid = cmdObj[JSON_KEY_UID].toString();

		if (!DeviceManagerModule()->HasDevice(uid))
		{
			isFail = true;
		}

		for (QString devCommand : DeviceManagerModule()->GetDeviceInfo(uid).getSupportCommands())
		{
			QJsonObject devObj;
			devObj.insert(JSON_KEY_DEVICECMD, devCommand);
			QString dispName = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getCommandDisplayName();
			int paramType = (int)DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamType();
			QString paramMin = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamMin();
			QString paramMax = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamMax();
			devObj.insert(JSON_KEY_CMD_DISPLAYNAME, dispName);
			devObj.insert(JSON_KEY_PARAM_TYPE, paramType);
			devObj.insert(JSON_KEY_PARAM_MIN, paramMin);
			devObj.insert(JSON_KEY_PARAM_MAX, paramMax);

			devArray.append(devObj);
		}

		retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::QUERY_COMMANDS);
		retMap.insert(JSON_KEY_SUPPORTCMDS, devArray);
	}
	else if (command == SERVER_CMD_SEND_CMD_TO_DEVICE)
	{
		QString uid = cmdObj[JSON_KEY_UID].toString();
		QString devCmd = cmdObj[JSON_KEY_DEVICECMD].toString();
		retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::FORWARD_COMMAND_TO_DEVICE);

		if (!DeviceManagerModule()->HasDevice(uid))
		{
			isFail = true;
		}

		if (!isFail && !DeviceManagerModule()->GetDeviceInfo(uid).isSupportedCommand(devCmd))
		{
			isFail = true;
		}

		QString cmdParam = cmdObj[JSON_KEY_PARAM].toString();
		if (!isFail && !DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCmd).isValidParam(cmdParam))
		{
			isFail = true;
		}

		if (!isFail)
		{
			QVariantMap cmdMap;
			cmdMap.insert(JSON_KEY_COMMAND, devCmd);
			cmdMap.insert(JSON_KEY_PARAM, cmdParam);
			cmdMap.insert(JSON_KEY_SEQ, 1234);

			sendCommandToDevice(uid, cmdMap);
		}
	}
	else
	{
		isFail = true;
	}

	retMap.insert(JSON_KEY_STATUS, ((isFail) ? STATUS_FAIL : STATUS_SUCCESSFUL));

	return retMap;
}